<?xml version="1.0" encoding="UTF-8"?>
<robot generator="Robot 7.4.2 (Python 3.11.10 on linux)" generated="2026-04-17T03:10:23.226310" 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-04-17T03:10:23.789389" 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-04-17T03:10:23.788615" elapsed="0.000837"/>
</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-04-17T03:10:23.793117" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:10:23.793215" 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-04-17T03:10:23.792599" elapsed="0.000646"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:23.793403" elapsed="0.000397"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:10:23.794927" level="INFO">Logging into '10.30.170.120:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:10:24.122017" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 17 03:10:22 UTC 2026

  System load:  0.2                Processes:             122
  Usage of /:   10.4% of 77.35GB   Users logged in:       0
  Memory usage: 2%                 IPv4 address for ens3: 10.30.170.120
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


[?2004h[jenkins@releng-26932-188-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-04-17T03:10:23.794339" elapsed="0.327855"/>
</kw>
<msg time="2026-04-17T03:10:24.122304" 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-04-17T03:10:23.793982" elapsed="0.328417"/>
</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-04-17T03:10:23.792039" elapsed="0.330481"/>
</kw>
<msg time="2026-04-17T03:10:24.122577" 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-04-17T03:10:23.791234" elapsed="0.331399"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-17T03:10:23.790351" elapsed="0.332386"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-04-17T03:10:24.122801" elapsed="0.000049"/>
</return>
<msg time="2026-04-17T03:10:24.123049" 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-04-17T03:10:23.787994" elapsed="0.335084"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-04-17T03:10:24.130448" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-04-17T03:10:24.139154" 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-04-17T03:10:24.123287" elapsed="0.015960"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:10:24.139466" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="not (${tools_system_connect})">
<return>
<status status="NOT RUN" start="2026-04-17T03:10:24.140247" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:24.140030" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:24.139988" elapsed="0.000358"/>
</if>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:24.146921" 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-04-17T03:10:24.146277" elapsed="0.000720"/>
</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-04-17T03:10:24.149640" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:10:24.149762" 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-04-17T03:10:24.149180" elapsed="0.000617"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:24.150033" elapsed="0.000358"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:10:24.151300" level="INFO">Logging into '10.30.171.238:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:10:24.937724" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 17 03:10:24 UTC 2026

  System load:  0.0                Processes:             108
  Usage of /:   19.3% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.238
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


[?2004h[jenkins@releng-26932-188-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-04-17T03:10:24.150887" elapsed="0.787173"/>
</kw>
<msg time="2026-04-17T03:10:24.938160" 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-04-17T03:10:24.150542" elapsed="0.787713"/>
</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-04-17T03:10:24.148494" elapsed="0.789894"/>
</kw>
<msg time="2026-04-17T03:10:24.938443" 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-04-17T03:10:24.147769" elapsed="0.790723"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-17T03:10:24.147250" elapsed="0.791318"/>
</kw>
<return>
<value>${tools_connection}</value>
<status status="PASS" start="2026-04-17T03:10:24.938626" elapsed="0.000047"/>
</return>
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-04-17T03:10:24.145725" elapsed="0.793099"/>
</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-04-17T03:10:23.782328" elapsed="1.156564"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:10:24.939681" level="INFO">Creating Session using : alias=config-session, url=http://10.30.170.120:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a4427142890&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-04-17T03:10:24.939192" elapsed="0.000769"/>
</kw>
<kw name="Deploy_Test_Tool" owner="NexusKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:10:24.957239" level="INFO">${name_prefix} = bgp-bmp-mock-</msg>
<var>${name_prefix}</var>
<arg>${artifact}-</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:10:24.956776" elapsed="0.000497"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:10:24.957836" 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-04-17T03:10:24.957439" elapsed="0.000424"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:10:24.958448" 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-04-17T03:10:24.958032" elapsed="0.000443"/>
</kw>
<kw name="Deploy_Artifact" owner="NexusKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_url}""" != ""</arg>
<arg>Deploy_From_Url</arg>
<arg>${explicit_url}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:24.959836" elapsed="0.000345"/>
</kw>
<kw name="Fetch From Left" owner="String">
<msg time="2026-04-17T03:10:24.960637" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot</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-04-17T03:10:24.960411" elapsed="0.000253"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:10:24.961218" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot</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-04-17T03:10:24.960805" elapsed="0.000440"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Magnesium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:24.978680" elapsed="0.000493"/>
</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-04-17T03:10:24.978236" elapsed="0.001028"/>
</kw>
<msg time="2026-04-17T03:10:24.979320" 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-04-17T03:10:24.970359" elapsed="0.009032"/>
</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-04-17T03:10:24.969908" elapsed="0.009563"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Aluminium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:24.995984" elapsed="0.000468"/>
</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-04-17T03:10:24.995482" elapsed="0.001054"/>
</kw>
<msg time="2026-04-17T03:10:24.996591" 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-04-17T03:10:24.987885" elapsed="0.008776"/>
</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-04-17T03:10:24.987374" elapsed="0.009366"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Silicon" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:25.013377" elapsed="0.000462"/>
</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-04-17T03:10:25.012916" elapsed="0.001006"/>
</kw>
<msg time="2026-04-17T03:10:25.013997" 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-04-17T03:10:25.005059" elapsed="0.009005"/>
</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-04-17T03:10:25.004646" elapsed="0.009496"/>
</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-04-17T03:10:25.017005" elapsed="0.000276"/>
</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-04-17T03:10:25.017759" elapsed="0.000198"/>
</kw>
<msg time="2026-04-17T03:10:25.018011" 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-04-17T03:10:25.017424" elapsed="0.000639"/>
</kw>
<msg time="2026-04-17T03:10:25.018171" 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-04-17T03:10:25.016645" elapsed="0.001550"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:25.018487" level="INFO">index=2
host=10.30.171.238
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-04-17T03:10:25.018596" level="INFO">${current_ssh_connection} = index=2
host=10.30.171.238
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-04-17T03:10:25.018340" elapsed="0.000283"/>
</kw>
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:25.022999" 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-04-17T03:10:25.022528" elapsed="0.000498"/>
</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-04-17T03:10:25.024751" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:10:25.024831" 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-04-17T03:10:25.024454" elapsed="0.000400"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:25.025030" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:10:25.026638" level="INFO">Logging into '10.30.170.120:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:10:25.340347" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 17 03:10:22 UTC 2026

  System load:  0.2                Processes:             122
  Usage of /:   10.4% of 77.35GB   Users logged in:       0
  Memory usage: 2%                 IPv4 address for ens3: 10.30.170.120
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:10:24 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:10:25.025854" elapsed="0.314745"/>
</kw>
<msg time="2026-04-17T03:10:25.340720" 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-04-17T03:10:25.025520" elapsed="0.315321"/>
</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-04-17T03:10:25.024016" elapsed="0.317030"/>
</kw>
<msg time="2026-04-17T03:10:25.341125" 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-04-17T03:10:25.023498" elapsed="0.317699"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-17T03:10:25.023191" elapsed="0.318375"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-04-17T03:10:25.341655" elapsed="0.000080"/>
</return>
<doc>Open a connection to the ODL system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-04-17T03:10:25.022238" elapsed="0.319730"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:10:25.342821" level="INFO">Executing command 'sh search.sh /tmp/karaf-0.23.1-SNAPSHOT/system pcep-impl'.</msg>
<msg time="2026-04-17T03:10:25.356218" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-17T03:10:25.356643" level="INFO">${version} = Path '/tmp/karaf-0.23.1-SNAPSHOT/system' does not exist or is not a directory</msg>
<msg time="2026-04-17T03:10:25.356755" level="INFO">${result} = 1</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-04-17T03:10:25.342342" elapsed="0.014471"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:10:25.357354" elapsed="0.000776"/>
</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-04-17T03:10:25.364510" elapsed="0.000224"/>
</kw>
<msg time="2026-04-17T03:10:25.364814" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:25.363624" elapsed="0.001287"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:25.365147" elapsed="0.000032"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:25.365350" elapsed="0.000029"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:10:25.358814" elapsed="0.006657"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:25.366053" level="INFO">Path '/tmp/karaf-0.23.1-SNAPSHOT/system' does not exist or is not a directory</msg>
<arg>${version}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:25.365654" elapsed="0.000464"/>
</kw>
<if>
<branch type="IF" condition="${result}!=0">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:10:25.367217" level="FAIL">Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</msg>
<arg>Component "${component}": searching for "${itemlist}" found no version, cannot locate test tool.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:10:25.366603" elapsed="0.000765">Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</status>
</kw>
<status status="FAIL" start="2026-04-17T03:10:25.366289" elapsed="0.001195">Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</status>
</branch>
<status status="FAIL" start="2026-04-17T03:10:25.366211" elapsed="0.001332">Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</status>
</if>
<kw name="Split String" owner="String">
<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="NOT RUN" start="2026-04-17T03:10:25.367754" elapsed="0.000031"/>
</kw>
<return>
<value>${version}</value>
<value>${location}</value>
<status status="NOT RUN" start="2026-04-17T03:10:25.367867" elapsed="0.000029"/>
</return>
<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="FAIL" start="2026-04-17T03:10:25.016291" elapsed="0.351794">Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</status>
</kw>
<status status="FAIL" start="2026-04-17T03:10:25.014243" elapsed="0.353956">Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</status>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${version}</var>
<var>${location}</var>
<arg>${build_version}</arg>
<arg>${build_location}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:25.368439" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:10:25.368246" elapsed="0.000278"/>
</branch>
<status status="FAIL" start="2026-04-17T03:10:25.014211" elapsed="0.354348">Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</status>
</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-04-17T03:10:25.368843" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:10:25.368667" elapsed="0.000256"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:10:25.368642" elapsed="0.000339"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:10:25.369170" elapsed="0.000029"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:10:25.369393" elapsed="0.000028"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:10:25.369621" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${url}</var>
<arg>${urlbase}/${location}/${artifact}/${version}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:25.369839" elapsed="0.000028"/>
</kw>
<kw name="Execute_Command_Should_Pass" owner="SSHKeywords">
<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="NOT RUN" start="2026-04-17T03:10:25.370162" elapsed="0.000035"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${namepart}</var>
<arg>SSHKeywords.Execute_Command_Should_Pass</arg>
<arg>echo "${metadata}" | grep value | head -n 1 | cut -d '&gt;' -f 2 | cut -d '&lt;' -f 1</arg>
<arg>stderr_must_be_empty=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:25.370530" elapsed="0.000029"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${length}</var>
<arg>${namepart}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:25.370752" elapsed="0.000027"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:10:25.371009" elapsed="0.000035"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${filename}</var>
<arg>${name_prefix}${namepart}${name_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:25.371240" elapsed="0.000029"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${filename}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:25.371447" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${url}</var>
<arg>${url}/${filename}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:25.371641" elapsed="0.000027"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<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="NOT RUN" start="2026-04-17T03:10:25.371864" elapsed="0.000028"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${response}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:25.372100" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="${result} == 0">
<return>
<value>${filename}</value>
<status status="NOT RUN" start="2026-04-17T03:10:25.372275" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:25.372220" elapsed="0.000115"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:10:25.372195" elapsed="0.000170"/>
</if>
<kw name="Replace String Using Regexp" owner="String">
<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="NOT RUN" start="2026-04-17T03:10:25.372536" elapsed="0.000029"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<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="NOT RUN" start="2026-04-17T03:10:25.372752" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="${result} != 0">
<kw name="Fail" owner="BuiltIn">
<arg>Artifact "${artifact}" in component "${component}" could not be downloaded from ${release_url} nor ${url}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:25.373078" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:10:25.372877" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:10:25.372854" elapsed="0.000331"/>
</if>
<return>
<value>${filename}</value>
<status status="NOT RUN" start="2026-04-17T03:10:25.373230" elapsed="0.000021"/>
</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/opendaylight.snapshot/org/opendaylight/integration/karaf/0.23.1-SNAPSHOT/karaf-.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-04-17T03:10:24.959127" elapsed="0.414256">Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</status>
</kw>
<return>
<value>${filename}</value>
<status status="NOT RUN" start="2026-04-17T03:10:25.373496" elapsed="0.000023"/>
</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-04-17T03:10:24.951478" elapsed="0.422163">Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</status>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${filename}</arg>
<arg>${name}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:25.373867" elapsed="0.000029"/>
</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-04-17T03:10:23.781543" elapsed="1.592505">Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</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-04-17T03:10:25.374191" elapsed="0.000734">Parent suite setup failed:
Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</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-04-17T03:10:25.375269" elapsed="0.000443">Parent suite setup failed:
Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</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-04-17T03:10:25.375988" elapsed="0.000450">Parent suite setup failed:
Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</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-04-17T03:10:25.376679" elapsed="0.000648">Parent suite setup failed:
Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</status>
</test>
<kw name="Tear_It_Down" type="TEARDOWN">
<kw name="Get File" owner="SSHLibrary">
<msg time="2026-04-17T03:10:25.391102" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-04-17T03:10:25.397476" 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-04-17T03:10:25.378598" elapsed="0.021034">There were no source files matching 'bmpmock.log'.</status>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:10:25.400613" 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-04-17T03:10:25.400899" level="INFO">${cnt} = None</msg>
<msg time="2026-04-17T03:10:25.401003" 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-04-17T03:10:25.400220" elapsed="0.000885">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-04-17T03:10:25.402195" level="INFO">None</msg>
<arg>${cnt}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:25.401697" elapsed="0.000581"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-17T03:10:25.402657" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-17T03:10:25.402492" elapsed="0.000298"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-04-17T03:10:25.403018" elapsed="0.000472"/>
</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-04-17T03:10:25.378185" elapsed="0.025531">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-04-17T03:10:23.268430" elapsed="2.135420">Suite setup failed:
Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.

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-04-17T03:10:25.483350" 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-04-17T03:10:25.482688" elapsed="0.000704"/>
</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-04-17T03:10:25.485419" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:10:25.485505" 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-04-17T03:10:25.485043" elapsed="0.000487"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:25.485680" elapsed="0.000587"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:10:25.487354" level="INFO">Logging into '10.30.170.120:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:10:25.846471" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 17 03:10:22 UTC 2026

  System load:  0.2                Processes:             122
  Usage of /:   10.4% of 77.35GB   Users logged in:       0
  Memory usage: 2%                 IPv4 address for ens3: 10.30.170.120
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:10:25 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:10:25.486775" elapsed="0.359950"/>
</kw>
<msg time="2026-04-17T03:10:25.846840" 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-04-17T03:10:25.486424" elapsed="0.360547"/>
</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-04-17T03:10:25.484548" elapsed="0.362577"/>
</kw>
<msg time="2026-04-17T03:10:25.847180" 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-04-17T03:10:25.484024" elapsed="0.363205"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-17T03:10:25.483640" elapsed="0.363697"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-04-17T03:10:25.847406" elapsed="0.000060"/>
</return>
<msg time="2026-04-17T03:10:25.847825" 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-04-17T03:10:25.482315" elapsed="0.365537"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-04-17T03:10:25.859190" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-04-17T03:10:25.866322" 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-04-17T03:10:25.848146" elapsed="0.018264"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:10:25.866641" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="not (${tools_system_connect})">
<return>
<status status="NOT RUN" start="2026-04-17T03:10:25.867356" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:25.867141" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:25.867098" elapsed="0.000337"/>
</if>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:25.873656" 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-04-17T03:10:25.872920" elapsed="0.000779"/>
</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-04-17T03:10:25.876551" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:10:25.876687" 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-04-17T03:10:25.876093" elapsed="0.000630"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:25.876991" elapsed="0.000575"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:10:25.878585" level="INFO">Logging into '10.30.171.238:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:10:26.255089" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 17 03:10:24 UTC 2026

  System load:  0.0                Processes:             108
  Usage of /:   19.3% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.238
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:10:24 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:10:25.878248" elapsed="0.377076"/>
</kw>
<msg time="2026-04-17T03:10:26.255435" 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-04-17T03:10:25.877809" elapsed="0.377735"/>
</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-04-17T03:10:25.875368" elapsed="0.380322"/>
</kw>
<msg time="2026-04-17T03:10:26.255746" 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-04-17T03:10:25.874579" elapsed="0.381268"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-17T03:10:25.874011" elapsed="0.381936"/>
</kw>
<return>
<value>${tools_connection}</value>
<status status="PASS" start="2026-04-17T03:10:26.256022" elapsed="0.000058"/>
</return>
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-04-17T03:10:25.872307" elapsed="0.383937"/>
</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-04-17T03:10:25.478435" elapsed="0.777868"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:10:26.257034" level="INFO">Creating Session using : alias=session, url=http://10.30.170.120:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a4425802a50&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-04-17T03:10:26.256571" elapsed="0.000741"/>
</kw>
<kw name="Deploy_Test_Tool" owner="NexusKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:10:26.274423" level="INFO">${name_prefix} = pcep-pcc-mock-</msg>
<var>${name_prefix}</var>
<arg>${artifact}-</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:10:26.273902" elapsed="0.000560"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:10:26.275087" 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-04-17T03:10:26.274645" elapsed="0.000469"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:10:26.275693" 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-04-17T03:10:26.275295" elapsed="0.000424"/>
</kw>
<kw name="Deploy_Artifact" owner="NexusKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_url}""" != ""</arg>
<arg>Deploy_From_Url</arg>
<arg>${explicit_url}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:26.277146" elapsed="0.000319"/>
</kw>
<kw name="Fetch From Left" owner="String">
<msg time="2026-04-17T03:10:26.278011" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot</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-04-17T03:10:26.277749" elapsed="0.000290"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:10:26.278582" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot</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-04-17T03:10:26.278184" elapsed="0.000425"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Magnesium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:26.295703" elapsed="0.000528"/>
</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-04-17T03:10:26.295263" elapsed="0.001098"/>
</kw>
<msg time="2026-04-17T03:10:26.296446" 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-04-17T03:10:26.287306" elapsed="0.009225"/>
</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-04-17T03:10:26.286875" elapsed="0.009737"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Aluminium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:26.314699" elapsed="0.000591"/>
</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-04-17T03:10:26.314040" elapsed="0.001353"/>
</kw>
<msg time="2026-04-17T03:10:26.315455" 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-04-17T03:10:26.305691" elapsed="0.009843"/>
</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-04-17T03:10:26.305207" elapsed="0.010408"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Silicon" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:26.332674" elapsed="0.000479"/>
</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-04-17T03:10:26.332184" elapsed="0.001058"/>
</kw>
<msg time="2026-04-17T03:10:26.333312" 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-04-17T03:10:26.324126" elapsed="0.009258"/>
</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-04-17T03:10:26.323730" elapsed="0.009735"/>
</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-04-17T03:10:26.336256" elapsed="0.000392"/>
</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-04-17T03:10:26.337169" elapsed="0.000186"/>
</kw>
<msg time="2026-04-17T03:10:26.337402" 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-04-17T03:10:26.336798" elapsed="0.000657"/>
</kw>
<msg time="2026-04-17T03:10:26.337568" 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-04-17T03:10:26.335985" elapsed="0.001607"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:26.337902" level="INFO">index=2
host=10.30.171.238
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-04-17T03:10:26.338031" level="INFO">${current_ssh_connection} = index=2
host=10.30.171.238
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-04-17T03:10:26.337739" elapsed="0.000320"/>
</kw>
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:26.342655" 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-04-17T03:10:26.342216" elapsed="0.000465"/>
</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-04-17T03:10:26.344328" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:10:26.344441" 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-04-17T03:10:26.344013" elapsed="0.000452"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:26.344605" elapsed="0.000350"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:10:26.346313" level="INFO">Logging into '10.30.170.120:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:10:26.684685" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 17 03:10:22 UTC 2026

  System load:  0.2                Processes:             122
  Usage of /:   10.4% of 77.35GB   Users logged in:       0
  Memory usage: 2%                 IPv4 address for ens3: 10.30.170.120
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:10:25 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:10:26.345444" elapsed="0.339515"/>
</kw>
<msg time="2026-04-17T03:10:26.685080" 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-04-17T03:10:26.345105" elapsed="0.340096"/>
</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-04-17T03:10:26.343569" elapsed="0.341784"/>
</kw>
<msg time="2026-04-17T03:10:26.685411" 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-04-17T03:10:26.343177" elapsed="0.342285"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-17T03:10:26.342845" elapsed="0.342701"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-04-17T03:10:26.685615" elapsed="0.000073"/>
</return>
<doc>Open a connection to the ODL system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-04-17T03:10:26.341915" elapsed="0.343965"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:10:26.686608" level="INFO">Executing command 'sh search.sh /tmp/karaf-0.23.1-SNAPSHOT/system pcep-impl'.</msg>
<msg time="2026-04-17T03:10:26.700165" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-17T03:10:26.700525" level="INFO">${version} = Path '/tmp/karaf-0.23.1-SNAPSHOT/system' does not exist or is not a directory</msg>
<msg time="2026-04-17T03:10:26.700641" level="INFO">${result} = 1</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-04-17T03:10:26.686182" elapsed="0.014531"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:10:26.701236" elapsed="0.000664"/>
</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-04-17T03:10:26.707276" elapsed="0.000220"/>
</kw>
<msg time="2026-04-17T03:10:26.707559" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:26.705984" elapsed="0.001663"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:26.707852" elapsed="0.000040"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:26.708088" elapsed="0.000028"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:10:26.702629" elapsed="0.005575"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:26.708829" level="INFO">Path '/tmp/karaf-0.23.1-SNAPSHOT/system' does not exist or is not a directory</msg>
<arg>${version}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:26.708411" elapsed="0.000483"/>
</kw>
<if>
<branch type="IF" condition="${result}!=0">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:10:26.710116" level="FAIL">Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</msg>
<arg>Component "${component}": searching for "${itemlist}" found no version, cannot locate test tool.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:10:26.709371" elapsed="0.000930">Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</status>
</kw>
<status status="FAIL" start="2026-04-17T03:10:26.709060" elapsed="0.001423">Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</status>
</branch>
<status status="FAIL" start="2026-04-17T03:10:26.709016" elapsed="0.001548">Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</status>
</if>
<kw name="Split String" owner="String">
<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="NOT RUN" start="2026-04-17T03:10:26.711073" elapsed="0.000033"/>
</kw>
<return>
<value>${version}</value>
<value>${location}</value>
<status status="NOT RUN" start="2026-04-17T03:10:26.711176" elapsed="0.000023"/>
</return>
<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="FAIL" start="2026-04-17T03:10:26.335611" elapsed="0.375712">Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</status>
</kw>
<status status="FAIL" start="2026-04-17T03:10:26.333581" elapsed="0.377826">Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</status>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${version}</var>
<var>${location}</var>
<arg>${build_version}</arg>
<arg>${build_location}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:26.711621" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:10:26.711447" elapsed="0.000255"/>
</branch>
<status status="FAIL" start="2026-04-17T03:10:26.333543" elapsed="0.378190">Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</status>
</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-04-17T03:10:26.711988" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:10:26.711825" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:10:26.711805" elapsed="0.000269"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:10:26.712220" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:10:26.712385" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:10:26.712543" elapsed="0.000019"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${url}</var>
<arg>${urlbase}/${location}/${artifact}/${version}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:26.712697" elapsed="0.000019"/>
</kw>
<kw name="Execute_Command_Should_Pass" owner="SSHKeywords">
<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="NOT RUN" start="2026-04-17T03:10:26.712917" elapsed="0.000044"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${namepart}</var>
<arg>SSHKeywords.Execute_Command_Should_Pass</arg>
<arg>echo "${metadata}" | grep value | head -n 1 | cut -d '&gt;' -f 2 | cut -d '&lt;' -f 1</arg>
<arg>stderr_must_be_empty=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:26.713117" elapsed="0.000020"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${length}</var>
<arg>${namepart}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:26.713278" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:10:26.713431" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${filename}</var>
<arg>${name_prefix}${namepart}${name_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:26.713583" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${filename}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:26.713730" elapsed="0.000019"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${url}</var>
<arg>${url}/${filename}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:26.713873" elapsed="0.000023"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<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="NOT RUN" start="2026-04-17T03:10:26.714088" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${response}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:26.714248" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${result} == 0">
<return>
<value>${filename}</value>
<status status="NOT RUN" start="2026-04-17T03:10:26.714368" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:26.714332" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:10:26.714314" elapsed="0.000116"/>
</if>
<kw name="Replace String Using Regexp" owner="String">
<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="NOT RUN" start="2026-04-17T03:10:26.714599" elapsed="0.000029"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<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="NOT RUN" start="2026-04-17T03:10:26.714788" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="${result} != 0">
<kw name="Fail" owner="BuiltIn">
<arg>Artifact "${artifact}" in component "${component}" could not be downloaded from ${release_url} nor ${url}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:26.715027" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:10:26.714883" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:10:26.714866" elapsed="0.000238"/>
</if>
<return>
<value>${filename}</value>
<status status="NOT RUN" start="2026-04-17T03:10:26.715136" elapsed="0.000015"/>
</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/opendaylight.snapshot/org/opendaylight/integration/karaf/0.23.1-SNAPSHOT/karaf-.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-04-17T03:10:26.276488" elapsed="0.438791">Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</status>
</kw>
<return>
<value>${filename}</value>
<status status="NOT RUN" start="2026-04-17T03:10:26.715363" elapsed="0.000016"/>
</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-04-17T03:10:26.268418" elapsed="0.447047">Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</status>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${filename}</arg>
<arg>${name}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:26.715635" elapsed="0.000023"/>
</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-04-17T03:10:26.715861" elapsed="0.000030"/>
</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-04-17T03:10:25.477687" elapsed="1.238335">Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</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-04-17T03:10:26.716147" elapsed="0.000740">Parent suite setup failed:
Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</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-04-17T03:10:26.717262" elapsed="0.000981">Parent suite setup failed:
Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</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-04-17T03:10:26.718431" elapsed="0.000630">Parent suite setup failed:
Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</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-04-17T03:10:26.719255" elapsed="0.000605">Parent suite setup failed:
Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</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-04-17T03:10:26.720072" elapsed="0.000423">Parent suite setup failed:
Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</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-04-17T03:10:26.720730" elapsed="0.000576">Parent suite setup failed:
Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</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-04-17T03:10:26.721527" elapsed="0.000632">Parent suite setup failed:
Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</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-04-17T03:10:26.722387" elapsed="0.000540">Parent suite setup failed:
Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</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-04-17T03:10:26.723128" elapsed="0.000440">Parent suite setup failed:
Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</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-04-17T03:10:26.723745" elapsed="0.000468">Parent suite setup failed:
Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</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-04-17T03:10:26.724381" elapsed="0.000406">Parent suite setup failed:
Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</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-04-17T03:10:26.724985" elapsed="0.000789">Parent suite setup failed:
Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</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-04-17T03:10:26.725992" elapsed="0.000412">Parent suite setup failed:
Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</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-04-17T03:10:26.726667" elapsed="0.000529">Parent suite setup failed:
Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</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-04-17T03:10:26.727365" elapsed="0.000385">Parent suite setup failed:
Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</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-04-17T03:10:26.727913" elapsed="0.000410">Parent suite setup failed:
Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</status>
</test>
<kw name="Tear_It_Down" type="TEARDOWN">
<kw name="Get File" owner="SSHLibrary">
<msg time="2026-04-17T03:10:26.739586" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-04-17T03:10:26.747991" 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-04-17T03:10:26.729164" elapsed="0.019603">There were no source files matching 'pccmock.log'.</status>
</kw>
<kw name="Run" owner="OperatingSystem">
<msg time="2026-04-17T03:10:26.750923" level="INFO">Running command 'cat pccmock.log 2&gt;&amp;1'.</msg>
<msg time="2026-04-17T03:10:26.754822" 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
[http://robotframework.org/robotframework/latest/libraries/Process.html|
Process] library instead._</doc>
<status status="PASS" start="2026-04-17T03:10:26.749067" elapsed="0.005799"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:26.755608" 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-04-17T03:10:26.755140" elapsed="0.000533"/>
</kw>
<kw name="Teardown_Pcep_Operations" owner="PcepOperations">
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-17T03:10:26.756396" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-17T03:10:26.756290" elapsed="0.000241"/>
</kw>
<doc>Teardown to pair with Setup (otherwise no-op).</doc>
<status status="PASS" start="2026-04-17T03:10:26.755976" elapsed="0.000633"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-17T03:10:26.756980" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-17T03:10:26.756859" elapsed="0.000190"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-04-17T03:10:26.757251" elapsed="0.000471"/>
</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-04-17T03:10:26.728839" elapsed="0.029069">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-04-17T03:10:25.404867" elapsed="1.353246">Suite setup failed:
Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.

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-04-17T03:10:26.986584" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:10:26.982091" elapsed="0.004562"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-17T03:10:26.981831" elapsed="0.004901"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-17T03:10:26.991777" 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-04-17T03:10:26.988159" elapsed="0.003647"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-17T03:10:26.992092" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:26.991899" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:26.991872" elapsed="0.000298"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:10:26.992711" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:10:26.992334" elapsed="0.000425"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-17T03:10:26.993290" 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-04-17T03:10:26.992958" elapsed="0.000358"/>
</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-04-17T03:10:26.993854" elapsed="0.000340"/>
</kw>
<msg time="2026-04-17T03:10:26.994310" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:10:26.994358" level="INFO">${possibly_int_of_members} = 1</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:26.993496" elapsed="0.000884"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:10:26.994949" 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-04-17T03:10:26.994555" elapsed="0.000423"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:10:26.996130" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:10:26.995781" elapsed="0.000384"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:10:26.996723" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:10:26.996446" elapsed="0.000305"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:10:26.997240" 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-04-17T03:10:26.996914" elapsed="0.000354"/>
</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-04-17T03:10:27.000723" elapsed="0.000268"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:10:27.001494" level="INFO">${member_ip} = 10.30.170.120</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:10:27.001159" elapsed="0.000361"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:10:27.001679" elapsed="0.000337"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:10:27.002816" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:10:27.002516" elapsed="0.000328"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-17T03:10:27.002891" elapsed="0.000055"/>
</return>
<msg time="2026-04-17T03:10:27.003076" 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-04-17T03:10:27.002215" elapsed="0.000886"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:10:27.003725" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.120:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a442573e790&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-04-17T03:10:27.003262" elapsed="0.000626"/>
</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-04-17T03:10:27.004107" elapsed="0.000199"/>
</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-04-17T03:10:27.000148" elapsed="0.004217"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:10:26.999900" elapsed="0.004509"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-04-17T03:10:26.997338" elapsed="0.007108"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:10:27.005044" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:10:27.004613" elapsed="0.000476"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:10:27.005666" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.120'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:10:27.005253" elapsed="0.000455"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:10:27.006318" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:10:27.005872" elapsed="0.000490"/>
</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-04-17T03:10:26.995323" elapsed="0.011097"/>
</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-04-17T03:10:26.987773" elapsed="0.018702"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:10:27.006657" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:27.006540" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:27.006522" elapsed="0.000200"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:10:27.010098" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:10:27.009661" elapsed="0.000465"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:10:27.010593" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:10:27.010290" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:10:27.010664" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:10:27.010823" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:10:27.009305" elapsed="0.001543"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:10:27.011895" level="INFO">${member_ip} = 10.30.170.120</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-04-17T03:10:27.011620" elapsed="0.000301"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:27.012904" 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-04-17T03:10:27.013035" 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-04-17T03:10:27.012691" elapsed="0.000372"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:27.017574" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:10:27.016888" elapsed="0.000782"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:27.016866" elapsed="0.000851"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:27.018410" 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-04-17T03:10:27.018657" 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-04-17T03:10:27.017929" elapsed="0.000782"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:27.019678" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.120" 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-04-17T03:10:27.019001" elapsed="0.000781"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:27.021051" 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-04-17T03:10:27.020094" elapsed="0.001007"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-17T03:10:27.022817" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:10:27.023015" 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-04-17T03:10:27.022457" elapsed="0.000602"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:27.023397" elapsed="0.000457"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:10:27.025253" level="INFO">Logging into '10.30.170.120:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:10:27.337327" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 17 03:10:22 UTC 2026

  System load:  0.2                Processes:             122
  Usage of /:   10.4% of 77.35GB   Users logged in:       0
  Memory usage: 2%                 IPv4 address for ens3: 10.30.170.120
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:10:26 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:10:27.024781" elapsed="0.312703"/>
</kw>
<msg time="2026-04-17T03:10:27.337576" 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-04-17T03:10:27.024333" elapsed="0.313394"/>
</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-04-17T03:10:27.021542" elapsed="0.316375"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:10:27.338892" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-17T03:10:27.352025" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-17T03:10:27.352420" level="INFO">${stdout} = </msg>
<msg time="2026-04-17T03:10:27.352653" 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-04-17T03:10:27.338359" elapsed="0.014426"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:10:27.353529" elapsed="0.001183"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:27.356559" 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-04-17T03:10:27.355698" elapsed="0.001020"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-17T03:10:27.357471" elapsed="0.000075"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:27.357013" elapsed="0.000642"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:27.356966" elapsed="0.000744"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:10:27.358212" elapsed="0.000084"/>
</return>
<status status="PASS" start="2026-04-17T03:10:27.357824" elapsed="0.000579"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:27.357800" elapsed="0.000656"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-17T03:10:27.358536" elapsed="0.000022"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:27.390852" elapsed="0.000553"/>
</kw>
<kw name="Open 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-04-17T03:10:27.391696" elapsed="0.000352"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:10:27.392311" elapsed="0.000229"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:10:27.359243" elapsed="0.033368"/>
</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-04-17T03:10:27.015789" elapsed="0.376999"/>
</kw>
<msg time="2026-04-17T03:10:27.392849" 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-04-17T03:10:27.015125" elapsed="0.377786"/>
</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-04-17T03:10:27.014612" elapsed="0.378408"/>
</kw>
<msg time="2026-04-17T03:10:27.393062" 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-04-17T03:10:27.013226" elapsed="0.379882"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:27.396173" elapsed="0.000320"/>
</kw>
<kw name="Open 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-04-17T03:10:27.396659" elapsed="0.000144"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:10:27.397024" elapsed="0.000297"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:10:27.393598" elapsed="0.003780"/>
</kw>
<msg time="2026-04-17T03:10:27.397477" 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-04-17T03:10:27.012277" elapsed="0.385224"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:27.397986" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:27.397694" elapsed="0.000347"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-17T03:10:27.398090" elapsed="0.000036"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-17T03:10:27.011250" elapsed="0.387057"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:10:27.011067" elapsed="0.387279"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:10:27.010907" elapsed="0.387480"/>
</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-04-17T03:10:27.006978" elapsed="0.391467"/>
</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-04-17T03:10:27.398599" elapsed="0.000216"/>
</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-04-17T03:10:27.412453" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:27.412332" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:27.412304" elapsed="0.000219"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:27.412830" 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-04-17T03:10:27.412966" 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-04-17T03:10:27.412681" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:27.413427" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:27.413164" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:27.413866" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:27.413623" elapsed="0.000367"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:10:27.414851" 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-04-17T03:10:27.414576" elapsed="0.000453">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-17T03:10:27.415147" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:10:27.415193" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:27.414151" elapsed="0.001064"/>
</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-04-17T03:10:27.415516" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:10:27.415291" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:27.415273" elapsed="0.000341"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:10:27.416591" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:10:27.416135" elapsed="0.000483"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:10:27.416669" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:10:27.416826" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:10:27.415821" elapsed="0.001030"/>
</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-04-17T03:10:27.417028" elapsed="0.000428"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:27.417741" level="INFO">index=4
host=10.30.170.120
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-04-17T03:10:27.417845" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.120
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-04-17T03:10:27.417629" elapsed="0.000243"/>
</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-04-17T03:10:27.418042" elapsed="0.002172"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:10:27.420651" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:10:27.421925" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:10:27.420379" elapsed="0.002413">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:27.426045" elapsed="0.000408"/>
</kw>
<kw name="Open 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-04-17T03:10:27.426627" elapsed="0.000168"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:10:27.426972" elapsed="0.000116"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:10:27.423755" elapsed="0.003388"/>
</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-04-17T03:10:27.423170" elapsed="0.004021"/>
</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="FAIL" start="2026-04-17T03:10:27.412014" elapsed="0.015275">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:10:28.461818" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:28.461669" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:28.461640" elapsed="0.000273"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:28.462323" 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-04-17T03:10:28.462447" 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-04-17T03:10:28.462135" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:28.462978" 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-04-17T03:10:28.462638" elapsed="0.000389"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:28.463631" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:28.463306" elapsed="0.000374"/>
</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-04-17T03:10:28.464756" elapsed="0.000282"/>
</kw>
<msg time="2026-04-17T03:10:28.465368" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:10:28.465424" level="INFO">${old_connection_index} = 4</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:28.463851" elapsed="0.001599"/>
</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-04-17T03:10:28.466368" elapsed="0.000150"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:10:28.467323" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:10:28.467119" elapsed="0.000806">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:28.466742" elapsed="0.001299"/>
</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-04-17T03:10:28.468626" elapsed="0.000112"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:28.468228" elapsed="0.000558"/>
</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-04-17T03:10:28.465806" elapsed="0.003032"/>
</kw>
<status status="PASS" start="2026-04-17T03:10:28.465542" elapsed="0.003361"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:28.465518" elapsed="0.003445"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:10:28.470118" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:10:28.469527" elapsed="0.000620"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:10:28.470201" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:10:28.470371" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:10:28.469216" elapsed="0.001180"/>
</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-04-17T03:10:28.470554" elapsed="0.000455"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:28.471303" level="INFO">index=6
host=10.30.170.120
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-04-17T03:10:28.471449" level="INFO">${karaf_connection_object} = index=6
host=10.30.170.120
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-04-17T03:10:28.471183" elapsed="0.000298"/>
</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-04-17T03:10:28.471684" elapsed="0.002402"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:10:28.474526" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:10:28.476128" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:10:28.474256" elapsed="0.002269">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:28.479674" 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-04-17T03:10:28.480285" elapsed="0.000194"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:10:28.480650" elapsed="0.000106"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:10:28.477453" elapsed="0.003357"/>
</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-04-17T03:10:28.476849" elapsed="0.004008"/>
</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="FAIL" start="2026-04-17T03:10:28.461233" elapsed="0.019731">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:10:29.507210" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:29.506905" elapsed="0.000427"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:29.506855" elapsed="0.000528"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:29.508166" 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-04-17T03:10:29.508412" 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-04-17T03:10:29.507769" elapsed="0.000702"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:29.509472" level="INFO">{1: 6}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:29.508815" elapsed="0.000756"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:29.510482" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:29.509912" elapsed="0.000666"/>
</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-04-17T03:10:29.511870" elapsed="0.000344"/>
</kw>
<msg time="2026-04-17T03:10:29.512319" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:10:29.512365" level="INFO">${old_connection_index} = 6</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:29.510964" elapsed="0.001425"/>
</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-04-17T03:10:29.513257" elapsed="0.000144"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:10:29.514106" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:10:29.513904" elapsed="0.000730">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:29.513570" elapsed="0.001127"/>
</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-04-17T03:10:29.515236" elapsed="0.000146"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:29.514869" elapsed="0.000571"/>
</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-04-17T03:10:29.512711" elapsed="0.002788"/>
</kw>
<status status="PASS" start="2026-04-17T03:10:29.512470" elapsed="0.003079"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:29.512449" elapsed="0.003128"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:10:29.516424" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:10:29.516149" elapsed="0.000301"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:10:29.516501" elapsed="0.000256"/>
</return>
<msg time="2026-04-17T03:10:29.516890" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:10:29.515810" elapsed="0.001105"/>
</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-04-17T03:10:29.517091" elapsed="0.000423"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:29.517815" level="INFO">index=8
host=10.30.170.120
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-04-17T03:10:29.517917" level="INFO">${karaf_connection_object} = index=8
host=10.30.170.120
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-04-17T03:10:29.517702" elapsed="0.000258"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:10:29.518110" elapsed="0.002213"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:10:29.520747" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:10:29.522184" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:10:29.520486" elapsed="0.002142">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:29.525821" elapsed="0.000385"/>
</kw>
<kw name="Open 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-04-17T03:10:29.526373" elapsed="0.000164"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:10:29.526685" elapsed="0.000176"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:10:29.523583" elapsed="0.003332"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:10:29.522992" elapsed="0.003990"/>
</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="FAIL" start="2026-04-17T03:10:29.505778" elapsed="0.021294">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:10:30.546411" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:30.546261" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:30.546233" elapsed="0.000272"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:30.546897" 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-04-17T03:10:30.547042" 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-04-17T03:10:30.546704" elapsed="0.000365"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:30.547553" level="INFO">{1: 8}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:30.547236" elapsed="0.000363"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:30.548075" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:30.547800" elapsed="0.000322"/>
</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-04-17T03:10:30.548705" elapsed="0.000193"/>
</kw>
<msg time="2026-04-17T03:10:30.549028" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:10:30.549075" level="INFO">${old_connection_index} = 8</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:30.548293" elapsed="0.000806"/>
</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-04-17T03:10:30.549930" elapsed="0.000157"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:10:30.550777" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:10:30.550595" elapsed="0.000735">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:30.550262" elapsed="0.001148"/>
</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-04-17T03:10:30.552153" elapsed="0.000104"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:30.551593" elapsed="0.000711"/>
</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-04-17T03:10:30.549406" elapsed="0.002943"/>
</kw>
<status status="PASS" start="2026-04-17T03:10:30.549177" elapsed="0.003221"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:30.549158" elapsed="0.003265"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:10:30.553213" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:10:30.552922" elapsed="0.000317"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:10:30.553287" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:10:30.553659" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:10:30.552644" elapsed="0.001040"/>
</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-04-17T03:10:30.553842" elapsed="0.000436"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:30.554556" level="INFO">index=10
host=10.30.170.120
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-04-17T03:10:30.554657" level="INFO">${karaf_connection_object} = index=10
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:10:30.554449" elapsed="0.000233"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:10:30.554832" elapsed="0.002214"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:10:30.557559" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:10:30.558823" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:10:30.557213" elapsed="0.002071">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:30.562432" elapsed="0.000369"/>
</kw>
<kw name="Open 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-04-17T03:10:30.562985" elapsed="0.000156"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:10:30.563291" elapsed="0.000100"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:10:30.560252" elapsed="0.003193"/>
</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-04-17T03:10:30.559584" elapsed="0.003908"/>
</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="FAIL" start="2026-04-17T03:10:30.545785" elapsed="0.017792">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:10:30.563672" level="FAIL">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<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="FAIL" start="2026-04-17T03:10:27.399594" elapsed="3.164175">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:27.399218" elapsed="3.164669"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:10:27.399072" elapsed="3.164874"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-04-17T03:10:27.398878" elapsed="3.165118"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-17T03:10:26.987165" elapsed="3.576897"/>
</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-04-17T03:10:30.566683" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:30.566568" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:30.566548" elapsed="0.000204"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:10:30.571565" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:30.571456" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:30.571438" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:10:30.572639" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:10:30.572250" elapsed="0.000415"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:10:30.573141" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:10:30.572825" elapsed="0.000344"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:10:30.573240" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:10:30.573422" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:10:30.571894" elapsed="0.001553"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:10:30.578944" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:30.578819" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:30.578800" elapsed="0.000216"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:10:30.580266" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:30.580138" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:30.580119" elapsed="0.000215"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:10:30.580804" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:10:30.580480" elapsed="0.000350"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:30.581238" 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-04-17T03:10:30.581008" elapsed="0.000256"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:10:30.582519" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:10:30.582036" elapsed="0.001222">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:10:30.583402" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:10:30.583448" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:30.581475" elapsed="0.001996"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:10:30.584821" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:10:30.584261" elapsed="0.001382">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:10:30.585784" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:10:30.585830" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:30.583662" elapsed="0.002192"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:10:30.586864" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/bgp_functional_md5.robot"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:10:30.586193" elapsed="0.000773">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/bgp_functional_md5.robot"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:10:30.585947" elapsed="0.001160">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/bgp_functional_md5.robot"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:10:30.585910" elapsed="0.001233">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/bgp_functional_md5.robot"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:30.587310" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:30.587538" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:10:30.587397" elapsed="0.000290"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:10:30.587381" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:10:30.587756" 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>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:30.589797" elapsed="0.000471"/>
</kw>
<kw name="Open 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-04-17T03:10:30.590608" elapsed="0.000287"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:10:30.591251" elapsed="0.000364"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:10:30.589046" elapsed="0.002658"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:10:30.588127" elapsed="0.003711"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:10:30.579779" elapsed="0.012194">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/bgp_functional_md5.robot"</status>
</kw>
<msg time="2026-04-17T03:10:30.592081" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:10:30.592124" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/bgp_functional_md5.robot"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:30.579171" elapsed="0.012977"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:10:30.592332" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:30.592224" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:30.592206" elapsed="0.000190"/>
</if>
<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-04-17T03:10:30.593240" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:30.593135" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:30.593117" elapsed="0.000189"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:30.593597" 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-04-17T03:10:30.593701" 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-04-17T03:10:30.593462" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:30.594207" level="INFO">{1: 10}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:30.593943" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:30.594648" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:30.594406" elapsed="0.000284"/>
</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-04-17T03:10:30.595257" elapsed="0.000281"/>
</kw>
<msg time="2026-04-17T03:10:30.595639" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:10:30.595685" level="INFO">${old_connection_index} = 10</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:30.594849" elapsed="0.000859"/>
</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-04-17T03:10:30.596856" elapsed="0.000366"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:10:30.598495" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:10:30.598240" elapsed="0.000716">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:30.597455" elapsed="0.001593"/>
</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-04-17T03:10:30.600095" elapsed="0.000202"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:30.599292" elapsed="0.001080"/>
</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-04-17T03:10:30.596061" elapsed="0.004396"/>
</kw>
<status status="PASS" start="2026-04-17T03:10:30.595784" elapsed="0.004725"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:30.595766" elapsed="0.004768"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:10:30.601554" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:10:30.601102" elapsed="0.000478"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:10:30.601629" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:10:30.601785" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:10:30.600742" elapsed="0.001068"/>
</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-04-17T03:10:30.601981" elapsed="0.000412"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:30.602674" level="INFO">index=13
host=10.30.170.120
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-04-17T03:10:30.602775" level="INFO">${karaf_connection_object} = index=13
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:10:30.602567" elapsed="0.000234"/>
</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-04-17T03:10:30.603108" elapsed="0.002678"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:10:30.606237" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:10:30.607263" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:10:30.605971" elapsed="0.001672">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:30.610959" elapsed="0.000629"/>
</kw>
<kw name="Open 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-04-17T03:10:30.611835" elapsed="0.000447"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:10:30.612496" elapsed="0.000177"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:10:30.608618" elapsed="0.004137"/>
</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-04-17T03:10:30.607923" elapsed="0.004880"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:10:30.592790" elapsed="0.020097">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:30.613280" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:10:30.613354" 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="FAIL" start="2026-04-17T03:10:30.578521" elapsed="0.034938">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:10:30.613564" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:10:30.613607" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:30.573838" elapsed="0.039792"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:30.613976" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:10:30.613707" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:30.613688" elapsed="0.000369"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:10:30.573694" elapsed="0.040386"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:10:30.573506" elapsed="0.040610"/>
</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-04-17T03:10:30.571161" elapsed="0.043011"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-17T03:10:30.564666" elapsed="0.049561"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:30.564228" elapsed="0.050040"/>
</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-04-17T03:10:26.981479" elapsed="3.632840"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:30.614812" level="INFO">${tools_system_conn_id} = 15</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-04-17T03:10:30.614470" elapsed="0.000368"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:10:30.615369" level="INFO">${tools_system_conn_id} = 15</msg>
<arg>${tools_system_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:10:30.615030" elapsed="0.000380"/>
</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-04-17T03:10:30.617136" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:10:30.617213" 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-04-17T03:10:30.616847" elapsed="0.000389"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:30.617393" elapsed="0.000313"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:10:30.618556" level="INFO">Logging into '10.30.171.238:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:10:30.934282" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 17 03:10:24 UTC 2026

  System load:  0.0                Processes:             108
  Usage of /:   19.3% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.238
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:10:26 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:10:30.618243" elapsed="0.316195"/>
</kw>
<msg time="2026-04-17T03:10:30.934522" 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-04-17T03:10:30.617871" elapsed="0.316733"/>
</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-04-17T03:10:30.616414" elapsed="0.318302"/>
</kw>
<msg time="2026-04-17T03:10:30.934768" 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-04-17T03:10:30.616022" elapsed="0.318792"/>
</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-04-17T03:10:30.615608" elapsed="0.319282"/>
</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-04-17T03:10:30.941156" level="INFO">${cd_and_command} = cd '.' &amp;&amp; virtualenv /tmp/defaultvenv</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:10:30.940720" elapsed="0.000538"/>
</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-04-17T03:10:30.942757" level="INFO">Executing command 'cd '.' &amp;&amp; virtualenv /tmp/defaultvenv'.</msg>
<msg time="2026-04-17T03:10:31.436323" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:10:31.436752" level="INFO">${stdout} = created virtual environment CPython3.10.12.final.0-64 in 288ms
  creator CPython3Posix(dest=/tmp/defaultvenv, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=b...</msg>
<msg time="2026-04-17T03:10:31.436865" level="INFO">${stderr} = </msg>
<msg time="2026-04-17T03:10:31.437010" 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-04-17T03:10:30.942568" elapsed="0.494501"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:10:31.439541" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-04-17T03:10:31.438516" elapsed="0.001138"/>
</kw>
<msg time="2026-04-17T03:10:31.439881" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-04-17T03:10:31.440015" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:31.437575" elapsed="0.002494"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:10:31.441589" 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-04-17T03:10:31.440461" elapsed="0.001190"/>
</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-04-17T03:10:31.443917" level="INFO">created virtual environment CPython3.10.12.final.0-64 in 288ms
  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-04-17T03:10:31.443560" elapsed="0.000450"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:31.444565" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:31.444226" elapsed="0.000396"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:31.445195" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:31.444833" elapsed="0.000425"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-04-17T03:10:31.442886" elapsed="0.002451"/>
</kw>
<status status="PASS" start="2026-04-17T03:10:31.441844" elapsed="0.003546"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:31.441792" elapsed="0.003637"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-04-17T03:10:31.445656" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:31.445508" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:31.445485" elapsed="0.000267"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:10:31.445971" elapsed="0.000048"/>
</return>
<status status="PASS" start="2026-04-17T03:10:31.445824" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:31.445803" elapsed="0.000294"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:31.446304" elapsed="0.000029"/>
</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-04-17T03:10:30.942007" elapsed="0.504465"/>
</kw>
<msg time="2026-04-17T03:10:31.446555" 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-04-17T03:10:30.941432" elapsed="0.505196"/>
</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-04-17T03:10:30.940091" elapsed="0.506715"/>
</kw>
<msg time="2026-04-17T03:10:31.446903" 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-04-17T03:10:30.936263" elapsed="0.510743"/>
</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-04-17T03:10:30.935864" elapsed="0.511333"/>
</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-04-17T03:10:31.455501" level="INFO">${cd_and_command} = cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install --upgrade pip; deactivate</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:10:31.455159" elapsed="0.000371"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:10:31.457536" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install --upgrade pip; deactivate'.</msg>
<msg time="2026-04-17T03:10:33.818395" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:10:33.818974" level="INFO">${stdout} = Requirement already satisfied: pip in /tmp/defaultvenv/lib/python3.10/site-packages (22.0.2)
Collecting pip
  Downloading pip-26.0.1-py3-none-any.whl (1.8 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━...</msg>
<msg time="2026-04-17T03:10:33.819165" level="INFO">${stderr} = </msg>
<msg time="2026-04-17T03:10:33.819341" 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-04-17T03:10:31.457133" elapsed="2.362306"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:10:33.824645" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-04-17T03:10:33.823582" elapsed="0.001310"/>
</kw>
<msg time="2026-04-17T03:10:33.825295" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-04-17T03:10:33.825457" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:33.820242" elapsed="0.005364"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:10:33.827727" 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-04-17T03:10:33.826243" elapsed="0.001542"/>
</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-04-17T03:10:33.831505" level="INFO">Requirement already satisfied: pip in /tmp/defaultvenv/lib/python3.10/site-packages (22.0.2)
Collecting pip
  Downloading pip-26.0.1-py3-none-any.whl (1.8 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.8/1.8 MB 30.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.0.1</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:33.830888" elapsed="0.000764"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:33.832912" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:33.832205" elapsed="0.001003"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:33.834544" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:33.833975" elapsed="0.000684"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-04-17T03:10:33.829483" elapsed="0.005279"/>
</kw>
<status status="PASS" start="2026-04-17T03:10:33.828076" elapsed="0.006789"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:33.828038" elapsed="0.006857"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-04-17T03:10:33.835157" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:33.834972" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:33.834953" elapsed="0.000346"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:10:33.835520" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-17T03:10:33.835355" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:33.835339" elapsed="0.000345"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:33.835857" 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-04-17T03:10:31.456361" elapsed="2.379751"/>
</kw>
<msg time="2026-04-17T03:10:33.836174" 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-04-17T03:10:31.455694" elapsed="2.380538"/>
</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-04-17T03:10:31.454219" elapsed="2.382101"/>
</kw>
<msg time="2026-04-17T03:10:33.836375" 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-04-17T03:10:31.450165" elapsed="2.386258"/>
</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-04-17T03:10:31.449363" elapsed="2.387139"/>
</kw>
<msg time="2026-04-17T03:10:33.836612" 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-04-17T03:10:31.448794" elapsed="2.387864"/>
</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-04-17T03:10:31.448079" elapsed="2.388656"/>
</kw>
<msg time="2026-04-17T03:10:33.836778" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${upgrade_pip}</arg>
<arg>Virtual_Env_Run_Cmd_At_Cwd</arg>
<arg>pip install --upgrade pip</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:31.447431" elapsed="2.389390"/>
</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-04-17T03:10:30.935222" elapsed="2.901679"/>
</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-04-17T03:10:33.844944" level="INFO">${cd_and_command} = cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install setuptools==44.0.0; deactivate</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:10:33.844585" elapsed="0.000390"/>
</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-04-17T03:10:33.846900" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install setuptools==44.0.0; deactivate'.</msg>
<msg time="2026-04-17T03:10:35.026556" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:10:35.027176" 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-04-17T03:10:35.027310" level="INFO">${stderr} = </msg>
<msg time="2026-04-17T03:10:35.027418" 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-04-17T03:10:33.846526" elapsed="1.180953"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:10:35.031602" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-04-17T03:10:35.030682" elapsed="0.001083"/>
</kw>
<msg time="2026-04-17T03:10:35.032013" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-04-17T03:10:35.032081" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:35.028298" elapsed="0.003817"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:10:35.033736" 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-04-17T03:10:35.032478" elapsed="0.001297"/>
</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-04-17T03:10:35.037143" 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 12.5 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-04-17T03:10:35.036566" elapsed="0.000686"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:35.037973" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:35.037620" elapsed="0.000423"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:35.038671" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:35.038344" elapsed="0.000397"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-04-17T03:10:35.035189" elapsed="0.003627"/>
</kw>
<status status="PASS" start="2026-04-17T03:10:35.034003" elapsed="0.004908"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:35.033964" elapsed="0.004996"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-04-17T03:10:35.039179" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:35.039024" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:35.039006" elapsed="0.000298"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:10:35.039493" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-17T03:10:35.039360" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:35.039343" elapsed="0.000297"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:35.039794" elapsed="0.000024"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-04-17T03:10:33.845782" elapsed="1.194279"/>
</kw>
<msg time="2026-04-17T03:10:35.040193" 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-04-17T03:10:33.845140" elapsed="1.195113"/>
</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-04-17T03:10:33.843880" elapsed="1.196480"/>
</kw>
<msg time="2026-04-17T03:10:35.040451" 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-04-17T03:10:33.839743" elapsed="1.200759"/>
</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-04-17T03:10:33.839175" elapsed="1.201424"/>
</kw>
<msg time="2026-04-17T03:10:35.040653" 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-04-17T03:10:33.838487" elapsed="1.202213"/>
</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-04-17T03:10:33.838084" elapsed="1.202706"/>
</kw>
<msg time="2026-04-17T03:10:35.040837" 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-04-17T03:10:33.837619" elapsed="1.203264"/>
</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-04-17T03:10:33.837287" elapsed="1.203698"/>
</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-04-17T03:10:35.048609" level="INFO">${cd_and_command} = cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install exabgp==3.4.17; deactivate</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:10:35.048225" elapsed="0.000414"/>
</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-04-17T03:10:35.050520" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install exabgp==3.4.17; deactivate'.</msg>
<msg time="2026-04-17T03:10:37.020769" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:10:37.021352" 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-04-17T03:10:37.021476" 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-04-17T03:10:37.021587" 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-04-17T03:10:35.050153" elapsed="1.971489"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:10:37.026287" level="INFO">Length is 1821.</msg>
<msg time="2026-04-17T03:10:37.026969" 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-3hwf05dx/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-3hwf05dx/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-3hwf05dx/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-3hwf05dx/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())
        File "&lt;string&gt;", line 40
          print """\
          ^^^^^^^^^
      SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed to build 'exabgp' when getting requirements to build wheel' should be empty.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="FAIL" start="2026-04-17T03:10:37.025428" elapsed="0.001888">'  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-3hwf05dx/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-3hwf05dx/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-3hwf05dx/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-3hwf05dx/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())
        File "&lt;string&gt;", line 40
          print """\
          ^^^^^^^^^
      SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed to build 'exabgp' when getting requirements to build wheel' should be empty.</status>
</kw>
<msg time="2026-04-17T03:10:37.027698" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-04-17T03:10:37.027777" level="INFO">${result} = '  error: subprocess-exited-with-error
  
  × Getting requirements to build wheel did not run successfully.
  │ exit code: 1
  ╰─&gt; [19 lines of output]
      Traceback (most recent call last):
       ...</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:37.022378" elapsed="0.005439"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:10:37.029522" 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-04-17T03:10:37.028186" elapsed="0.001379"/>
</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-04-17T03:10:37.033080" 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-04-17T03:10:37.032527" elapsed="0.000665"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:37.033908" 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-3hwf05dx/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-3hwf05dx/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-3hwf05dx/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-3hwf05dx/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())
        File "&lt;string&gt;", line 40
          print """\
          ^^^^^^^^^
      SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed to build 'exabgp' when getting requirements to build wheel</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:37.033566" elapsed="0.000590"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:37.034813" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:37.034474" elapsed="0.000408"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-04-17T03:10:37.031077" elapsed="0.003899"/>
</kw>
<status status="PASS" start="2026-04-17T03:10:37.029785" elapsed="0.005287"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:37.029746" elapsed="0.005360"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-04-17T03:10:37.035330" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:37.035172" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:37.035153" elapsed="0.000302"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:10:37.035644" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-17T03:10:37.035511" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:37.035495" elapsed="0.000294"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:37.035957" elapsed="0.000023"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-04-17T03:10:35.049494" elapsed="1.986610"/>
</kw>
<msg time="2026-04-17T03:10:37.036164" 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-04-17T03:10:35.048806" elapsed="1.987413"/>
</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-04-17T03:10:35.047512" elapsed="1.988819"/>
</kw>
<msg time="2026-04-17T03:10:37.036409" 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-04-17T03:10:35.043598" elapsed="1.992864"/>
</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-04-17T03:10:35.042780" elapsed="1.993977"/>
</kw>
<msg time="2026-04-17T03:10:37.036856" 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-04-17T03:10:35.042381" elapsed="1.994524"/>
</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-04-17T03:10:35.041965" elapsed="1.995048"/>
</kw>
<msg time="2026-04-17T03:10:37.037058" 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-04-17T03:10:35.041536" elapsed="1.995566"/>
</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-04-17T03:10:35.041208" elapsed="1.995995"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:10:37.037704" level="INFO">Creating Session using : alias=session, url=http://10.30.170.120:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a44258d6650&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-04-17T03:10:37.037382" elapsed="0.000522"/>
</kw>
<kw name="Upload_Config_Files">
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-04-17T03:10:37.063132" level="INFO">[chan 5] Opened sftp connection (server version 3)</msg>
<msg time="2026-04-17T03:10:37.071060" 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-04-17T03:10:37.038719" elapsed="0.032564"/>
</kw>
<kw name="List Files In Directory" owner="SSHLibrary">
<msg time="2026-04-17T03:10:37.082597" level="INFO">1 file:
exa-md5.cfg</msg>
<msg time="2026-04-17T03:10:37.082791" 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-04-17T03:10:37.071779" elapsed="0.011050"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:10:37.083798" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.238/g' exa-md5.cfg'.</msg>
<msg time="2026-04-17T03:10:37.096000" 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-04-17T03:10:37.083494" elapsed="0.012647"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:10:37.097035" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.120/g' exa-md5.cfg'.</msg>
<msg time="2026-04-17T03:10:37.146214" 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-04-17T03:10:37.096591" elapsed="0.049753"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:10:37.146853" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exa-md5.cfg'.</msg>
<msg time="2026-04-17T03:10:37.198314" 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-04-17T03:10:37.146621" elapsed="0.052014"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:10:37.199623" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exa-md5.cfg'.</msg>
<msg time="2026-04-17T03:10:37.249833" 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-04-17T03:10:37.199192" elapsed="0.050862"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:10:37.251061" level="INFO">Executing command 'sed -i -e 's/PASSWORD/topsecret/g' exa-md5.cfg'.</msg>
<msg time="2026-04-17T03:10:37.297892" 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-04-17T03:10:37.250554" elapsed="0.047543"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:10:37.299057" level="INFO">Executing command 'cat exa-md5.cfg'.</msg>
<msg time="2026-04-17T03:10:37.346471" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:10:37.346802" level="INFO">${stdout} = neighbor 10.30.170.120 {
  router-id 10.30.171.238;
  local-address 10.30.171.238;
  local-as 64496;
  peer-as 64496;
  md5-password topsecret;

  capability {
    route-refresh disable;
    add-path ...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-17T03:10:37.298650" elapsed="0.048222"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:37.348336" level="INFO">neighbor 10.30.170.120 {
  router-id 10.30.171.238;
  local-address 10.30.171.238;
  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-04-17T03:10:37.347475" elapsed="0.001002"/>
</kw>
<var name="${cfgfile}">exa-md5.cfg</var>
<status status="PASS" start="2026-04-17T03:10:37.083263" elapsed="0.265305"/>
</iter>
<var>${cfgfile}</var>
<value>@{cfgfiles}</value>
<status status="PASS" start="2026-04-17T03:10:37.082969" elapsed="0.265688"/>
</for>
<doc>Uploads exabgp config files</doc>
<status status="PASS" start="2026-04-17T03:10:37.038262" elapsed="0.310551"/>
</kw>
<doc>Suite setup keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:26.981037" elapsed="10.368098"/>
</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-04-17T03:10:37.354779" level="INFO">&amp;{mapping} = { BGP_RIB_OPENCONFIG=example-bgp-rib | IP=10.30.171.238 | 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-04-17T03:10:37.352986" elapsed="0.001845"/>
</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-04-17T03:10:37.392476" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:10:37.392049" elapsed="0.000462"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:10:37.393380" 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-04-17T03:10:37.393083" elapsed="0.000374">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-04-17T03:10:37.393556" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:10:37.392690" elapsed="0.000891"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:10:37.394170" 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-04-17T03:10:37.393751" elapsed="0.000448"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:10:37.394512" 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-04-17T03:10:37.394685" 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-04-17T03:10:37.394364" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:37.395142" 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-04-17T03:10:37.394873" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:37.396260" level="INFO">mapping: {'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.171.238', '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-04-17T03:10:37.395979" elapsed="0.000329"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:10:37.396757" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:10:37.396473" elapsed="0.000310"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:10:37.397633" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:10:37.397247" elapsed="0.000414"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:10:37.398850" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:10:37.398204" elapsed="0.000676"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:10:37.398966" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:10:37.399139" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:10:37.397856" elapsed="0.001307"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:10:37.399322" elapsed="0.000243"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:10:37.397105" elapsed="0.002500"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:10:37.400218" level="INFO">${value} = 10.30.171.238</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:10:37.399876" elapsed="0.000368"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:10:37.401274" level="INFO">${encoded} = 10.30.171.238</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:10:37.400755" elapsed="0.000546"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:10:37.401352" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:10:37.401510" level="INFO">${encoded_value} = 10.30.171.238</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:10:37.400435" elapsed="0.001099"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:10:37.401688" elapsed="0.000228"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.238</var>
<status status="PASS" start="2026-04-17T03:10:37.399725" elapsed="0.002248"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:10:37.402578" 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-04-17T03:10:37.402232" elapsed="0.000375"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:10:37.403618" 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-04-17T03:10:37.403151" elapsed="0.000543"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:10:37.403749" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:10:37.404005" 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-04-17T03:10:37.402803" 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-04-17T03:10:37.404192" elapsed="0.000230"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:10:37.402093" elapsed="0.002370"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:10:37.405339" 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-04-17T03:10:37.404976" elapsed="0.000390"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:10:37.406419" 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-04-17T03:10:37.405976" elapsed="0.000470"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:10:37.406497" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:10:37.406700" 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-04-17T03:10:37.405571" elapsed="0.001169"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:10:37.406969" elapsed="0.000267"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:10:37.404604" elapsed="0.002687"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:10:37.407958" 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-04-17T03:10:37.407550" elapsed="0.000448"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:10:37.409135" 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-04-17T03:10:37.408564" elapsed="0.000599"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:10:37.409215" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:10:37.409376" 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-04-17T03:10:37.408234" elapsed="0.001168"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:10:37.409557" elapsed="0.000287"/>
</kw>
<var name="${key}">PASSWORD</var>
<var name="${value}">topsecret</var>
<status status="PASS" start="2026-04-17T03:10:37.407411" elapsed="0.002482"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:10:37.410527" 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-04-17T03:10:37.410191" elapsed="0.000363"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:10:37.411593" 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-04-17T03:10:37.411087" elapsed="0.000533"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:10:37.411669" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:10:37.411827" 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-04-17T03:10:37.410747" elapsed="0.001105"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:10:37.412047" elapsed="0.000227"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:10:37.410036" elapsed="0.002285"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:10:37.396844" elapsed="0.015517"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:10:37.412406" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:10:37.412571" level="INFO">${mapping_to_use} = {'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.171.238', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSWORD': 'topsecret', 'PASSIVE_MODE': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:10:37.395608" elapsed="0.016990"/>
</kw>
<status status="PASS" start="2026-04-17T03:10:37.395271" elapsed="0.017360"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:37.412811" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:10:37.412658" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:37.395246" elapsed="0.017641"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:10:37.426706" 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-04-17T03:10:37.413176" elapsed="0.013563"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:10:37.426796" 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/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-04-17T03:10:37.391339" elapsed="0.035620"/>
</kw>
<msg time="2026-04-17T03:10:37.427090" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:37.377777" elapsed="0.049387"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:10:37.440135" 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/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-04-17T03:10:37.453045" elapsed="0.000045"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:10:37.466536" elapsed="0.000054"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:37.466858" 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-04-17T03:10:37.467109" 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-04-17T03:10:37.467635" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:10:37.467445" elapsed="0.000261"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:10:37.467424" elapsed="0.000315"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:37.467949" 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-04-17T03:10:37.468151" 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-04-17T03:10:37.468325" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:10:37.467380" elapsed="0.000999"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:10:37.467216" elapsed="0.001191"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:37.468556" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:10:37.468637" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:10:37.468809" 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-04-17T03:10:37.373078" elapsed="0.095761"/>
</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-04-17T03:10:37.495695" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:10:37.495292" elapsed="0.000439"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:10:37.496542" 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-04-17T03:10:37.496273" elapsed="0.000421">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-04-17T03:10:37.496794" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:10:37.495907" elapsed="0.000915"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:10:37.497473" 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-04-17T03:10:37.497020" elapsed="0.000482"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:10:37.497818" 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-04-17T03:10:37.498006" 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-04-17T03:10:37.497668" elapsed="0.000370"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:37.498495" 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-04-17T03:10:37.498207" elapsed="0.000354"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-17T03:10:37.498960" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:10:37.498633" elapsed="0.000391"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:10:37.499512" level="INFO">${mapping_to_use} = {'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.171.238', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSWORD': 'topsecret', 'PASSIVE_MODE': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:10:37.499208" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-04-17T03:10:37.499058" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:37.498612" elapsed="0.000985"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:10:37.500512" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.238&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflec...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:10:37.499745" elapsed="0.000798"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:10:37.500595" 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/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-04-17T03:10:37.494634" elapsed="0.006097"/>
</kw>
<msg time="2026-04-17T03:10:37.500790" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:37.481641" elapsed="0.019197"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:10:37.513960" elapsed="0.000041"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_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-04-17T03:10:37.527150" 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/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-04-17T03:10:37.541448" elapsed="0.000075"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:37.541852" 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-04-17T03:10:37.542184" elapsed="0.000040"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:37.542843" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:10:37.542613" elapsed="0.000337"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:10:37.542586" elapsed="0.000403"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:37.543207" elapsed="0.000030"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:37.543512" elapsed="0.000048"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:37.543834" elapsed="0.000046"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:10:37.542534" elapsed="0.001428"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:10:37.542336" elapsed="0.001669"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:37.544238" elapsed="0.000031"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:10:37.544356" elapsed="0.000026"/>
</return>
<msg time="2026-04-17T03:10:37.544599" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.238&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflec...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:10:37.478894" elapsed="0.065751"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:10:37.546904" 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-04-17T03:10:37.546456" elapsed="0.000578">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-04-17T03:10:37.547138" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:10:37.545819" elapsed="0.001345"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:37.547514" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:10:37.547239" elapsed="0.000331"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:10:37.548176" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:10:37.547800" elapsed="0.000411"/>
</kw>
<status status="PASS" start="2026-04-17T03:10:37.547596" elapsed="0.000657"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:37.547219" elapsed="0.001062"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:10:37.550913" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:10:37.548491" elapsed="0.002464"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:10:37.551011" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:10:37.551179" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:10:37.545214" elapsed="0.005990"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:37.552686" 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.238</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:37.552423" elapsed="0.000389"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:37.553232" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.238&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-04-17T03:10:37.552984" elapsed="0.000385"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:37.553817" 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-04-17T03:10:37.553552" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:37.554343" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:37.554034" elapsed="0.000366"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:10:37.555340" 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-04-17T03:10:37.555118" elapsed="0.000249"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:10:37.555702" 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-04-17T03:10:37.555523" elapsed="0.000205"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:10:37.555944" elapsed="0.000235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:37.556687" 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-04-17T03:10:37.556374" elapsed="0.000371"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:10:37.556799" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:10:37.557017" 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-04-17T03:10:37.554648" elapsed="0.002396"/>
</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-04-17T03:10:37.566466" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:10:37.780075" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:10:38.182997" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:10:38.186286" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:10:37.559784" elapsed="0.636735">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:10:37.557129" elapsed="0.639541">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:38.197043" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:10:38.196731" elapsed="0.000413"/>
</branch>
<status status="FAIL" start="2026-04-17T03:10:37.557107" elapsed="0.640071">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:38.197847" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:10:38.198063" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:38.198006" elapsed="0.000121"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:10:38.197980" 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-04-17T03:10:38.198416" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:10:38.198517" elapsed="0.000165"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:10:37.551570" elapsed="0.647254">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:10:38.198955" elapsed="0.000024"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:10:37.361439" elapsed="0.837661">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:38.199516" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:10:38.199253" elapsed="0.000364"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:10:38.199230" elapsed="0.000421"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:10:38.199698" elapsed="0.000019"/>
</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="FAIL" start="2026-04-17T03:10:37.355389" elapsed="0.844448">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${MD5_SAME_PASSWD}</arg>
<doc>Configures BGP peer module with initiate-connection set to false.</doc>
<status status="FAIL" start="2026-04-17T03:10:37.352380" elapsed="0.847619">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Delete_Bgp_Peer_Configuration" type="TEARDOWN">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:10:38.201598" level="INFO">&amp;{mapping} = { BGP_RIB_OPENCONFIG=example-bgp-rib | IP=10.30.171.238 }</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-04-17T03:10:38.200846" elapsed="0.000793"/>
</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-04-17T03:10:38.245341" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:10:38.244938" elapsed="0.000433"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:10:38.246163" 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-04-17T03:10:38.245882" elapsed="0.000349">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-17T03:10:38.246379" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:10:38.245544" elapsed="0.000861"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:10:38.247018" 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-04-17T03:10:38.246606" elapsed="0.000440"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:10:38.247363" 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-04-17T03:10:38.247511" 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-04-17T03:10:38.247210" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:38.247969" 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-04-17T03:10:38.247702" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:38.249019" level="INFO">mapping: {'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.171.238'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:38.248743" elapsed="0.000321"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:10:38.249491" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:10:38.249222" elapsed="0.000294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:10:38.250214" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:10:38.249892" elapsed="0.000348"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:10:38.251036" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:10:38.250795" elapsed="0.000267"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:10:38.251113" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:10:38.251271" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:10:38.250429" elapsed="0.000867"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:10:38.251449" elapsed="0.000239"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:10:38.249754" elapsed="0.001973"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:10:38.252287" level="INFO">${value} = 10.30.171.238</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:10:38.251989" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:10:38.253230" level="INFO">${encoded} = 10.30.171.238</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:10:38.252840" elapsed="0.000417"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:10:38.253309" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:10:38.253463" level="INFO">${encoded_value} = 10.30.171.238</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:10:38.252498" elapsed="0.000989"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:10:38.253744" elapsed="0.000257"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.238</var>
<status status="PASS" start="2026-04-17T03:10:38.251842" elapsed="0.002201"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:10:38.249574" elapsed="0.004504"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:10:38.254122" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:10:38.254281" level="INFO">${mapping_to_use} = {'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.171.238'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:10:38.248387" elapsed="0.005919"/>
</kw>
<status status="PASS" start="2026-04-17T03:10:38.248087" elapsed="0.006251"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:38.254555" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:10:38.254362" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:38.248067" elapsed="0.006567"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:10:38.255378" 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-04-17T03:10:38.254778" elapsed="0.000629"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:10:38.255491" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:10:38.244274" elapsed="0.011346"/>
</kw>
<msg time="2026-04-17T03:10:38.255708" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:38.231858" elapsed="0.023913"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:10:38.268307" 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/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-04-17T03:10:38.280791" 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/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-04-17T03:10:38.292937" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:38.293140" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:38.293316" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:38.293690" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:10:38.293545" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:10:38.293530" 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-04-17T03:10:38.293916" 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-04-17T03:10:38.294099" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:38.294262" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:10:38.293500" elapsed="0.000815"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:10:38.293393" elapsed="0.000947"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:38.294483" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:10:38.294611" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:10:38.294752" 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-04-17T03:10:38.227577" elapsed="0.067203"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:38.296094" 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.238</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:38.295779" elapsed="0.000371"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:10:38.301716" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:10:38.503530" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:10:38.906646" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:10:38.908977" level="INFO">${response} = None</msg>
<msg time="2026-04-17T03:10:38.909050" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:10:38.298334" elapsed="0.613934">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:10:38.296219" elapsed="0.616187">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:10:38.912757" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:10:38.912468" elapsed="0.000381"/>
</branch>
<status status="FAIL" start="2026-04-17T03:10:38.296202" elapsed="0.616681">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:10:38.917787" 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-04-17T03:10:38.914947" elapsed="0.002878">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:10:38.914590" elapsed="0.003302">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:10:38.914562" elapsed="0.003362">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-04-17T03:10:38.920532" 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-04-17T03:10:38.918242" elapsed="0.002325">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:10:38.918015" elapsed="0.002614">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:10:38.917998" elapsed="0.002663">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:10:38.921313" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:10:38.920863" elapsed="0.000477"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:38.921650" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:10:38.921411" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:10:38.922773" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:10:38.922452" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-04-17T03:10:38.921733" elapsed="0.001104"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:38.921393" elapsed="0.001466"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:10:38.923413" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:10:38.923036" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:38.923779" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:10:38.923540" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:10:38.924349" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:10:38.924042" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-17T03:10:38.923864" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:38.923520" elapsed="0.000914"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:38.924588" elapsed="0.000373"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-17T03:10:38.925584" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:10:38.925128" elapsed="0.000483"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-04-17T03:10:38.928113" 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-04-17T03:10:38.925769" elapsed="0.002377">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-04-17T03:10:38.913861" elapsed="0.014431">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-04-17T03:10:38.928356" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:10:38.930762" level="INFO">${response_text} = None</msg>
<msg time="2026-04-17T03:10:38.930795" 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-04-17T03:10:38.295117" elapsed="0.635708">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-04-17T03:10:38.930894" elapsed="0.000028"/>
</return>
<arg>${BGP_PEER_FOLDER}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="FAIL" start="2026-04-17T03:10:38.201976" elapsed="0.729115">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="FAIL" start="2026-04-17T03:10:38.200360" elapsed="0.730846">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<doc>Verifies exabgp connected with md5 settings</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:10:37.349347" elapsed="1.581935">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))

Also teardown failed:
Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</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-04-17T03:10:38.933090" level="INFO">&amp;{mapping} = { BGP_RIB_OPENCONFIG=example-bgp-rib | IP=10.30.171.238 | 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-04-17T03:10:38.932430" elapsed="0.000688"/>
</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-04-17T03:10:38.966528" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:10:38.966141" elapsed="0.000477"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:10:38.967393" 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-04-17T03:10:38.967149" elapsed="0.000317">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-04-17T03:10:38.967587" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:10:38.966790" elapsed="0.000826"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:10:38.968269" 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-04-17T03:10:38.967805" elapsed="0.000493"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:10:38.968612" 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-04-17T03:10:38.968774" 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-04-17T03:10:38.968465" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:38.969298" 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-04-17T03:10:38.968990" elapsed="0.000369"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:38.970775" level="INFO">mapping: {'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.171.238', '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-04-17T03:10:38.970353" elapsed="0.000473"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:10:38.971291" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:10:38.971004" elapsed="0.000317"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:10:38.972135" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:10:38.971784" elapsed="0.000384"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:10:38.973199" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:10:38.972700" elapsed="0.000526"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:10:38.973278" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:10:38.973442" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:10:38.972367" elapsed="0.001100"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:10:38.973620" elapsed="0.000235"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:10:38.971632" elapsed="0.002262"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:10:38.974456" level="INFO">${value} = 10.30.171.238</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:10:38.974157" elapsed="0.000325"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:10:38.975506" level="INFO">${encoded} = 10.30.171.238</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:10:38.975046" elapsed="0.000487"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:10:38.975600" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:10:38.975759" level="INFO">${encoded_value} = 10.30.171.238</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:10:38.974668" elapsed="0.001115"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:10:38.975975" elapsed="0.000252"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.238</var>
<status status="PASS" start="2026-04-17T03:10:38.974024" elapsed="0.002252"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:10:38.976822" 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-04-17T03:10:38.976521" elapsed="0.000327"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:10:38.977818" 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-04-17T03:10:38.977379" elapsed="0.000466"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:10:38.977900" elapsed="0.000074"/>
</return>
<msg time="2026-04-17T03:10:38.978165" 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-04-17T03:10:38.977053" elapsed="0.001138"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:10:38.978346" elapsed="0.000226"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:10:38.976387" elapsed="0.002232"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:10:38.979185" 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-04-17T03:10:38.978864" elapsed="0.000347"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:10:38.980276" 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-04-17T03:10:38.979801" elapsed="0.000503"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:10:38.980358" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:10:38.980523" 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-04-17T03:10:38.979400" elapsed="0.001155"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:10:38.980749" elapsed="0.000265"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:10:38.978732" elapsed="0.002325"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:10:38.981659" 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-04-17T03:10:38.981311" elapsed="0.000375"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:10:38.984422" 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-04-17T03:10:38.982247" elapsed="0.002203"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:10:38.984502" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:10:38.984658" 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-04-17T03:10:38.981878" elapsed="0.002804"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:10:38.984834" elapsed="0.000242"/>
</kw>
<var name="${key}">PASSWORD</var>
<var name="${value}">different</var>
<status status="PASS" start="2026-04-17T03:10:38.981174" elapsed="0.003943"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:10:38.985656" 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-04-17T03:10:38.985358" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:10:38.986660" 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-04-17T03:10:38.986228" elapsed="0.000458"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:10:38.986736" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:10:38.986886" 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-04-17T03:10:38.985867" elapsed="0.001043"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:10:38.987099" elapsed="0.000223"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:10:38.985227" elapsed="0.002136"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:10:38.971393" elapsed="0.016004"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:10:38.987440" elapsed="0.000027"/>
</return>
<msg time="2026-04-17T03:10:38.987629" level="INFO">${mapping_to_use} = {'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.171.238', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSWORD': 'different', 'PASSIVE_MODE': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:10:38.969984" elapsed="0.017673"/>
</kw>
<status status="PASS" start="2026-04-17T03:10:38.969456" elapsed="0.018234"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:38.987868" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:10:38.987717" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:38.969428" elapsed="0.018531"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:10:38.988892" 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-04-17T03:10:38.988104" elapsed="0.000848"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:10:38.989023" 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/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-04-17T03:10:38.965445" elapsed="0.023752"/>
</kw>
<msg time="2026-04-17T03:10:38.989322" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:38.952258" elapsed="0.037135"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:10:39.003845" elapsed="0.000043"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:10:39.015998" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_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-04-17T03:10:39.028111" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:39.028310" 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-04-17T03:10:39.028498" 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-04-17T03:10:39.028894" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:10:39.028742" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:10:39.028726" 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-04-17T03:10:39.029135" 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-04-17T03:10:39.029302" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:39.029468" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:10:39.028689" elapsed="0.000832"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:10:39.028586" elapsed="0.000961"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:39.029692" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:10:39.029766" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:10:39.029897" 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-04-17T03:10:38.948071" elapsed="0.081865"/>
</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-04-17T03:10:39.056279" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:10:39.055870" elapsed="0.000437"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:10:39.057090" 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-04-17T03:10:39.056812" elapsed="0.000420">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-04-17T03:10:39.057333" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:10:39.056476" elapsed="0.000883"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:10:39.058125" 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-04-17T03:10:39.057600" elapsed="0.000565"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:10:39.058524" 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-04-17T03:10:39.058705" 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-04-17T03:10:39.058367" elapsed="0.000368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:39.059197" 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-04-17T03:10:39.058893" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-17T03:10:39.059648" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:10:39.059333" elapsed="0.000408"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:10:39.060252" level="INFO">${mapping_to_use} = {'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.171.238', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSWORD': 'different', 'PASSIVE_MODE': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:10:39.059922" elapsed="0.000358"/>
</kw>
<status status="PASS" start="2026-04-17T03:10:39.059772" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:39.059311" elapsed="0.001026"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:10:39.061220" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.238&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflec...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:10:39.060485" elapsed="0.000766"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:10:39.061300" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:10:39.055215" elapsed="0.006216"/>
</kw>
<msg time="2026-04-17T03:10:39.061496" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:39.042375" elapsed="0.019171"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:10:39.073937" 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/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-04-17T03:10:39.086445" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:39.098699" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:39.098902" elapsed="0.000035"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:39.099097" 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-04-17T03:10:39.099493" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:10:39.099346" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:10:39.099330" 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-04-17T03:10:39.099713" 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-04-17T03:10:39.100183" elapsed="0.000029"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:39.100362" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:10:39.099298" elapsed="0.001117"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:10:39.099185" elapsed="0.001257"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:39.100594" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:10:39.100669" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:10:39.100829" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.238&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflec...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:10:39.039733" elapsed="0.061126"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:10:39.102208" 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-04-17T03:10:39.101922" elapsed="0.000358">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-04-17T03:10:39.102374" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:10:39.101551" elapsed="0.000848"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:39.102721" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:10:39.102467" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:10:39.103296" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:10:39.103002" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-04-17T03:10:39.102802" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:39.102450" elapsed="0.000927"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:10:39.105937" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:10:39.103529" elapsed="0.002437"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:10:39.106019" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:10:39.106181" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:10:39.101205" elapsed="0.005002"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:39.107607" 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.238</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:39.107352" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:39.108132" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.238&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-04-17T03:10:39.107872" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:39.108590" 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-04-17T03:10:39.108343" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:39.109047" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:39.108786" elapsed="0.000304"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:10:39.109903" 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-04-17T03:10:39.109704" elapsed="0.000239"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:10:39.110275" 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-04-17T03:10:39.110098" 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-04-17T03:10:39.110451" elapsed="0.000208"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:39.111079" 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-04-17T03:10:39.110814" elapsed="0.000310"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:10:39.111166" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:10:39.111323" 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-04-17T03:10:39.109293" elapsed="0.002055"/>
</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-04-17T03:10:39.116774" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:10:39.318442" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:10:39.721288" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:10:39.724146" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:10:39.113480" elapsed="0.614367">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:10:39.111417" elapsed="0.616597">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:39.728365" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:10:39.728075" elapsed="0.000390"/>
</branch>
<status status="FAIL" start="2026-04-17T03:10:39.111400" elapsed="0.617099">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:39.729202" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:10:39.729397" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:39.729340" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:10:39.729314" 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-04-17T03:10:39.729695" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:10:39.729789" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:10:39.106534" elapsed="0.623431">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:10:39.730077" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:10:38.937577" elapsed="0.792638">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:39.730627" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:10:39.730367" elapsed="0.000356"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:10:39.730344" elapsed="0.000412"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:10:39.730803" elapsed="0.000020"/>
</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="FAIL" start="2026-04-17T03:10:38.933397" elapsed="0.797564">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${MD5_DIFF_PASSWD}</arg>
<doc>Configures BGP peer module with initiate-connection set to false.</doc>
<status status="FAIL" start="2026-04-17T03:10:38.932079" elapsed="0.799025">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Delete_Bgp_Peer_Configuration" type="TEARDOWN">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:10:39.733077" level="INFO">&amp;{mapping} = { BGP_RIB_OPENCONFIG=example-bgp-rib | IP=10.30.171.238 }</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-04-17T03:10:39.731963" elapsed="0.001156"/>
</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-04-17T03:10:39.778735" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:10:39.778328" elapsed="0.000442"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:10:39.779782" 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-04-17T03:10:39.779311" elapsed="0.000571">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-04-17T03:10:39.780087" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:10:39.778962" elapsed="0.001160"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:10:39.780702" 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-04-17T03:10:39.780294" elapsed="0.000437"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:10:39.781113" 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-04-17T03:10:39.781278" 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-04-17T03:10:39.780958" elapsed="0.000348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:39.781726" 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-04-17T03:10:39.781467" 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-04-17T03:10:39.782898" level="INFO">mapping: {'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.171.238'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:39.782634" elapsed="0.000329"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:10:39.783407" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:10:39.783131" elapsed="0.000303"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:10:39.784154" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:10:39.783819" elapsed="0.000363"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:10:39.785114" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:10:39.784851" elapsed="0.000292"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:10:39.785206" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:10:39.785403" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:10:39.784377" elapsed="0.001061"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:10:39.785599" elapsed="0.000278"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:10:39.783676" elapsed="0.002245"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:10:39.786510" level="INFO">${value} = 10.30.171.238</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:10:39.786203" elapsed="0.000333"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:10:39.787630" level="INFO">${encoded} = 10.30.171.238</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:10:39.787408" elapsed="0.000250"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:10:39.787710" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:10:39.787868" level="INFO">${encoded_value} = 10.30.171.238</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:10:39.786870" elapsed="0.001024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:10:39.788066" elapsed="0.000228"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.238</var>
<status status="PASS" start="2026-04-17T03:10:39.786063" elapsed="0.002272"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:10:39.783491" elapsed="0.004880"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:10:39.788415" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:10:39.788578" level="INFO">${mapping_to_use} = {'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.171.238'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:10:39.782269" elapsed="0.006336"/>
</kw>
<status status="PASS" start="2026-04-17T03:10:39.781853" elapsed="0.006785"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:39.788852" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:10:39.788668" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:39.781830" elapsed="0.007126"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:10:39.789744" 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-04-17T03:10:39.789119" elapsed="0.000656"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:10:39.789867" 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/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-04-17T03:10:39.777635" elapsed="0.012384"/>
</kw>
<msg time="2026-04-17T03:10:39.790078" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:39.763576" elapsed="0.026565"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:10:39.803213" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_md5/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:39.815980" 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/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-04-17T03:10:39.829824" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:39.830079" 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-04-17T03:10:39.830285" 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-04-17T03:10:39.830707" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:10:39.830541" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:10:39.830523" 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-04-17T03:10:39.830967" 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-04-17T03:10:39.831154" 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-04-17T03:10:39.831337" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:10:39.830488" elapsed="0.000905"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:10:39.830370" elapsed="0.001051"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:39.831584" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:10:39.831665" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:10:39.831813" 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-04-17T03:10:39.758829" elapsed="0.073014"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:39.833280" 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.238</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:39.832964" elapsed="0.000370"/>
</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-04-17T03:10:39.839099" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:10:40.040895" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:10:40.459832" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:10:40.462626" level="INFO">${response} = None</msg>
<msg time="2026-04-17T03:10:40.462700" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:10:39.835708" elapsed="0.630545">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:10:39.833406" elapsed="0.632991">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:10:40.466762" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:10:40.466460" elapsed="0.000399"/>
</branch>
<status status="FAIL" start="2026-04-17T03:10:39.833387" elapsed="0.633506">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:10:40.472041" 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-04-17T03:10:40.469050" elapsed="0.003028">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:10:40.468684" elapsed="0.003461">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:10:40.468656" elapsed="0.003522">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-04-17T03:10:40.474865" 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-04-17T03:10:40.472482" elapsed="0.002417">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:10:40.472252" elapsed="0.002755">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:10:40.472235" elapsed="0.002816">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:10:40.475697" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:10:40.475255" elapsed="0.000469"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:40.476065" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:10:40.475796" elapsed="0.000343"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:10:40.476722" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:10:40.476397" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-04-17T03:10:40.476164" elapsed="0.000624"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:40.475778" elapsed="0.001034"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:10:40.477402" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:10:40.477004" elapsed="0.000426"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:40.477782" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:10:40.477501" elapsed="0.000344"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:10:40.478413" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:10:40.478096" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-17T03:10:40.477872" elapsed="0.000605"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:40.477483" elapsed="0.001016"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:40.478660" elapsed="0.000378"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-17T03:10:40.479531" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:10:40.479218" elapsed="0.000341"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-04-17T03:10:40.482004" 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-04-17T03:10:40.479720" elapsed="0.002318">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-04-17T03:10:40.467917" elapsed="0.014261">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-04-17T03:10:40.482245" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:10:40.484737" level="INFO">${response_text} = None</msg>
<msg time="2026-04-17T03:10:40.484770" 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-04-17T03:10:39.832226" elapsed="0.652575">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-04-17T03:10:40.484872" elapsed="0.000028"/>
</return>
<arg>${BGP_PEER_FOLDER}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="FAIL" start="2026-04-17T03:10:39.733440" elapsed="0.751635">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="FAIL" start="2026-04-17T03:10:39.731450" elapsed="0.753749">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<doc>Verifies exabgp connected with md5 settings</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:10:38.931605" elapsed="1.553677">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))

Also teardown failed:
Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</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-04-17T03:10:40.491691" level="INFO">${cd_and_command} = cd '.' &amp;&amp; rm -rf /tmp/defaultvenv</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:10:40.491358" elapsed="0.000362"/>
</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-04-17T03:10:40.493370" level="INFO">Executing command 'cd '.' &amp;&amp; rm -rf /tmp/defaultvenv'.</msg>
<msg time="2026-04-17T03:10:40.527086" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:10:40.527498" level="INFO">${stdout} = </msg>
<msg time="2026-04-17T03:10:40.527638" level="INFO">${stderr} = </msg>
<msg time="2026-04-17T03:10:40.527738" 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-04-17T03:10:40.493170" elapsed="0.034621"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:10:40.530212" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-04-17T03:10:40.529391" elapsed="0.000932"/>
</kw>
<msg time="2026-04-17T03:10:40.530532" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-04-17T03:10:40.530608" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:40.528443" elapsed="0.002198"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:10:40.531605" 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-04-17T03:10:40.530885" elapsed="0.000758"/>
</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-04-17T03:10:40.533451" level="INFO"/>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:40.533081" elapsed="0.000440"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:40.534179" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:40.533757" elapsed="0.000482"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:40.534821" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:40.534472" elapsed="0.000449"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-04-17T03:10:40.532416" elapsed="0.002616"/>
</kw>
<status status="PASS" start="2026-04-17T03:10:40.531767" elapsed="0.003316"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:40.531732" elapsed="0.003388"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-04-17T03:10:40.535358" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:40.535204" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:40.535178" elapsed="0.000279"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:10:40.535656" elapsed="0.000047"/>
</return>
<status status="PASS" start="2026-04-17T03:10:40.535529" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:40.535508" elapsed="0.000278"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:40.536017" elapsed="0.000034"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-04-17T03:10:40.492498" elapsed="0.043695"/>
</kw>
<msg time="2026-04-17T03:10:40.536283" 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-04-17T03:10:40.491881" elapsed="0.044494"/>
</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-04-17T03:10:40.490687" elapsed="0.045796"/>
</kw>
<msg time="2026-04-17T03:10:40.536554" 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-04-17T03:10:40.486799" elapsed="0.049831"/>
</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-04-17T03:10:40.486442" elapsed="0.050296"/>
</kw>
<doc>Deletes a directory with virtual env.</doc>
<status status="PASS" start="2026-04-17T03:10:40.486189" elapsed="0.050621"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-04-17T03:10:40.537043" elapsed="0.000648"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-17T03:10:40.538236" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-17T03:10:40.538064" elapsed="0.000366"/>
</kw>
<doc>Suite teardown keyword with old rib restoration</doc>
<status status="PASS" start="2026-04-17T03:10:40.485862" elapsed="0.052669"/>
</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="FAIL" start="2026-04-17T03:10:26.759551" elapsed="13.779022"/>
</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-04-17T03:10:40.635634" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:10:40.631090" elapsed="0.004608"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-17T03:10:40.630736" elapsed="0.005122"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-17T03:10:40.640656" 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-04-17T03:10:40.637054" elapsed="0.003631"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-17T03:10:40.640940" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:40.640774" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:40.640748" elapsed="0.000267"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:10:40.641549" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:10:40.641176" elapsed="0.000417"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-17T03:10:40.642151" 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-04-17T03:10:40.641757" elapsed="0.000423"/>
</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-04-17T03:10:40.642706" elapsed="0.000315"/>
</kw>
<msg time="2026-04-17T03:10:40.643121" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:10:40.643169" level="INFO">${possibly_int_of_members} = 1</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:40.642353" elapsed="0.000840"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:10:40.643783" 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-04-17T03:10:40.643364" elapsed="0.000456"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:10:40.645045" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:10:40.644717" elapsed="0.000355"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:10:40.645488" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:10:40.645226" elapsed="0.000291"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:10:40.646042" 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-04-17T03:10:40.645677" elapsed="0.000394"/>
</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-04-17T03:10:40.649718" elapsed="0.000365"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:10:40.650773" level="INFO">${member_ip} = 10.30.170.120</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:10:40.650258" elapsed="0.000553"/>
</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-04-17T03:10:40.651048" elapsed="0.000265"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:10:40.652181" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:10:40.651846" elapsed="0.000363"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-17T03:10:40.652260" elapsed="0.000061"/>
</return>
<msg time="2026-04-17T03:10:40.652455" 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-04-17T03:10:40.651534" elapsed="0.000946"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:10:40.653271" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.120:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a44256aa890&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-04-17T03:10:40.652675" elapsed="0.000792"/>
</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-04-17T03:10:40.653681" elapsed="0.000262"/>
</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-04-17T03:10:40.649056" elapsed="0.004992"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:10:40.648774" elapsed="0.005332"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-04-17T03:10:40.646131" elapsed="0.008022"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:10:40.654854" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:10:40.654380" elapsed="0.000518"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:10:40.655493" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.120'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:10:40.655080" elapsed="0.000456"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:10:40.656180" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:10:40.655697" elapsed="0.000528"/>
</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-04-17T03:10:40.644168" elapsed="0.012118"/>
</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-04-17T03:10:40.636685" elapsed="0.019662"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:10:40.656557" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:40.656425" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:40.656403" elapsed="0.000222"/>
</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-04-17T03:10:40.659856" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:10:40.659417" elapsed="0.000466"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:10:40.660379" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:10:40.660069" elapsed="0.000337"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:10:40.660451" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:10:40.660612" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:10:40.659080" elapsed="0.001557"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:10:40.661697" level="INFO">${member_ip} = 10.30.170.120</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-04-17T03:10:40.661396" elapsed="0.000328"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:40.662735" 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-04-17T03:10:40.662865" 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-04-17T03:10:40.662514" elapsed="0.000384"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:40.666749" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:10:40.666143" elapsed="0.000723"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:40.666118" elapsed="0.000798"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:40.667620" 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-04-17T03:10:40.667860" 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-04-17T03:10:40.667150" elapsed="0.000772"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:40.669180" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.120" 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-04-17T03:10:40.668290" elapsed="0.001035"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:40.670835" 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-04-17T03:10:40.669695" elapsed="0.001195"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-17T03:10:40.672682" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:10:40.672897" 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-04-17T03:10:40.672294" elapsed="0.000680"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:40.673416" elapsed="0.000786"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:10:40.675705" level="INFO">Logging into '10.30.170.120:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:10:41.143656" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 17 03:10:22 UTC 2026

  System load:  0.2                Processes:             122
  Usage of /:   10.4% of 77.35GB   Users logged in:       0
  Memory usage: 2%                 IPv4 address for ens3: 10.30.170.120
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:10:27 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:10:40.675292" elapsed="0.468834"/>
</kw>
<msg time="2026-04-17T03:10:41.144280" 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-04-17T03:10:40.674688" elapsed="0.469873"/>
</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-04-17T03:10:40.671366" elapsed="0.473703"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:10:41.147037" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-17T03:10:41.160198" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-17T03:10:41.160680" level="INFO">${stdout} = </msg>
<msg time="2026-04-17T03:10:41.160913" 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-04-17T03:10:41.145954" elapsed="0.015135"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:10:41.161802" elapsed="0.001247"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:41.165590" 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-04-17T03:10:41.164365" elapsed="0.001457"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-17T03:10:41.166896" elapsed="0.000148"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:41.166234" elapsed="0.000981"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:41.166182" elapsed="0.001113"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:10:41.167869" elapsed="0.000134"/>
</return>
<status status="PASS" start="2026-04-17T03:10:41.167468" elapsed="0.000654"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:41.167432" elapsed="0.000746"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-17T03:10:41.168264" elapsed="0.000023"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:41.175759" elapsed="0.000643"/>
</kw>
<kw name="Open 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-04-17T03:10:41.176706" elapsed="0.000383"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:10:41.177402" elapsed="0.000243"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:10:41.168985" elapsed="0.008735"/>
</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-04-17T03:10:40.665120" elapsed="0.512842"/>
</kw>
<msg time="2026-04-17T03:10:41.178047" 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-04-17T03:10:40.664378" elapsed="0.513749"/>
</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-04-17T03:10:40.663658" elapsed="0.514556"/>
</kw>
<msg time="2026-04-17T03:10:41.178256" 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-04-17T03:10:40.663101" elapsed="0.515202"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:41.181111" elapsed="0.000324"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-17T03:10:41.181602" elapsed="0.000154"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:10:41.181946" elapsed="0.000117"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:10:41.178684" elapsed="0.003445"/>
</kw>
<msg time="2026-04-17T03:10:41.182228" 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-04-17T03:10:40.661990" elapsed="0.520263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:41.182813" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:41.182492" elapsed="0.000377"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-17T03:10:41.182923" elapsed="0.000052"/>
</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-04-17T03:10:40.661024" elapsed="0.522070"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:10:40.660828" elapsed="0.522392"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:10:40.660694" elapsed="0.522572"/>
</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-04-17T03:10:40.656853" elapsed="0.526477"/>
</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-04-17T03:10:41.183491" elapsed="0.000226"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:10:41.198898" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:41.198542" elapsed="0.000439"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:41.198512" elapsed="0.000512"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:41.199492" 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-04-17T03:10:41.199640" 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-04-17T03:10:41.199270" elapsed="0.000399"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:41.200189" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:41.199845" elapsed="0.000404"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:41.200736" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:41.200434" elapsed="0.000358"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:10:41.201740" 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-04-17T03:10:41.201478" elapsed="0.000381">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-17T03:10:41.202027" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:10:41.202076" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:41.200984" elapsed="0.001116"/>
</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-04-17T03:10:41.202420" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:10:41.202179" elapsed="0.000354"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:41.202160" elapsed="0.000409"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:10:41.203491" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:10:41.203208" elapsed="0.000313"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:10:41.203571" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:10:41.203730" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:10:41.202892" elapsed="0.000862"/>
</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-04-17T03:10:41.203916" elapsed="0.000445"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:41.204877" level="INFO">index=4
host=10.30.170.120
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-04-17T03:10:41.205021" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.120
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-04-17T03:10:41.204558" elapsed="0.000491"/>
</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-04-17T03:10:41.205209" elapsed="0.002590"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:10:41.208263" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:10:41.209382" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:10:41.207989" elapsed="0.002215">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:41.215671" elapsed="0.000663"/>
</kw>
<kw name="Open 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-04-17T03:10:41.216612" elapsed="0.000366"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:10:41.217219" elapsed="0.000158"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:10:41.211855" elapsed="0.005648"/>
</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-04-17T03:10:41.210850" elapsed="0.006859"/>
</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="FAIL" start="2026-04-17T03:10:41.198135" elapsed="0.019724">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:10:42.236103" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:42.235938" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:42.235883" elapsed="0.000324"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:42.236712" 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-04-17T03:10:42.236862" 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-04-17T03:10:42.236471" elapsed="0.000428"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:42.237448" 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-04-17T03:10:42.237124" elapsed="0.000372"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:42.237945" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:42.237658" elapsed="0.000336"/>
</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-04-17T03:10:42.238609" elapsed="0.000196"/>
</kw>
<msg time="2026-04-17T03:10:42.238908" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:10:42.238975" level="INFO">${old_connection_index} = 4</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:42.238173" elapsed="0.000826"/>
</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-04-17T03:10:42.239989" elapsed="0.000156"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:10:42.240891" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:10:42.240711" elapsed="0.000732">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:42.240331" elapsed="0.001176"/>
</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-04-17T03:10:42.242036" elapsed="0.000107"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:42.241681" elapsed="0.000510"/>
</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-04-17T03:10:42.239328" elapsed="0.002908"/>
</kw>
<status status="PASS" start="2026-04-17T03:10:42.239079" elapsed="0.003214"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:42.239059" elapsed="0.003271"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:10:42.243160" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:10:42.242863" elapsed="0.000326"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:10:42.243239" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:10:42.243412" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:10:42.242569" elapsed="0.000869"/>
</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-04-17T03:10:42.243597" elapsed="0.000519"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:42.244406" level="INFO">index=6
host=10.30.170.120
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-04-17T03:10:42.244510" level="INFO">${karaf_connection_object} = index=6
host=10.30.170.120
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-04-17T03:10:42.244290" elapsed="0.000247"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:10:42.244692" elapsed="0.002460"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:10:42.247586" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:10:42.248708" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:10:42.247318" elapsed="0.001931">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:42.252552" elapsed="0.000432"/>
</kw>
<kw name="Open 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-04-17T03:10:42.253154" elapsed="0.000178"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:10:42.253486" 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-04-17T03:10:42.250173" elapsed="0.003477"/>
</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-04-17T03:10:42.249570" elapsed="0.004128"/>
</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="FAIL" start="2026-04-17T03:10:42.235467" elapsed="0.018321">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:10:43.273852" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:43.273699" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:43.273671" elapsed="0.000291"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:43.274372" 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-04-17T03:10:43.274498" 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-04-17T03:10:43.274178" elapsed="0.000349"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:43.275042" level="INFO">{1: 6}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:43.274698" elapsed="0.000394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:43.275524" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:43.275259" elapsed="0.000315"/>
</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-04-17T03:10:43.276243" elapsed="0.000210"/>
</kw>
<msg time="2026-04-17T03:10:43.276561" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:10:43.276609" level="INFO">${old_connection_index} = 6</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:43.275752" elapsed="0.000882"/>
</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-04-17T03:10:43.277551" elapsed="0.000148"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:10:43.278506" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:10:43.278308" elapsed="0.000761">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:43.277875" elapsed="0.001262"/>
</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-04-17T03:10:43.279663" elapsed="0.000106"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:43.279316" elapsed="0.000504"/>
</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-04-17T03:10:43.276974" elapsed="0.002893"/>
</kw>
<status status="PASS" start="2026-04-17T03:10:43.276716" elapsed="0.003200"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:43.276695" elapsed="0.003294"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:10:43.280906" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:10:43.280539" elapsed="0.000427"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:10:43.281039" elapsed="0.000088"/>
</return>
<msg time="2026-04-17T03:10:43.281304" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:10:43.280234" elapsed="0.001104"/>
</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-04-17T03:10:43.281568" elapsed="0.000614"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:43.282679" level="INFO">index=8
host=10.30.170.120
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-04-17T03:10:43.282824" level="INFO">${karaf_connection_object} = index=8
host=10.30.170.120
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-04-17T03:10:43.282515" elapsed="0.000347"/>
</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-04-17T03:10:43.283104" elapsed="0.003441"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:10:43.287223" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:10:43.288851" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:10:43.286809" elapsed="0.002621">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:43.292729" elapsed="0.000442"/>
</kw>
<kw name="Open 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-04-17T03:10:43.293378" elapsed="0.000184"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:10:43.293728" elapsed="0.000105"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:10:43.290459" elapsed="0.003430"/>
</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-04-17T03:10:43.289793" elapsed="0.004181"/>
</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="FAIL" start="2026-04-17T03:10:43.273232" elapsed="0.020856">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:10:44.314257" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:44.314025" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:44.313994" elapsed="0.000362"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:44.315023" 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-04-17T03:10:44.315154" 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-04-17T03:10:44.314583" elapsed="0.000599"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:44.315819" level="INFO">{1: 8}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:44.315388" elapsed="0.000495"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:44.316422" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:44.316114" elapsed="0.000385"/>
</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-04-17T03:10:44.317211" elapsed="0.000221"/>
</kw>
<msg time="2026-04-17T03:10:44.317572" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:10:44.317649" level="INFO">${old_connection_index} = 8</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:44.316722" elapsed="0.000958"/>
</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-04-17T03:10:44.318687" elapsed="0.000162"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:10:44.319623" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:10:44.319421" elapsed="0.000837">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:44.319045" elapsed="0.001286"/>
</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-04-17T03:10:44.320965" elapsed="0.000147"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:44.320523" elapsed="0.000639"/>
</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-04-17T03:10:44.318039" elapsed="0.003169"/>
</kw>
<status status="PASS" start="2026-04-17T03:10:44.317765" elapsed="0.003533"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:44.317745" elapsed="0.003701"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:10:44.322690" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:10:44.322331" elapsed="0.000402"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:10:44.322792" elapsed="0.000054"/>
</return>
<msg time="2026-04-17T03:10:44.323007" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:10:44.321893" elapsed="0.001140"/>
</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-04-17T03:10:44.323209" elapsed="0.000503"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:44.324125" level="INFO">index=10
host=10.30.170.120
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-04-17T03:10:44.324249" level="INFO">${karaf_connection_object} = index=10
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:10:44.323993" elapsed="0.000294"/>
</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-04-17T03:10:44.324450" elapsed="0.002888"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:10:44.328343" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:10:44.329693" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:10:44.327648" elapsed="0.002521">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:44.333959" elapsed="0.000513"/>
</kw>
<kw name="Open 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-04-17T03:10:44.334708" elapsed="0.000188"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:10:44.335115" 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-04-17T03:10:44.331388" elapsed="0.003929"/>
</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-04-17T03:10:44.330556" elapsed="0.004814"/>
</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="FAIL" start="2026-04-17T03:10:44.313460" elapsed="0.022021">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:10:44.335594" level="FAIL">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<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="FAIL" start="2026-04-17T03:10:41.184516" elapsed="3.151188">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:41.184135" elapsed="3.151640"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:10:41.183971" elapsed="3.151848"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-04-17T03:10:41.183777" elapsed="3.152092"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-17T03:10:40.636215" elapsed="3.699740"/>
</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-04-17T03:10:44.339130" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:44.338921" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:44.338896" elapsed="0.000315"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:10:44.344593" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:44.344476" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:44.344456" elapsed="0.000220"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:10:44.345842" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:10:44.345369" elapsed="0.000510"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:10:44.346538" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:10:44.346066" elapsed="0.000504"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:10:44.346725" elapsed="0.000058"/>
</return>
<msg time="2026-04-17T03:10:44.346958" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:10:44.344951" elapsed="0.002035"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:10:44.353302" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:44.353170" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:44.353149" elapsed="0.000239"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:10:44.354948" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:44.354784" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:44.354736" elapsed="0.000316"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:10:44.355609" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:10:44.355211" elapsed="0.000433"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:44.356162" 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-04-17T03:10:44.355875" elapsed="0.000314"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:10:44.357463" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:10:44.356970" elapsed="0.001462">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:10:44.358590" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:10:44.358638" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:44.356378" elapsed="0.002284"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:10:44.359955" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:10:44.359455" elapsed="0.001374">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:10:44.361004" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:10:44.361052" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:44.358840" elapsed="0.002235"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:10:44.362426" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/basic.robot"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:10:44.361453" elapsed="0.001069">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/basic.robot"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:10:44.361154" elapsed="0.001510">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/basic.robot"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:10:44.361134" elapsed="0.001567">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/basic.robot"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:44.362954" elapsed="0.000031"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:44.363222" elapsed="0.000062"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:10:44.363068" elapsed="0.000318"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:10:44.363045" elapsed="0.000384"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:10:44.363467" elapsed="0.000018"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:44.366255" elapsed="0.000511"/>
</kw>
<kw name="Open 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-04-17T03:10:44.367165" elapsed="0.000394"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:10:44.368006" elapsed="0.000275"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:10:44.365047" elapsed="0.003329"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:10:44.363823" elapsed="0.004758"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:10:44.354429" elapsed="0.014261">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/basic.robot"</status>
</kw>
<msg time="2026-04-17T03:10:44.368916" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:10:44.368988" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/basic.robot"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:44.353571" elapsed="0.015444"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:10:44.369245" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:44.369104" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:44.369082" elapsed="0.000245"/>
</if>
<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-04-17T03:10:44.370485" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:44.370365" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:44.370346" elapsed="0.000209"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:44.371146" 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-04-17T03:10:44.371287" 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-04-17T03:10:44.370719" elapsed="0.000596"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:44.371880" level="INFO">{1: 10}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:44.371506" elapsed="0.000469"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:44.372485" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:44.372141" elapsed="0.000391"/>
</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-04-17T03:10:44.373289" elapsed="0.000345"/>
</kw>
<msg time="2026-04-17T03:10:44.373740" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:10:44.373788" level="INFO">${old_connection_index} = 10</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:44.372730" elapsed="0.001081"/>
</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-04-17T03:10:44.376092" elapsed="0.000318"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:10:44.378345" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:10:44.377831" elapsed="0.001109">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:44.376702" elapsed="0.002345"/>
</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-04-17T03:10:44.380333" elapsed="0.000236"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:44.379323" elapsed="0.001334"/>
</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-04-17T03:10:44.374904" elapsed="0.005860"/>
</kw>
<status status="PASS" start="2026-04-17T03:10:44.373901" elapsed="0.007117"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:44.373870" elapsed="0.007183"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:10:44.382470" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:10:44.381791" elapsed="0.000729"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:10:44.382595" elapsed="0.000049"/>
</return>
<msg time="2026-04-17T03:10:44.382782" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:10:44.381362" elapsed="0.001446"/>
</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-04-17T03:10:44.383003" elapsed="0.000630"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:44.384038" level="INFO">index=13
host=10.30.170.120
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-04-17T03:10:44.384156" level="INFO">${karaf_connection_object} = index=13
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:10:44.383871" elapsed="0.000313"/>
</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-04-17T03:10:44.384351" elapsed="0.002881"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:10:44.387808" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:10:44.389241" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:10:44.387487" elapsed="0.002262">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:44.394292" 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="PASS" start="2026-04-17T03:10:44.395450" elapsed="0.000529"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:10:44.396224" elapsed="0.000205"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:10:44.391191" elapsed="0.005337"/>
</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-04-17T03:10:44.390484" elapsed="0.006095"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:10:44.370049" elapsed="0.026642">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:44.397159" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:10:44.397247" 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="FAIL" start="2026-04-17T03:10:44.352783" elapsed="0.044623">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:10:44.397544" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:10:44.397597" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:44.347451" elapsed="0.050175"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:44.398012" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:10:44.397715" elapsed="0.000374"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:44.397693" elapsed="0.000423"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:10:44.347297" elapsed="0.050845"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:10:44.347069" elapsed="0.051109"/>
</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-04-17T03:10:44.344121" elapsed="0.054158"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-17T03:10:44.336674" elapsed="0.061670"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:44.336122" elapsed="0.062266"/>
</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-04-17T03:10:40.630251" elapsed="3.768190"/>
</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-04-17T03:10:44.398592" elapsed="0.000198"/>
</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-04-17T03:10:44.398986" elapsed="0.000206"/>
</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-04-17T03:10:44.401154" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:10:44.401239" 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-04-17T03:10:44.400803" 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>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:44.401435" elapsed="0.000338"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:10:44.402841" level="INFO">Logging into '10.30.171.238:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:10:44.736023" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 17 03:10:24 UTC 2026

  System load:  0.0                Processes:             108
  Usage of /:   19.3% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.238
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:10:30 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:10:44.402488" elapsed="0.333787"/>
</kw>
<msg time="2026-04-17T03:10:44.736367" 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-04-17T03:10:44.401993" elapsed="0.334457"/>
</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-04-17T03:10:44.400285" elapsed="0.336280"/>
</kw>
<msg time="2026-04-17T03:10:44.736619" 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-04-17T03:10:44.399775" elapsed="0.336891"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-17T03:10:44.399397" elapsed="0.337344"/>
</kw>
<kw name="Require_Python" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:10:44.738207" level="INFO">Executing command 'python3 --help'.</msg>
<msg time="2026-04-17T03:10:44.750823" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:10:44.751128" 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-04-17T03:10:44.751211" level="INFO">${stderr} = </msg>
<msg time="2026-04-17T03:10:44.751276" 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-04-17T03:10:44.737988" elapsed="0.013324"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:10:44.753548" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-04-17T03:10:44.752722" elapsed="0.000995"/>
</kw>
<msg time="2026-04-17T03:10:44.754019" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-04-17T03:10:44.754134" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:44.751655" elapsed="0.002532"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:10:44.755877" 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-04-17T03:10:44.754589" elapsed="0.001360"/>
</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-04-17T03:10:44.756704" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:10:44.756117" elapsed="0.000685"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:44.756073" elapsed="0.000790"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-04-17T03:10:44.757162" elapsed="0.000053"/>
</return>
<status status="PASS" start="2026-04-17T03:10:44.756998" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:44.756971" elapsed="0.000333"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-04-17T03:10:44.757449" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:44.757390" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:10:44.757367" elapsed="0.000176"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:44.757759" elapsed="0.000242"/>
</kw>
<msg time="2026-04-17T03:10:44.758217" 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-04-17T03:10:44.737586" elapsed="0.020669"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-04-17T03:10:44.758498" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-04-17T03:10:44.758360" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:44.758334" elapsed="0.000318"/>
</if>
<kw name="Fatal Error" owner="BuiltIn">
<arg>Python 3 is not installed!</arg>
<doc>Stops the whole test execution.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:44.758900" elapsed="0.000058"/>
</kw>
<doc>Verify current SSH connection leads to machine with python working. Fatal fail otherwise.</doc>
<status status="PASS" start="2026-04-17T03:10:44.737133" elapsed="0.021915"/>
</kw>
<kw name="Assure_Library_Ipaddr" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:10:44.761049" level="INFO">Executing command 'bash -c 'cd "." &amp;&amp; python -c "import ipaddr"''.</msg>
<msg time="2026-04-17T03:10:44.920531" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-17T03:10:44.920822" level="INFO">${stdout} = </msg>
<msg time="2026-04-17T03:10:44.920890" 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-04-17T03:10:44.920987" 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-04-17T03:10:44.760736" elapsed="0.160290"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:10:44.922660" level="INFO">Length is 119.</msg>
<msg time="2026-04-17T03:10:44.922850" 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-04-17T03:10:44.922107" elapsed="0.000878">'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-04-17T03:10:44.923270" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-04-17T03:10:44.923336" level="INFO">${result} = 'Traceback (most recent call last):
  File "&lt;string&gt;", line 1, in &lt;module&gt;
ModuleNotFoundError: No module named 'ipaddr'' should be empty.</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:44.921388" elapsed="0.001985"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:10:44.924351" 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-04-17T03:10:44.923629" elapsed="0.000764"/>
</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-04-17T03:10:44.926128" level="INFO"/>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:44.925715" elapsed="0.000478"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:44.927102" 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-04-17T03:10:44.926474" elapsed="0.000739"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:44.927846" level="INFO">1</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:44.927569" elapsed="0.000322"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-04-17T03:10:44.925129" elapsed="0.002835"/>
</kw>
<status status="PASS" start="2026-04-17T03:10:44.924524" elapsed="0.003479"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:44.924491" elapsed="0.003542"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-04-17T03:10:44.928227" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-17T03:10:44.928102" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:44.928078" elapsed="0.000251"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-04-17T03:10:44.928431" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:44.928393" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:10:44.928377" elapsed="0.000118"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:44.928642" elapsed="0.000022"/>
</kw>
<msg time="2026-04-17T03:10:44.928800" 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-04-17T03:10:44.760161" elapsed="0.168665"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="NOT RUN" start="2026-04-17T03:10:44.929011" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:44.928897" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:44.928880" elapsed="0.000195"/>
</if>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-04-17T03:10:44.969330" level="INFO">[chan 3] Opened sftp connection (server version 3)</msg>
<msg time="2026-04-17T03:10:44.982612" 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-04-17T03:10:44.929226" elapsed="0.053570"/>
</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-04-17T03:10:44.759446" elapsed="0.223578"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-04-17T03:10:44.996667" 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-04-17T03:10:44.983374" elapsed="0.013470"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:10:44.997950" level="INFO">Creating Session using : alias=session, url=http://10.30.170.120:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a4425517010&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-04-17T03:10:44.997290" elapsed="0.000965"/>
</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-04-17T03:10:45.001774" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:45.001576" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:45.001537" elapsed="0.000342"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:10:45.002464" level="INFO">${karaf_connection_index} = 13</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:10:45.002124" elapsed="0.000379"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:45.003043" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:10:45.002735" elapsed="0.000345"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:10:45.004183" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:10:45.003884" elapsed="0.001014">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:10:45.005071" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:10:45.005135" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:45.003311" elapsed="0.001937"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:10:45.006251" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:10:45.005996" elapsed="0.001079">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:10:45.007224" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:10:45.007285" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:45.005493" elapsed="0.001825"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:10:45.008208" level="FAIL">Failed to send the command: log:set INFO</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:10:45.007768" elapsed="0.000524">Failed to send the command: log:set INFO</status>
</kw>
<status status="FAIL" start="2026-04-17T03:10:45.007438" elapsed="0.000950">Failed to send the command: log:set INFO</status>
</branch>
<status status="FAIL" start="2026-04-17T03:10:45.007406" elapsed="0.001034">Failed to send the command: log:set INFO</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:45.008645" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:45.008977" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:10:45.008773" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:10:45.008746" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:10:45.009118" elapsed="0.000021"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:10:45.011527" elapsed="0.000206"/>
</kw>
<msg time="2026-04-17T03:10:45.011801" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:45.010690" elapsed="0.001200"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:45.012141" elapsed="0.000031"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:45.012367" 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-04-17T03:10:45.010231" elapsed="0.002241"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:10:45.009517" elapsed="0.003018"/>
</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="FAIL" start="2026-04-17T03:10:44.999082" elapsed="0.013552">Failed to send the command: log:set INFO</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<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="NOT RUN" start="2026-04-17T03:10:45.013149" elapsed="0.000035"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<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="NOT RUN" start="2026-04-17T03:10:45.013624" elapsed="0.000032"/>
</kw>
<doc>Initialize SetupUtils. SSH-login to mininet machine, create HTTP session,
put Python tool to mininet machine, setup imported resources.</doc>
<status status="FAIL" start="2026-04-17T03:10:40.629731" elapsed="4.384041">Failed to send the command: log:set INFO</status>
</kw>
<test id="s1-s4-t1" name="Check_For_Empty_Topology_Before_Talking" line="76">
<doc>Sanity check example-ipv4-topology is up but empty.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:10:45.013883" elapsed="0.000715">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s4-t2" name="TC_LA_Reconfigure_Odl_To_Initiate_Connection" line="81">
<doc>Configure ibgp peer with local-address.</doc>
<status status="FAIL" start="2026-04-17T03:10:45.014962" elapsed="0.000482">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s4-t3" name="TC_LA_Start_Bgp_Speaker_And_Verify_Connected" line="96">
<doc>Verify that peer is present in odl's rib under local-address ip.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:10:45.015672" elapsed="0.000627">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s4-t4" name="TC_LA_Kill_Bgp_Speaker" line="107">
<doc>Abort the Python speaker. Also, attempt to stop failing fast.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:10:45.016537" elapsed="0.000584">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s4-t5" name="TC_LA_Delete_Bgp_Peer_Configuration" line="116">
<doc>Delete peer configuration.</doc>
<status status="FAIL" start="2026-04-17T03:10:45.017348" elapsed="0.000428">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s4-t6" name="Reconfigure_ODL_To_Accept_Connection" line="124">
<doc>Configure BGP peer module with initiate-connection set to false.</doc>
<status status="FAIL" start="2026-04-17T03:10:45.018037" elapsed="0.000986">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s4-t7" name="Start_Talking_BGP_speaker" line="142">
<doc>Start Python speaker to connect to ODL, verify that the tool does not promptly exit.</doc>
<status status="FAIL" start="2026-04-17T03:10:45.019266" elapsed="0.000752">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s4-t8" name="Check_Talking_Connection_Is_Established" line="149">
<doc>See TCP (BGP) connection in established state.</doc>
<status status="FAIL" start="2026-04-17T03:10:45.020242" elapsed="0.000473">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s4-t9" name="Check_Talking_Topology_Is_Filled" line="154">
<doc>See new routes in example-ipv4-topology as a proof that synchronization was correct.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:10:45.021046" elapsed="0.000569">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s4-t10" name="TC_R_Reset_Bgp_Peer_Session" line="159">
<doc>Reset Peer Session</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:10:45.021953" elapsed="0.000418">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s4-t11" name="TC_R_Check_For_Empty_Topology_After_Resetting" line="168">
<doc>See example-ipv4-topology empty after resetting session</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:10:45.022612" elapsed="0.000658">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s4-t12" name="TC_PG_Reconfigure_ODL_With_Peer_Group_To_Accept_Connection" line="173">
<doc>Configure BGP peer module with initiate-connection set to false.</doc>
<status status="FAIL" start="2026-04-17T03:10:45.023497" elapsed="0.000640">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s4-t13" name="TC_PG_Restart_Talking_BGP_Speaker" line="202">
<doc>Abort the Python speaker. Also, attempt to stop failing fast.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:10:45.024370" elapsed="0.000530">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s4-t14" name="TC_PG_Check_Talking_Topology_Is_Filled" line="209">
<doc>See new routes in example-ipv4-topology as a proof that synchronization was correct.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:10:45.025205" elapsed="0.000558">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s4-t15" name="TC_PG_Reconfigure_ODL_With_Peer_Group_Without_Ipv4_Unicast" line="214">
<doc>Configure BGP peer module with initiate-connection set to false.</doc>
<status status="FAIL" start="2026-04-17T03:10:45.026005" elapsed="0.000562">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s4-t16" name="TC_PG_Check_For_Empty_Topology_After_Deconfiguration" line="219">
<doc>See example-ipv4-topology empty after resetting session.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:10:45.026794" elapsed="0.000642">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s4-t17" name="TC_PG_Reconfigure_ODL_To_Accept_Connection" line="224">
<doc>Configure BGP peer module with initiate-connection set to false.</doc>
<status status="FAIL" start="2026-04-17T03:10:45.027654" elapsed="0.000639">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s4-t18" name="Kill_Talking_BGP_Speaker" line="248">
<doc>Abort the Python speaker. Also, attempt to stop failing fast.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:10:45.028616" elapsed="0.000546">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s4-t19" name="Check_For_Empty_Topology_After_Talking" line="257">
<doc>See example-ipv4-topology empty again.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:10:45.029465" elapsed="0.000426">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s4-t20" name="Start_Listening_BGP_Speaker" line="262">
<doc>Start Python speaker in listening mode, verify that the tool does not exit quickly.</doc>
<status status="FAIL" start="2026-04-17T03:10:45.030163" elapsed="0.000514">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s4-t21" name="Check_Listening_Connection_Is_Not_Established_Yet" line="268">
<doc>See no TCP connection, as both ODL and tool are in listening mode.</doc>
<status status="FAIL" start="2026-04-17T03:10:45.031075" elapsed="0.000625">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s4-t22" name="Check_For_Empty_Topology_Before_Listening" line="272">
<doc>Sanity check example-ipv4-topology is still empty.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:10:45.032087" elapsed="0.000562">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s4-t23" name="Reconfigure_ODL_To_Initiate_Connection" line="277">
<doc>Replace BGP peer config module, now with initiate-connection set to true.</doc>
<status status="FAIL" start="2026-04-17T03:10:45.033168" elapsed="0.000550">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s4-t24" name="Check_Listening_Connection_Is_Established" line="294">
<doc>See TCP (BGP) connection in established state.</doc>
<status status="FAIL" start="2026-04-17T03:10:45.033959" elapsed="0.000470">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s4-t25" name="Check_Listening_Topology_Is_Filled" line="298">
<doc>See new routes in example-ipv4-topology as a proof that synchronization was correct.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:10:45.034646" elapsed="0.000582">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s4-t26" name="Kill_Listening_BGP_Speaker" line="303">
<doc>Abort the Python speaker. Also, attempt to stop failing fast.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:10:45.035473" elapsed="0.000581">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s4-t27" name="Check_For_Empty_Topology_After_Listening" line="312">
<doc>Post-condition: Check example-ipv4-topology is empty again.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:10:45.036264" elapsed="0.000481">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s4-t28" name="Start_Listening_BGP_Speaker_Case_2" line="317">
<doc>BGP Speaker introduces 2 prefixes in the first update &amp; another 2 prefixes while the very first is withdrawn in 2nd update</doc>
<status status="FAIL" start="2026-04-17T03:10:45.036964" elapsed="0.000655">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s4-t29" name="Check_Listening_Connection_Is_Established_Case_2" line="323">
<doc>See TCP (BGP) connection in established state.</doc>
<status status="FAIL" start="2026-04-17T03:10:45.037826" elapsed="0.000517">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s4-t30" name="Check_Listening_Topology_Is_Filled_Case_2" line="327">
<doc>See new routes in example-ipv4-topology as a proof that synchronization was correct.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:10:45.038566" elapsed="0.000712">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s4-t31" name="Kill_Listening_BGP_Speaker_Case_2" line="332">
<doc>Abort the Python speaker. Also, attempt to stop failing fast.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:10:45.039546" elapsed="0.000523">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s4-t32" name="Check_For_Empty_Topology_After_Listening_Case_2" line="341">
<doc>Post-condition: Check example-ipv4-topology is empty again.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:10:45.040263" elapsed="0.000550">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s4-t33" name="Start_Listening_BGP_Speaker_Case_3" line="346">
<doc>BGP Speaker introduces 3 prefixes while the first one occures again in the withdrawn list (to be ignored by controller)</doc>
<status status="FAIL" start="2026-04-17T03:10:45.041040" elapsed="0.000515">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s4-t34" name="Check_Listening_Connection_Is_Established_Case_3" line="352">
<doc>See TCP (BGP) connection in established state.</doc>
<status status="FAIL" start="2026-04-17T03:10:45.041821" elapsed="0.000453">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s4-t35" name="Check_Listening_Topology_Is_Filled_Case_3" line="356">
<doc>See new routes in example-ipv4-topology as a proof that synchronization was correct.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:10:45.042487" elapsed="0.000645">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s4-t36" name="Kill_Listening_BGP_Speaker_Case_3" line="361">
<doc>Abort the Python speaker. Also, attempt to stop failing fast.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:10:45.043315" elapsed="0.000399">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s4-t37" name="Check_For_Empty_Topology_After_Listening_Case_3" line="370">
<doc>Post-condition: Check example-ipv4-topology is empty again.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:10:45.043920" elapsed="0.000488">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s4-t38" name="Delete_Bgp_Peer_Configuration" line="375">
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="FAIL" start="2026-04-17T03:10:45.044697" elapsed="0.000485">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</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-04-17T03:10:45.047585" level="INFO">Executing command 'ps -elf | egrep python | egrep 'play.py' | egrep -v grep'.</msg>
<msg time="2026-04-17T03:10:45.071496" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-17T03:10:45.071762" 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-04-17T03:10:45.047388" elapsed="0.024412"/>
</kw>
<return>
<value>${processes}</value>
<status status="PASS" start="2026-04-17T03:10:45.071963" elapsed="0.000074"/>
</return>
<msg time="2026-04-17T03:10:45.072305" 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-04-17T03:10:45.047074" elapsed="0.025278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:45.073276" level="INFO"/>
<arg>${processes}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:45.072681" elapsed="0.000660"/>
</kw>
<kw name="Kill_Remote_Processes" owner="KillPythonTool">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-17T03:10:45.074971" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:10:45.075107" 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-04-17T03:10:45.074444" elapsed="0.000697"/>
</kw>
<if>
<branch type="IF" condition="${arg_length} == 0">
<return>
<status status="PASS" start="2026-04-17T03:10:45.075438" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-04-17T03:10:45.075254" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:45.075222" elapsed="0.000335"/>
</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-04-17T03:10:45.075817" elapsed="0.000048"/>
</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-04-17T03:10:45.076178" elapsed="0.000036"/>
</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-04-17T03:10:45.076486" elapsed="0.000034"/>
</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-04-17T03:10:45.073754" elapsed="0.002877"/>
</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-04-17T03:10:45.046296" elapsed="0.030422"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-17T03:10:45.077134" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-17T03:10:45.077000" elapsed="0.000285"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-04-17T03:10:45.077549" elapsed="0.000544"/>
</kw>
<doc>Make sure Python tool was killed, delete all sessions, tear down imported Resources.</doc>
<status status="PASS" start="2026-04-17T03:10:45.045893" elapsed="0.032283"/>
</kw>
<doc>Basic tests for odl-bgpcep-bgp-all feature.

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

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

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

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

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

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

Brief description how to perform BGP functional test:
https://wiki.opendaylight.org/view/BGP_LS_PCEP:Lithium_Feature_Tests#How_to_test_2</doc>
<status status="FAIL" start="2026-04-17T03:10:40.539277" elapsed="4.538945">Suite setup failed:
Failed to send the command: log:set INFO</status>
</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-04-17T03:10:45.173216" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:10:45.168742" elapsed="0.004595"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-17T03:10:45.168511" elapsed="0.004898"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-17T03:10:45.178401" 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-04-17T03:10:45.174560" elapsed="0.003870"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-17T03:10:45.178647" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:45.178517" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:45.178493" elapsed="0.000237"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:10:45.179364" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:10:45.178887" elapsed="0.000521"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-17T03:10:45.179896" 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-04-17T03:10:45.179573" elapsed="0.000349"/>
</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-04-17T03:10:45.180449" elapsed="0.000291"/>
</kw>
<msg time="2026-04-17T03:10:45.180838" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:10:45.180885" level="INFO">${possibly_int_of_members} = 1</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:45.180111" elapsed="0.000797"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:10:45.181466" 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-04-17T03:10:45.181092" elapsed="0.000400"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:10:45.182487" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:10:45.182213" elapsed="0.000300"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:10:45.182917" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:10:45.182663" elapsed="0.000295"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:10:45.183456" 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-04-17T03:10:45.183160" 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-04-17T03:10:45.187963" elapsed="0.000212"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:10:45.188667" level="INFO">${member_ip} = 10.30.170.120</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:10:45.188334" elapsed="0.000359"/>
</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-04-17T03:10:45.188844" elapsed="0.000246"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:10:45.189867" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:10:45.189573" elapsed="0.000320"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-17T03:10:45.189954" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:10:45.190116" 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-04-17T03:10:45.189284" elapsed="0.000856"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:10:45.190731" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.120:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a44256bce90&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-04-17T03:10:45.190293" elapsed="0.000577"/>
</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-04-17T03:10:45.191074" elapsed="0.000211"/>
</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-04-17T03:10:45.187273" elapsed="0.004072"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:10:45.186892" elapsed="0.004498"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-04-17T03:10:45.183537" elapsed="0.007886"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:10:45.192010" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:10:45.191582" elapsed="0.000472"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:10:45.192615" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.120'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:10:45.192213" elapsed="0.000449"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:10:45.193277" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:10:45.192869" elapsed="0.000451"/>
</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-04-17T03:10:45.181744" elapsed="0.011633"/>
</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-04-17T03:10:45.174210" elapsed="0.019221"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:10:45.193608" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:45.193495" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:45.193477" elapsed="0.000198"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:10:45.197387" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:10:45.196827" elapsed="0.000597"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:10:45.198079" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:10:45.197643" elapsed="0.000472"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:10:45.198177" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:10:45.198394" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:10:45.196370" elapsed="0.002058"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:10:45.199864" level="INFO">${member_ip} = 10.30.170.120</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-04-17T03:10:45.199492" elapsed="0.000408"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:45.200952" 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-04-17T03:10:45.201095" 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-04-17T03:10:45.200716" elapsed="0.000415"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:45.205860" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:10:45.205181" elapsed="0.000810"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:45.205159" elapsed="0.000878"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:45.206877" 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-04-17T03:10:45.207185" 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-04-17T03:10:45.206304" elapsed="0.000934"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:45.208290" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.120" 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-04-17T03:10:45.207509" elapsed="0.000900"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:45.209785" 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-04-17T03:10:45.208680" elapsed="0.001169"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-17T03:10:45.212178" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:10:45.212398" 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-04-17T03:10:45.211619" elapsed="0.000833"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:45.212879" elapsed="0.000566"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:10:45.214587" level="INFO">Logging into '10.30.170.120:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:10:45.540824" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 17 03:10:22 UTC 2026

  System load:  0.2                Processes:             122
  Usage of /:   10.4% of 77.35GB   Users logged in:       0
  Memory usage: 2%                 IPv4 address for ens3: 10.30.170.120
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:10:41 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:10:45.214257" elapsed="0.326836"/>
</kw>
<msg time="2026-04-17T03:10:45.541177" 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-04-17T03:10:45.213791" elapsed="0.327547"/>
</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-04-17T03:10:45.210430" elapsed="0.331058"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:10:45.542367" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-17T03:10:45.554736" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-17T03:10:45.554973" level="INFO">${stdout} = </msg>
<msg time="2026-04-17T03:10:45.555084" 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-04-17T03:10:45.541855" elapsed="0.013280"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:10:45.555530" elapsed="0.000569"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:45.557283" 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-04-17T03:10:45.556688" elapsed="0.000700"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-17T03:10:45.557825" elapsed="0.000052"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:45.557560" elapsed="0.000411"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:45.557533" elapsed="0.000477"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:10:45.558315" elapsed="0.000063"/>
</return>
<status status="PASS" start="2026-04-17T03:10:45.558090" elapsed="0.000367"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:45.558073" elapsed="0.000423"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-17T03:10:45.558556" elapsed="0.000016"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:45.563153" 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="PASS" start="2026-04-17T03:10:45.564358" elapsed="0.000389"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:10:45.565242" elapsed="0.000304"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:10:45.559056" elapsed="0.006587"/>
</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-04-17T03:10:45.203846" elapsed="0.362035"/>
</kw>
<msg time="2026-04-17T03:10:45.565981" 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-04-17T03:10:45.202742" elapsed="0.363316"/>
</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-04-17T03:10:45.202061" elapsed="0.364109"/>
</kw>
<msg time="2026-04-17T03:10:45.566226" 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-04-17T03:10:45.201344" elapsed="0.364945"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:45.570171" elapsed="0.000436"/>
</kw>
<kw name="Open 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-04-17T03:10:45.570830" elapsed="0.000223"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:10:45.571258" elapsed="0.000198"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:10:45.566752" elapsed="0.004784"/>
</kw>
<msg time="2026-04-17T03:10:45.571662" 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-04-17T03:10:45.200220" elapsed="0.371476"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:45.572154" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:45.571884" elapsed="0.000312"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-17T03:10:45.572239" elapsed="0.000030"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-17T03:10:45.198946" elapsed="0.373417"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:10:45.198677" elapsed="0.373790"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:10:45.198501" elapsed="0.374007"/>
</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-04-17T03:10:45.193889" elapsed="0.378677"/>
</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-04-17T03:10:45.572723" elapsed="0.000320"/>
</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-04-17T03:10:45.586987" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:45.586861" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:45.586841" elapsed="0.000215"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:45.587346" 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-04-17T03:10:45.587506" 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-04-17T03:10:45.587209" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:45.587968" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:45.587690" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:45.588406" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:45.588164" elapsed="0.000285"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:10:45.589250" 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-04-17T03:10:45.589024" elapsed="0.000345">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-17T03:10:45.589478" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:10:45.589523" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:45.588635" elapsed="0.000910"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:45.589861" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:10:45.589618" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:45.589601" elapsed="0.000380"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:10:45.590729" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:10:45.590458" elapsed="0.000296"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:10:45.590801" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:10:45.590969" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:10:45.590182" elapsed="0.000812"/>
</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-04-17T03:10:45.591166" elapsed="0.000438"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:45.591876" level="INFO">index=4
host=10.30.170.120
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-04-17T03:10:45.591994" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.120
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-04-17T03:10:45.591771" elapsed="0.000250"/>
</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-04-17T03:10:45.592168" elapsed="0.002415"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:10:45.595028" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:10:45.596266" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:10:45.594747" elapsed="0.001956">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:45.599826" elapsed="0.000360"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-17T03:10:45.600347" elapsed="0.000145"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:10:45.600636" 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-04-17T03:10:45.597548" elapsed="0.003235"/>
</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-04-17T03:10:45.597013" elapsed="0.003870"/>
</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="FAIL" start="2026-04-17T03:10:45.586574" elapsed="0.014416">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:10:46.619922" elapsed="0.000044"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:46.619737" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:46.619707" elapsed="0.000339"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:46.620510" 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-04-17T03:10:46.620640" 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-04-17T03:10:46.620239" elapsed="0.000429"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:46.621268" 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-04-17T03:10:46.620866" elapsed="0.000464"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:46.621855" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:46.621525" elapsed="0.000387"/>
</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-04-17T03:10:46.622683" elapsed="0.000259"/>
</kw>
<msg time="2026-04-17T03:10:46.623078" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:10:46.623139" level="INFO">${old_connection_index} = 4</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:46.622138" elapsed="0.001031"/>
</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-04-17T03:10:46.624259" elapsed="0.000225"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:10:46.625394" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:10:46.625166" elapsed="0.000951">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:46.624704" elapsed="0.001493"/>
</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-04-17T03:10:46.626847" elapsed="0.000157"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:46.626418" elapsed="0.000645"/>
</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-04-17T03:10:46.623570" elapsed="0.003551"/>
</kw>
<status status="PASS" start="2026-04-17T03:10:46.623269" elapsed="0.003914"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:46.623244" elapsed="0.003976"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:10:46.628147" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:10:46.627831" elapsed="0.000342"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:10:46.628225" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:10:46.628433" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:10:46.627511" elapsed="0.000955"/>
</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-04-17T03:10:46.628625" elapsed="0.000672"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:46.629705" level="INFO">index=6
host=10.30.170.120
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-04-17T03:10:46.629851" level="INFO">${karaf_connection_object} = index=6
host=10.30.170.120
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-04-17T03:10:46.629545" elapsed="0.000343"/>
</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-04-17T03:10:46.630138" elapsed="0.003439"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:10:46.634035" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:10:46.635361" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:10:46.633743" elapsed="0.002090">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:46.638983" elapsed="0.000416"/>
</kw>
<kw name="Open 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-04-17T03:10:46.639562" elapsed="0.000183"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:10:46.639916" elapsed="0.000121"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:10:46.636776" elapsed="0.003313"/>
</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-04-17T03:10:46.636171" elapsed="0.003964"/>
</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="FAIL" start="2026-04-17T03:10:46.619291" elapsed="0.020928">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:10:47.659349" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:47.659189" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:47.659152" elapsed="0.000303"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:47.659881" 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-04-17T03:10:47.660032" 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-04-17T03:10:47.659672" elapsed="0.000387"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:47.660656" level="INFO">{1: 6}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:47.660251" elapsed="0.000453"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:47.661144" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:47.660859" elapsed="0.000330"/>
</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-04-17T03:10:47.661872" elapsed="0.000320"/>
</kw>
<msg time="2026-04-17T03:10:47.662300" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:10:47.662347" level="INFO">${old_connection_index} = 6</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:47.661352" elapsed="0.001017"/>
</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-04-17T03:10:47.663274" elapsed="0.000150"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:10:47.664200" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:10:47.663990" elapsed="0.000740">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:47.663592" elapsed="0.001201"/>
</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-04-17T03:10:47.665335" elapsed="0.000102"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:47.665002" elapsed="0.000481"/>
</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-04-17T03:10:47.662690" elapsed="0.002836"/>
</kw>
<status status="PASS" start="2026-04-17T03:10:47.662450" elapsed="0.003124"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:47.662430" elapsed="0.003173"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:10:47.666479" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:10:47.666196" elapsed="0.000309"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:10:47.666555" elapsed="0.000052"/>
</return>
<msg time="2026-04-17T03:10:47.666863" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:10:47.665832" elapsed="0.001084"/>
</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-04-17T03:10:47.667210" elapsed="0.000632"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:47.668366" level="INFO">index=8
host=10.30.170.120
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-04-17T03:10:47.668517" level="INFO">${karaf_connection_object} = index=8
host=10.30.170.120
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-04-17T03:10:47.668195" elapsed="0.000364"/>
</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-04-17T03:10:47.668810" elapsed="0.003372"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:10:47.672732" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:10:47.674174" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:10:47.672424" elapsed="0.002368">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:47.678906" elapsed="0.000494"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-17T03:10:47.679636" elapsed="0.000436"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:10:47.680261" elapsed="0.000139"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:10:47.676063" elapsed="0.004411"/>
</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-04-17T03:10:47.675272" elapsed="0.005267"/>
</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="FAIL" start="2026-04-17T03:10:47.658626" elapsed="0.022041">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:10:48.701648" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:48.701449" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:48.701419" elapsed="0.000342"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:48.702260" 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-04-17T03:10:48.702402" 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-04-17T03:10:48.702048" elapsed="0.000384"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:48.703077" level="INFO">{1: 8}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:48.702665" elapsed="0.000462"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:48.703569" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:48.703297" elapsed="0.000332"/>
</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-04-17T03:10:48.704293" elapsed="0.000222"/>
</kw>
<msg time="2026-04-17T03:10:48.704639" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:10:48.704691" level="INFO">${old_connection_index} = 8</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:48.703811" elapsed="0.000904"/>
</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-04-17T03:10:48.705673" elapsed="0.000154"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:10:48.706710" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:10:48.706471" elapsed="0.000818">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:48.706013" elapsed="0.001343"/>
</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-04-17T03:10:48.708134" elapsed="0.000110"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:48.707553" elapsed="0.000752"/>
</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-04-17T03:10:48.705054" elapsed="0.003311"/>
</kw>
<status status="PASS" start="2026-04-17T03:10:48.704795" elapsed="0.003622"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:48.704775" elapsed="0.003776"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:10:48.709529" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:10:48.709183" elapsed="0.000381"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:10:48.709627" elapsed="0.000050"/>
</return>
<msg time="2026-04-17T03:10:48.709854" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:10:48.708841" elapsed="0.001039"/>
</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-04-17T03:10:48.710058" elapsed="0.000593"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:48.711031" level="INFO">index=10
host=10.30.170.120
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-04-17T03:10:48.711166" level="INFO">${karaf_connection_object} = index=10
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:10:48.710892" elapsed="0.000303"/>
</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-04-17T03:10:48.711359" elapsed="0.003261"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:10:48.715260" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:10:48.716691" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:10:48.714852" elapsed="0.002540">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:48.721084" elapsed="0.000389"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-17T03:10:48.721646" elapsed="0.000169"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:10:48.721998" elapsed="0.000121"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:10:48.718514" elapsed="0.003659"/>
</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-04-17T03:10:48.717788" elapsed="0.004436"/>
</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="FAIL" start="2026-04-17T03:10:48.700718" elapsed="0.021598">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:10:48.722413" level="FAIL">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<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="FAIL" start="2026-04-17T03:10:45.573766" elapsed="3.148747">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:45.573397" elapsed="3.149200"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:10:45.573256" elapsed="3.149392"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-04-17T03:10:45.573104" elapsed="3.149584"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-17T03:10:45.173731" elapsed="3.549023"/>
</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-04-17T03:10:48.725984" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:48.725808" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:48.725782" elapsed="0.000311"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:10:48.731615" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:48.731494" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:48.731475" elapsed="0.000210"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:10:48.732725" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:10:48.732295" elapsed="0.000459"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:10:48.733245" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:10:48.732916" elapsed="0.000356"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:10:48.733387" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:10:48.733560" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:10:48.731924" elapsed="0.001662"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:10:48.739757" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:48.739624" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:48.739602" elapsed="0.000271"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:10:48.742151" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:48.741738" elapsed="0.000486"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:48.741709" elapsed="0.000548"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:10:48.743040" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:10:48.742476" elapsed="0.000607"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:48.743650" 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-04-17T03:10:48.743319" elapsed="0.000367"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:10:48.744971" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:10:48.744455" elapsed="0.001350">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:10:48.746158" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:10:48.746209" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:48.743894" elapsed="0.002340"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:10:48.747711" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:10:48.747063" elapsed="0.002272">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:10:48.749544" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:10:48.749613" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:48.746435" elapsed="0.003213"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:10:48.751407" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/bgp_ipv6_basic.robot"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:10:48.750339" elapsed="0.001190">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/bgp_ipv6_basic.robot"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:10:48.749765" elapsed="0.001975">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/bgp_ipv6_basic.robot"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:10:48.749734" elapsed="0.002058">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/bgp_ipv6_basic.robot"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:48.752325" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:48.752665" elapsed="0.000077"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:10:48.752457" elapsed="0.000423"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:10:48.752431" elapsed="0.000486"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:10:48.752988" 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">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:48.756239" elapsed="0.000684"/>
</kw>
<kw name="Open 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-04-17T03:10:48.757547" elapsed="0.000685"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:10:48.758702" elapsed="0.000428"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:10:48.754746" elapsed="0.004579"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:10:48.753386" 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="FAIL" start="2026-04-17T03:10:48.741256" elapsed="0.018422">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/bgp_ipv6_basic.robot"</status>
</kw>
<msg time="2026-04-17T03:10:48.760022" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:10:48.760108" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/bgp_ipv6_basic.robot"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:48.740173" elapsed="0.019972"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:10:48.760456" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:48.760266" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:48.760236" elapsed="0.000360"/>
</if>
<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-04-17T03:10:48.762078" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:48.761900" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:48.761875" elapsed="0.000297"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:48.763187" 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-04-17T03:10:48.763351" 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-04-17T03:10:48.762444" elapsed="0.000944"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:48.764021" level="INFO">{1: 10}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:48.763606" elapsed="0.000465"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:48.764471" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:48.764224" elapsed="0.000291"/>
</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-04-17T03:10:48.765079" elapsed="0.000301"/>
</kw>
<msg time="2026-04-17T03:10:48.765479" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:10:48.765526" level="INFO">${old_connection_index} = 10</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:48.764671" elapsed="0.000877"/>
</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-04-17T03:10:48.766672" elapsed="0.000317"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:10:48.768502" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:10:48.768203" elapsed="0.000873">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:48.767269" elapsed="0.001902"/>
</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-04-17T03:10:48.770236" elapsed="0.000235"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:48.769412" elapsed="0.001136"/>
</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-04-17T03:10:48.765847" elapsed="0.004785"/>
</kw>
<status status="PASS" start="2026-04-17T03:10:48.765624" elapsed="0.005059"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:48.765606" elapsed="0.005103"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:10:48.771822" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:10:48.771306" elapsed="0.000547"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:10:48.771908" elapsed="0.000067"/>
</return>
<msg time="2026-04-17T03:10:48.772133" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:10:48.770969" elapsed="0.001190"/>
</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-04-17T03:10:48.772323" elapsed="0.000419"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:48.773132" level="INFO">index=13
host=10.30.170.120
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-04-17T03:10:48.773239" level="INFO">${karaf_connection_object} = index=13
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:10:48.772910" elapsed="0.000356"/>
</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-04-17T03:10:48.773414" elapsed="0.002356"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:10:48.776295" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:10:48.777733" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:10:48.776009" elapsed="0.003033">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:48.788527" elapsed="0.000977"/>
</kw>
<kw name="Open 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-04-17T03:10:48.789878" elapsed="0.000660"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:10:48.790867" elapsed="0.000350"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:10:48.781542" elapsed="0.009942"/>
</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-04-17T03:10:48.779894" elapsed="0.011666"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:10:48.761536" elapsed="0.030164">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:48.792125" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:10:48.792206" 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="FAIL" start="2026-04-17T03:10:48.739284" elapsed="0.053037">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:10:48.792435" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:10:48.792482" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:48.733996" elapsed="0.058510"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:48.792856" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:10:48.792589" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:48.792568" elapsed="0.000393"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:10:48.733835" elapsed="0.059153"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:10:48.733645" elapsed="0.059387"/>
</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-04-17T03:10:48.731172" elapsed="0.061917"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-17T03:10:48.723477" elapsed="0.069675"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:48.722983" elapsed="0.070222"/>
</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-04-17T03:10:45.168192" elapsed="3.625075"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:10:48.793897" level="INFO">${conn_id} = 15</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-04-17T03:10:48.793457" elapsed="0.000468"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:10:48.794511" level="INFO">${conn_id} = 15</msg>
<arg>${conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:10:48.794130" elapsed="0.000425"/>
</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-04-17T03:10:48.796650" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:10:48.796752" 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-04-17T03:10:48.796311" elapsed="0.000466"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:48.797034" elapsed="0.000341"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:10:48.798433" level="INFO">Logging into '10.30.170.120:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:10:49.133672" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 17 03:10:22 UTC 2026

  System load:  0.2                Processes:             122
  Usage of /:   10.4% of 77.35GB   Users logged in:       0
  Memory usage: 2%                 IPv4 address for ens3: 10.30.170.120
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:10:45 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:10:48.798024" elapsed="0.335965"/>
</kw>
<msg time="2026-04-17T03:10:49.134092" 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-04-17T03:10:48.797581" elapsed="0.336599"/>
</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-04-17T03:10:48.795725" elapsed="0.338565"/>
</kw>
<msg time="2026-04-17T03:10:49.134345" 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-04-17T03:10:48.795247" elapsed="0.339146"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-17T03:10:48.794819" elapsed="0.339651"/>
</kw>
<kw name="Configure_Ipv6_Network">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:10:49.135223" level="INFO">Executing command 'ip route | grep '^default' | awk '{print $5}''.</msg>
<msg time="2026-04-17T03:10:49.148064" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:10:49.148434" 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-04-17T03:10:49.135096" elapsed="0.013410"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:49.149920" 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-04-17T03:10:49.149097" elapsed="0.001019"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:10:49.151173" level="INFO">Executing command 'sudo ip -6 addr add 2607:f0d0:1002:0011:0000:0000:0000:0002/64 dev ens3'.</msg>
<msg time="2026-04-17T03:10:49.211769" 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-04-17T03:10:49.150554" elapsed="0.061520"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:10:49.213059" level="INFO">Executing command 'sudo ip -6 route add default via 2607:f0d0:1002:0011:0000:0000:0000:0001'.</msg>
<msg time="2026-04-17T03:10:49.269604" 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-04-17T03:10:49.212596" elapsed="0.057239"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:10:49.270664" level="INFO">Executing command 'sudo ip -6 addr show'.</msg>
<msg time="2026-04-17T03:10:49.333465" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:10:49.333691" 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-04-17T03:10:49.270375" elapsed="0.063354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:49.334559" 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:fe64:de5a/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-04-17T03:10:49.334123" elapsed="0.000492"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:10:49.334958" level="INFO">Executing command 'sudo ip -6 route show'.</msg>
<msg time="2026-04-17T03:10:49.393733" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:10:49.394326" 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-04-17T03:10:49.334830" elapsed="0.059560"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:49.396069" 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-04-17T03:10:49.395157" elapsed="0.000993"/>
</kw>
<doc>Reconfigures basic network settings on controller</doc>
<status status="PASS" start="2026-04-17T03:10:49.134714" elapsed="0.261547"/>
</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-04-17T03:10:49.405165" level="INFO">${cd_and_command} = cd '.' &amp;&amp; virtualenv /tmp/defaultvenv</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:10:49.404645" elapsed="0.000561"/>
</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-04-17T03:10:49.407573" level="INFO">Executing command 'cd '.' &amp;&amp; virtualenv /tmp/defaultvenv'.</msg>
<msg time="2026-04-17T03:10:49.945165" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:10:49.945549" level="INFO">${stdout} = created virtual environment CPython3.10.12.final.0-64 in 313ms
  creator CPython3Posix(dest=/tmp/defaultvenv, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=b...</msg>
<msg time="2026-04-17T03:10:49.945650" level="INFO">${stderr} = </msg>
<msg time="2026-04-17T03:10:49.945736" 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-04-17T03:10:49.407214" elapsed="0.538574"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:10:49.947716" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-04-17T03:10:49.947047" elapsed="0.000931"/>
</kw>
<msg time="2026-04-17T03:10:49.948188" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-04-17T03:10:49.948285" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:49.946288" elapsed="0.002049"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:10:49.949547" 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-04-17T03:10:49.948673" 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-04-17T03:10:49.951752" level="INFO">created virtual environment CPython3.10.12.final.0-64 in 313ms
  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-04-17T03:10:49.951206" elapsed="0.000624"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:49.952660" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:49.952157" elapsed="0.000588"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:49.953585" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:49.953093" elapsed="0.000579"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-04-17T03:10:49.950539" elapsed="0.003247"/>
</kw>
<status status="PASS" start="2026-04-17T03:10:49.949773" elapsed="0.004085"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:49.949725" elapsed="0.004191"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-04-17T03:10:49.954270" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:49.954065" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:49.954030" elapsed="0.000382"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:10:49.954702" elapsed="0.000063"/>
</return>
<status status="PASS" start="2026-04-17T03:10:49.954525" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:49.954493" elapsed="0.000381"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:49.955173" 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-04-17T03:10:49.406300" elapsed="0.549104"/>
</kw>
<msg time="2026-04-17T03:10:49.955515" 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-04-17T03:10:49.405432" elapsed="0.550182"/>
</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-04-17T03:10:49.403698" elapsed="0.552201"/>
</kw>
<msg time="2026-04-17T03:10:49.956034" 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-04-17T03:10:49.397918" elapsed="0.558203"/>
</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-04-17T03:10:49.397252" elapsed="0.559075"/>
</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-04-17T03:10:49.966284" level="INFO">${cd_and_command} = cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install --upgrade pip; deactivate</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:10:49.965744" elapsed="0.000584"/>
</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-04-17T03:10:49.968762" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install --upgrade pip; deactivate'.</msg>
<msg time="2026-04-17T03:10:52.277482" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:10:52.278211" level="INFO">${stdout} = Requirement already satisfied: pip in /tmp/defaultvenv/lib/python3.10/site-packages (22.0.2)
Collecting pip
  Downloading pip-26.0.1-py3-none-any.whl (1.8 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━...</msg>
<msg time="2026-04-17T03:10:52.278413" level="INFO">${stderr} = </msg>
<msg time="2026-04-17T03:10:52.278577" 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-04-17T03:10:49.968324" elapsed="2.310342"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:10:52.284304" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-04-17T03:10:52.283096" elapsed="0.001468"/>
</kw>
<msg time="2026-04-17T03:10:52.284914" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-04-17T03:10:52.285152" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:10:52.279641" elapsed="0.005693"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:10:52.287666" 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-04-17T03:10:52.285954" elapsed="0.001773"/>
</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-04-17T03:10:52.291413" level="INFO">Requirement already satisfied: pip in /tmp/defaultvenv/lib/python3.10/site-packages (22.0.2)
Collecting pip
  Downloading pip-26.0.1-py3-none-any.whl (1.8 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.8/1.8 MB 29.6 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.0.1</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:52.290764" elapsed="0.000795"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:52.292750" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:52.292221" elapsed="0.000670"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:10:52.294003" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:10:52.293505" elapsed="0.000596"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-04-17T03:10:52.289424" elapsed="0.004778"/>
</kw>
<status status="PASS" start="2026-04-17T03:10:52.288117" elapsed="0.006202"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:52.288077" elapsed="0.006275"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-04-17T03:10:52.294596" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:10:52.294413" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:52.294396" elapsed="0.000342"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:10:52.294988" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-17T03:10:52.294792" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-04-17T03:10:52.294777" elapsed="0.000383"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:10:52.295309" elapsed="0.000023"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-04-17T03:10:49.967464" elapsed="2.328032"/>
</kw>
<msg time="2026-04-17T03:10:52.295555" 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-04-17T03:10:49.966580" elapsed="2.329032"/>
</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-04-17T03:10:49.964741" elapsed="2.330952"/>
</kw>
<msg time="2026-04-17T03:10:52.295747" 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-04-17T03:10:49.959592" elapsed="2.336200"/>
</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-04-17T03:10:49.958796" elapsed="2.337074"/>
</kw>
<msg time="2026-04-17T03:10:52.295919" 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-04-17T03:10:49.957958" elapsed="2.338121"/>
</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-04-17T03:10:49.957425" elapsed="2.338740"/>
</kw>
<msg time="2026-04-17T03:10:52.296209" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${upgrade_pip}</arg>
<arg>Virtual_Env_Run_Cmd_At_Cwd</arg>
<arg>pip install --upgrade pip</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:49.956641" elapsed="2.339611"/>
</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-04-17T03:10:49.396687" elapsed="2.899640"/>
</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-04-17T03:10:52.304082" level="INFO">${cd_and_command} = cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install setuptools==44.0.0; deactivate</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:10:52.303714" elapsed="0.000398"/>
</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-04-17T03:10:52.305963" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install setuptools==44.0.0; deactivate'.</msg>
<msg time="2026-04-17T03:11:21.392308" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:11:21.393036" 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-04-17T03:11:21.393165" level="INFO">${stderr} = </msg>
<msg time="2026-04-17T03:11:21.393261" 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-04-17T03:10:52.305578" elapsed="29.087736"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:11:21.399144" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-04-17T03:11:21.397668" elapsed="0.001770"/>
</kw>
<msg time="2026-04-17T03:11:21.399851" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-04-17T03:11:21.400036" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:11:21.394323" elapsed="0.005790"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:11:21.402642" 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-04-17T03:11:21.400796" elapsed="0.001886"/>
</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-04-17T03:11:21.406124" 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 10.1 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-04-17T03:11:21.405568" elapsed="0.000661"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:11:21.407204" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:11:21.406662" elapsed="0.000632"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:11:21.408335" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:11:21.407722" 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-04-17T03:11:21.404190" elapsed="0.004343"/>
</kw>
<status status="PASS" start="2026-04-17T03:11:21.402905" elapsed="0.005756"/>
</branch>
<status status="PASS" start="2026-04-17T03:11:21.402867" elapsed="0.005844"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-04-17T03:11:21.409086" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:11:21.408824" elapsed="0.000406"/>
</branch>
<status status="PASS" start="2026-04-17T03:11:21.408793" elapsed="0.000473"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:11:21.409616" elapsed="0.000049"/>
</return>
<status status="PASS" start="2026-04-17T03:11:21.409343" elapsed="0.000451"/>
</branch>
<status status="PASS" start="2026-04-17T03:11:21.409320" elapsed="0.000515"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:11:21.410007" elapsed="0.000024"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-04-17T03:10:52.304902" elapsed="29.105251"/>
</kw>
<msg time="2026-04-17T03:11:21.410213" 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-04-17T03:10:52.304273" elapsed="29.105995"/>
</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-04-17T03:10:52.303099" elapsed="29.107287"/>
</kw>
<msg time="2026-04-17T03:11:21.410447" 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-04-17T03:10:52.298999" elapsed="29.111496"/>
</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-04-17T03:10:52.298186" elapsed="29.112488"/>
</kw>
<msg time="2026-04-17T03:11:21.410728" 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-04-17T03:10:52.297769" elapsed="29.113004"/>
</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-04-17T03:10:52.297332" elapsed="29.113529"/>
</kw>
<msg time="2026-04-17T03:11:21.410917" 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-04-17T03:10:52.296862" elapsed="29.114138"/>
</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-04-17T03:10:52.296597" elapsed="29.114490"/>
</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-04-17T03:11:21.419023" level="INFO">${cd_and_command} = cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install exabgp==4.2.4; deactivate</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:11:21.418659" elapsed="0.000395"/>
</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-04-17T03:11:21.421045" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install exabgp==4.2.4; deactivate'.</msg>
<msg time="2026-04-17T03:11:55.165995" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:11:55.166859" 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-04-17T03:11:55.167081" level="INFO">${stderr} = </msg>
<msg time="2026-04-17T03:11:55.167200" 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-04-17T03:11:21.420639" elapsed="33.746675"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:11:55.173995" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-04-17T03:11:55.172537" elapsed="0.001720"/>
</kw>
<msg time="2026-04-17T03:11:55.174594" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-04-17T03:11:55.174696" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:11:55.168425" elapsed="0.006322"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:11:55.177380" 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-04-17T03:11:55.175282" elapsed="0.002163"/>
</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-04-17T03:11:55.181799" 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=99090bc93e7a46b968b1bbfd0ad693faf60a4d5f3b6649620a7f04a5f3453c83
  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-04-17T03:11:55.181461" elapsed="0.000415"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:11:55.182506" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:11:55.182185" elapsed="0.000386"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:11:55.183202" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:11:55.182862" elapsed="0.000409"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-04-17T03:11:55.179663" elapsed="0.003683"/>
</kw>
<status status="PASS" start="2026-04-17T03:11:55.177777" elapsed="0.005666"/>
</branch>
<status status="PASS" start="2026-04-17T03:11:55.177704" elapsed="0.005768"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-04-17T03:11:55.183691" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:11:55.183533" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-04-17T03:11:55.183516" elapsed="0.000300"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:11:55.184093" elapsed="0.000049"/>
</return>
<status status="PASS" start="2026-04-17T03:11:55.183870" elapsed="0.000364"/>
</branch>
<status status="PASS" start="2026-04-17T03:11:55.183854" elapsed="0.000507"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:11:55.184518" elapsed="0.000023"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-04-17T03:11:21.419995" elapsed="33.764672"/>
</kw>
<msg time="2026-04-17T03:11:55.184730" 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-04-17T03:11:21.419239" elapsed="33.765555"/>
</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-04-17T03:11:21.417977" elapsed="33.766934"/>
</kw>
<msg time="2026-04-17T03:11:55.184989" 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-04-17T03:11:21.413571" elapsed="33.771467"/>
</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-04-17T03:11:21.412916" elapsed="33.772228"/>
</kw>
<msg time="2026-04-17T03:11:55.185197" 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-04-17T03:11:21.412522" elapsed="33.772719"/>
</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-04-17T03:11:21.412115" elapsed="33.773228"/>
</kw>
<msg time="2026-04-17T03:11:55.185390" 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-04-17T03:11:21.411599" elapsed="33.773836"/>
</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-04-17T03:11:21.411316" elapsed="33.774216"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:11:55.186026" level="INFO">Creating Session using : alias=config-session, url=http://10.30.170.120:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a44256e58d0&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-04-17T03:11:55.185690" elapsed="0.000517"/>
</kw>
<kw name="Upload_Config_Files">
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-04-17T03:11:55.236187" level="INFO">[chan 10] Opened sftp connection (server version 3)</msg>
<msg time="2026-04-17T03:11:55.249618" 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-04-17T03:11:55.186638" elapsed="0.063187"/>
</kw>
<kw name="List Files In Directory" owner="SSHLibrary">
<msg time="2026-04-17T03:11:55.259189" level="INFO">1 file:
exaipv6.cfg</msg>
<msg time="2026-04-17T03:11:55.259520" 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-04-17T03:11:55.250343" elapsed="0.009237"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:11:55.261032" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/2607:f0d0:1002:0011:0000:0000:0000:0002/g' exaipv6.cfg'.</msg>
<msg time="2026-04-17T03:11:55.273972" 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-04-17T03:11:55.260573" elapsed="0.013519"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:11:55.274676" level="INFO">Executing command 'sed -i -e 's/ODLIP/::1/g' exaipv6.cfg'.</msg>
<msg time="2026-04-17T03:11:55.324485" 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-04-17T03:11:55.274384" elapsed="0.050307"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:11:55.325662" level="INFO">Executing command 'sed -i -e 's/ROUTERID/1.2.3.4/g' exaipv6.cfg'.</msg>
<msg time="2026-04-17T03:11:55.376303" 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-04-17T03:11:55.325214" elapsed="0.051293"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:11:55.377428" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exaipv6.cfg'.</msg>
<msg time="2026-04-17T03:11:55.428001" 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-04-17T03:11:55.377024" elapsed="0.051185"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:11:55.429288" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exaipv6.cfg'.</msg>
<msg time="2026-04-17T03:11:55.480265" 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-04-17T03:11:55.428792" elapsed="0.051730"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:11:55.481787" level="INFO">Executing command 'cat exaipv6.cfg'.</msg>
<msg time="2026-04-17T03:11:55.531849" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:11:55.532210" 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-04-17T03:11:55.481251" elapsed="0.051005"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:11:55.533212" 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-04-17T03:11:55.532685" elapsed="0.000600"/>
</kw>
<var name="${cfgfile}">exaipv6.cfg</var>
<status status="PASS" start="2026-04-17T03:11:55.260231" elapsed="0.273106"/>
</iter>
<var>${cfgfile}</var>
<value>@{cfgfiles}</value>
<status status="PASS" start="2026-04-17T03:11:55.259731" elapsed="0.273661"/>
</for>
<doc>Uploads exabgp config files</doc>
<status status="PASS" start="2026-04-17T03:11:55.186419" elapsed="0.347073"/>
</kw>
<kw name="Upload_Config_Files_exabgp_ipv4">
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-04-17T03:11:55.574739" 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-04-17T03:11:55.534205" elapsed="0.040695"/>
</kw>
<kw name="List Files In Directory" owner="SSHLibrary">
<msg time="2026-04-17T03:11:55.583232" level="INFO">1 file:
exaipv4.cfg</msg>
<msg time="2026-04-17T03:11:55.583493" 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-04-17T03:11:55.575285" elapsed="0.008253"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:11:55.584562" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/127.0.0.1/g' exaipv4.cfg'.</msg>
<msg time="2026-04-17T03:11:55.597018" 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-04-17T03:11:55.584302" elapsed="0.012847"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:11:55.597781" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.120/g' exaipv4.cfg'.</msg>
<msg time="2026-04-17T03:11:55.647665" 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-04-17T03:11:55.597474" elapsed="0.050356"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:11:55.648478" level="INFO">Executing command 'sed -i -e 's/ROUTERID/127.0.0.1/g' exaipv4.cfg'.</msg>
<msg time="2026-04-17T03:11:55.695586" 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-04-17T03:11:55.648213" elapsed="0.047541"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:11:55.696452" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exaipv4.cfg'.</msg>
<msg time="2026-04-17T03:11:55.743646" 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-04-17T03:11:55.696154" elapsed="0.047662"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:11:55.744495" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exaipv4.cfg'.</msg>
<msg time="2026-04-17T03:11:55.792055" 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-04-17T03:11:55.744204" elapsed="0.048201"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:11:55.793695" level="INFO">Executing command 'cat exaipv4.cfg'.</msg>
<msg time="2026-04-17T03:11:55.839375" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:11:55.840498" level="INFO">${stdout} = neighbor 10.30.170.120 {
                  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-04-17T03:11:55.793153" elapsed="0.047541"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:11:55.841978" level="INFO">neighbor 10.30.170.120 {
                  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-04-17T03:11:55.841286" elapsed="0.000772"/>
</kw>
<var name="${cfgfile}">exaipv4.cfg</var>
<status status="PASS" start="2026-04-17T03:11:55.583995" elapsed="0.258103"/>
</iter>
<var>${cfgfile}</var>
<value>@{cfgfiles}</value>
<status status="PASS" start="2026-04-17T03:11:55.583670" elapsed="0.258477"/>
</for>
<doc>Uploads exabgp config files</doc>
<status status="PASS" start="2026-04-17T03:11:55.533810" elapsed="0.308431"/>
</kw>
<kw name="Upload_Config_Files_exabgp_graceful_restart">
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-04-17T03:11:55.887918" 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-04-17T03:11:55.842877" elapsed="0.045266"/>
</kw>
<kw name="List Files In Directory" owner="SSHLibrary">
<msg time="2026-04-17T03:11:55.895856" level="INFO">1 file:
exabgp_graceful_restart.cfg</msg>
<msg time="2026-04-17T03:11:55.896076" 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-04-17T03:11:55.888514" elapsed="0.007600"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:11:55.897095" 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-04-17T03:11:55.909741" 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-04-17T03:11:55.896821" elapsed="0.013006"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:11:55.910339" level="INFO">Executing command 'sed -i -e 's/ODLIP/::1/g' exabgp_graceful_restart.cfg'.</msg>
<msg time="2026-04-17T03:11:55.959440" 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-04-17T03:11:55.910084" elapsed="0.049582"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:11:55.960919" level="INFO">Executing command 'sed -i -e 's/ROUTERID/1.2.3.4/g' exabgp_graceful_restart.cfg'.</msg>
<msg time="2026-04-17T03:11:56.007879" 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-04-17T03:11:55.960318" elapsed="0.047812"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:11:56.009224" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exabgp_graceful_restart.cfg'.</msg>
<msg time="2026-04-17T03:11:56.056415" 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-04-17T03:11:56.008724" elapsed="0.047903"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:11:56.057575" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exabgp_graceful_restart.cfg'.</msg>
<msg time="2026-04-17T03:11:56.108560" 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-04-17T03:11:56.057143" elapsed="0.051612"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:11:56.109552" level="INFO">Executing command 'cat exabgp_graceful_restart.cfg'.</msg>
<msg time="2026-04-17T03:11:56.159848" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:11:56.160223" 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-04-17T03:11:56.109216" elapsed="0.051076"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:11:56.161498" 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-04-17T03:11:56.160784" elapsed="0.000821"/>
</kw>
<var name="${cfgfile}">exabgp_graceful_restart.cfg</var>
<status status="PASS" start="2026-04-17T03:11:55.896612" elapsed="0.265070"/>
</iter>
<var>${cfgfile}</var>
<value>@{cfgfiles}</value>
<status status="PASS" start="2026-04-17T03:11:55.896318" elapsed="0.265441"/>
</for>
<doc>Uploads exabgp config files</doc>
<status status="PASS" start="2026-04-17T03:11:55.842537" elapsed="0.319359"/>
</kw>
<kw name="Upload_Config_Files_Exabgp_AS_Value_Reconfigured">
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-04-17T03:11:56.203287" 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-04-17T03:11:56.162898" elapsed="0.040624"/>
</kw>
<kw name="List Files In Directory" owner="SSHLibrary">
<msg time="2026-04-17T03:11:56.211876" level="INFO">1 file:
exa4.cfg</msg>
<msg time="2026-04-17T03:11:56.212101" 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-04-17T03:11:56.204097" elapsed="0.008042"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:11:56.213103" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/2607:f0d0:1002:0011:0000:0000:0000:0002/g' exa4.cfg'.</msg>
<msg time="2026-04-17T03:11:56.225600" 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-04-17T03:11:56.212763" elapsed="0.012930"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:11:56.226404" level="INFO">Executing command 'sed -i -e 's/ODLIP/::1/g' exa4.cfg'.</msg>
<msg time="2026-04-17T03:11:56.279921" 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-04-17T03:11:56.226001" elapsed="0.054132"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:11:56.280803" level="INFO">Executing command 'sed -i -e 's/ROUTERID/1.2.3.4/g' exa4.cfg'.</msg>
<msg time="2026-04-17T03:11:56.335605" 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-04-17T03:11:56.280477" elapsed="0.055288"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:11:56.336597" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exa4.cfg'.</msg>
<msg time="2026-04-17T03:11:56.387779" 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-04-17T03:11:56.336229" elapsed="0.051778"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:11:56.388998" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exa4.cfg'.</msg>
<msg time="2026-04-17T03:11:56.439866" 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-04-17T03:11:56.388463" elapsed="0.051670"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:11:56.441192" level="INFO">Executing command 'cat exa4.cfg'.</msg>
<msg time="2026-04-17T03:11:56.492099" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:11:56.492513" 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-04-17T03:11:56.440693" elapsed="0.052061"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:11:56.494129" 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-04-17T03:11:56.493344" elapsed="0.000917"/>
</kw>
<var name="${cfgfile}">exa4.cfg</var>
<status status="PASS" start="2026-04-17T03:11:56.212526" elapsed="0.281819"/>
</iter>
<var>${cfgfile}</var>
<value>@{cfgfiles}</value>
<status status="PASS" start="2026-04-17T03:11:56.212241" elapsed="0.282181"/>
</for>
<doc>Uploads exabgp config files</doc>
<status status="PASS" start="2026-04-17T03:11:56.162380" elapsed="0.332183"/>
</kw>
<doc>Suite setup keyword.</doc>
<status status="PASS" start="2026-04-17T03:10:45.167808" elapsed="71.326882"/>
</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-04-17T03:11:56.502162" elapsed="0.000304"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:11:56.501756" elapsed="0.000787"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:11:56.504052" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:11:56.503848" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-04-17T03:11:56.503816" elapsed="0.000338"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:11:56.511532" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:11:56.511349" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-04-17T03:11:56.511322" elapsed="0.000306"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:11:56.513255" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:11:56.512697" elapsed="0.000586"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:11:56.513745" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:11:56.513445" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:11:56.513816" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:11:56.513999" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:11:56.512022" elapsed="0.002002"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:11:56.520262" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:11:56.520100" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-17T03:11:56.520079" 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-04-17T03:11:56.521613" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:11:56.521504" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-17T03:11:56.521486" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:11:56.522227" level="INFO">${karaf_connection_index} = 13</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:11:56.521831" elapsed="0.000431"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:11:56.522691" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:11:56.522453" elapsed="0.000270"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:11:56.523570" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:11:56.523297" elapsed="0.001084">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:11:56.524580" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:11:56.524628" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:11:56.522921" elapsed="0.001730"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:11:56.525462" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:11:56.525191" elapsed="0.000988">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:11:56.526374" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:11:56.526421" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:11:56.524823" elapsed="0.001621"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:11:56.527485" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Reconfigure_ODL_To_Accept_Connections"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:11:56.526748" elapsed="0.000868">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Reconfigure_ODL_To_Accept_Connections"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:11:56.526524" elapsed="0.001166">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Reconfigure_ODL_To_Accept_Connections"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:11:56.526503" elapsed="0.001223">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Reconfigure_ODL_To_Accept_Connections"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:11:56.527890" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:11:56.528225" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:11:56.528014" elapsed="0.000289"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:11:56.527996" elapsed="0.000335"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:11:56.528367" elapsed="0.000018"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:11:56.531520" elapsed="0.000191"/>
</kw>
<msg time="2026-04-17T03:11:56.531821" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:11:56.530138" elapsed="0.001941"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:11:56.532374" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:11:56.532769" 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-04-17T03:11:56.529294" elapsed="0.003689"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:11:56.528700" elapsed="0.004359"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:11:56.521192" elapsed="0.011958">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Reconfigure_ODL_To_Accept_Connections"</status>
</kw>
<msg time="2026-04-17T03:11:56.533259" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:11:56.533304" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Reconfigure_ODL_To_Accept_Connections"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:11:56.520496" elapsed="0.012831"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:11:56.533528" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:11:56.533411" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-17T03:11:56.533390" elapsed="0.000207"/>
</if>
<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-04-17T03:11:56.534799" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:11:56.534684" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-17T03:11:56.534665" elapsed="0.000227"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:11:56.535334" level="INFO">index=15
host=10.30.170.120
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-04-17T03:11:56.535445" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
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-04-17T03:11:56.535181" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:11:56.535900" level="INFO">{1: 13}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:11:56.535625" elapsed="0.000361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:11:56.536445" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:11:56.536139" elapsed="0.000352"/>
</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-04-17T03:11:56.537053" elapsed="0.000295"/>
</kw>
<msg time="2026-04-17T03:11:56.537451" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:11:56.537497" level="INFO">${old_connection_index} = 13</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:11:56.536652" elapsed="0.000867"/>
</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-04-17T03:11:56.538455" elapsed="0.000205"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:11:56.540075" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:11:56.539496" elapsed="0.001531">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:11:56.538830" elapsed="0.002402"/>
</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-04-17T03:11:56.542077" elapsed="0.000358"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:11:56.541462" elapsed="0.001080"/>
</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-04-17T03:11:56.537820" elapsed="0.004784"/>
</kw>
<status status="PASS" start="2026-04-17T03:11:56.537596" elapsed="0.005076"/>
</branch>
<status status="PASS" start="2026-04-17T03:11:56.537577" elapsed="0.005135"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:11:56.543649" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:11:56.543327" elapsed="0.000350"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:11:56.543730" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:11:56.543982" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:11:56.542976" elapsed="0.001033"/>
</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-04-17T03:11:56.544168" elapsed="0.000462"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:11:56.544918" level="INFO">index=16
host=10.30.170.120
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-04-17T03:11:56.545041" level="INFO">${karaf_connection_object} = index=16
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:11:56.544801" elapsed="0.000266"/>
</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-04-17T03:11:56.545267" elapsed="0.002465"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:11:56.548208" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:11:56.549318" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:11:56.547940" elapsed="0.001808">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:11:56.564502" elapsed="0.000401"/>
</kw>
<msg time="2026-04-17T03:11:56.565027" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:11:56.562863" elapsed="0.002464"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:11:56.565488" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:11:56.565649" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:11:56.550674" elapsed="0.015058"/>
</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-04-17T03:11:56.550082" elapsed="0.015697"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:11:56.534312" elapsed="0.031557">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:11:56.566275" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:11:56.566353" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:11:56.519707" elapsed="0.046762">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:11:56.566586" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:11:56.566630" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:11:56.514410" elapsed="0.052244"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:11:56.567008" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:11:56.566737" elapsed="0.000383"/>
</branch>
<status status="PASS" start="2026-04-17T03:11:56.566716" elapsed="0.000431"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:11:56.514266" elapsed="0.052906"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:11:56.514086" elapsed="0.053120"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:11:56.510718" elapsed="0.056547"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:11:56.503426" elapsed="0.063896"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:11:56.502756" elapsed="0.064614"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:11:56.496970" elapsed="0.070457"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:11:56.568787" 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-04-17T03:11:56.567747" elapsed="0.001070"/>
</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-04-17T03:11:56.609724" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:11:56.609283" elapsed="0.000477"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:11:56.610707" 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-04-17T03:11:56.610405" elapsed="0.000383">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-04-17T03:11:56.610884" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:11:56.609969" elapsed="0.000939"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:11:56.611525" 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-04-17T03:11:56.611092" elapsed="0.000460"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:11:56.611861" 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-04-17T03:11:56.612068" 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-04-17T03:11:56.611713" elapsed="0.000383"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:11:56.612518" 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-04-17T03:11:56.612261" 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-04-17T03:11:56.613630" 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-04-17T03:11:56.613368" elapsed="0.000308"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:11:56.614157" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:11:56.613834" elapsed="0.000351"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:11:56.614864" 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-04-17T03:11:56.614561" elapsed="0.000329"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:11:56.615665" 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-04-17T03:11:56.615438" elapsed="0.000253"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:11:56.615743" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:11:56.615907" 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-04-17T03:11:56.615114" 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-04-17T03:11:56.616169" elapsed="0.000249"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">2607:f0d0:1002:0011:0000:0000:0000:0002</var>
<status status="PASS" start="2026-04-17T03:11:56.614427" elapsed="0.002033"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:11:56.617029" 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-04-17T03:11:56.616709" elapsed="0.000347"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:11:56.617774" 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-04-17T03:11:56.617561" elapsed="0.000250"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:11:56.617862" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:11:56.618034" 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-04-17T03:11:56.617242" elapsed="0.000816"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:11:56.618236" elapsed="0.000232"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:11:56.616578" elapsed="0.001932"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:11:56.619106" 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-04-17T03:11:56.618760" elapsed="0.000372"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:11:56.619872" 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-04-17T03:11:56.619633" elapsed="0.000273"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:11:56.619984" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:11:56.620180" 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-04-17T03:11:56.619319" 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-04-17T03:11:56.620408" elapsed="0.000475"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:11:56.618629" elapsed="0.002313"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:11:56.621627" 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-04-17T03:11:56.621190" elapsed="0.000464"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:11:56.622409" 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-04-17T03:11:56.622175" elapsed="0.000260"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:11:56.622484" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:11:56.622636" 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-04-17T03:11:56.621841" elapsed="0.000819"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:11:56.622808" elapsed="0.000294"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:11:56.621057" elapsed="0.002087"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:11:56.623744" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:11:56.623393" elapsed="0.000377"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:11:56.624496" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:11:56.624286" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:11:56.624570" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:11:56.624721" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:11:56.623973" 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-04-17T03:11:56.624894" elapsed="0.000240"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:11:56.623256" elapsed="0.001918"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:11:56.625724" 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-04-17T03:11:56.625423" elapsed="0.000326"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:11:56.626481" 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-04-17T03:11:56.626270" elapsed="0.000237"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:11:56.626562" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:11:56.626715" 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-04-17T03:11:56.625953" elapsed="0.000791"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:11:56.626969" elapsed="0.000230"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:11:56.625286" elapsed="0.001955"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:11:56.627788" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:11:56.627487" elapsed="0.000328"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:11:56.628548" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:11:56.628338" elapsed="0.000236"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:11:56.628623" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:11:56.628777" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:11:56.628019" elapsed="0.000783"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:11:56.628968" elapsed="0.000225"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:11:56.627356" elapsed="0.001879"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:11:56.629804" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:11:56.629477" elapsed="0.000363"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:11:56.630656" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:11:56.630432" elapsed="0.000249"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:11:56.630732" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:11:56.630885" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:11:56.630092" 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-04-17T03:11:56.631126" elapsed="0.000225"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:11:56.629347" elapsed="0.002045"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:11:56.614240" elapsed="0.017187"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:11:56.631476" elapsed="0.000027"/>
</return>
<msg time="2026-04-17T03:11:56.631650" 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-04-17T03:11:56.613037" elapsed="0.018640"/>
</kw>
<status status="PASS" start="2026-04-17T03:11:56.612657" elapsed="0.019054"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:11:56.631889" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:11:56.631740" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-17T03:11:56.612632" elapsed="0.019351"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:11:56.632873" 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-04-17T03:11:56.632129" elapsed="0.000774"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:11:56.632969" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:11:56.608514" elapsed="0.024585"/>
</kw>
<msg time="2026-04-17T03:11:56.633157" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:11:56.594444" elapsed="0.038766"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:11:56.647918" elapsed="0.000075"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:11:56.661327" elapsed="0.000044"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:11:56.674753" elapsed="0.000047"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:11:56.675067" 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-04-17T03:11:56.675272" elapsed="0.000039"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:11:56.675751" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:11:56.675580" elapsed="0.000232"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:11:56.675561" 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-04-17T03:11:56.676018" 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-04-17T03:11:56.676205" 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-04-17T03:11:56.676390" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:11:56.675520" elapsed="0.000927"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:11:56.675380" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:11:56.676641" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:11:56.676725" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:11:56.676898" 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-04-17T03:11:56.589534" elapsed="0.087408"/>
</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-04-17T03:11:56.706134" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:11:56.705638" elapsed="0.000534"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:11:56.706970" 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-04-17T03:11:56.706700" elapsed="0.000348">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-04-17T03:11:56.707143" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:11:56.706350" elapsed="0.000818"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:11:56.707722" 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-04-17T03:11:56.707331" elapsed="0.000419"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:11:56.708068" 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-04-17T03:11:56.708303" 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-04-17T03:11:56.707909" elapsed="0.000424"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:11:56.708739" 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-04-17T03:11:56.708489" 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-04-17T03:11:56.709240" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:11:56.708876" elapsed="0.000424"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:11:56.709769" level="INFO">${mapping_to_use} = {'IP': '2607:f0d0:1002:0011:0000:0000:0000:0002', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:11:56.709469" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-17T03:11:56.709326" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-04-17T03:11:56.708853" elapsed="0.001001"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:11:56.710810" 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-04-17T03:11:56.710016" elapsed="0.000825"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:11:56.710893" 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/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-04-17T03:11:56.704923" elapsed="0.006124"/>
</kw>
<msg time="2026-04-17T03:11:56.711107" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:11:56.691513" elapsed="0.019643"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:11:56.724123" 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-04-17T03:11:56.737355" elapsed="0.000042"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:11:56.750066" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:11:56.750284" 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-04-17T03:11:56.750542" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:11:56.750970" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:11:56.750802" elapsed="0.000242"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:11:56.750784" 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-04-17T03:11:56.751212" 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-04-17T03:11:56.751376" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:11:56.751538" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:11:56.750745" elapsed="0.000844"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:11:56.750625" elapsed="0.000992"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:11:56.751761" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:11:56.751839" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:11:56.752028" 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-04-17T03:11:56.688661" elapsed="0.063406"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:11:56.753905" 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-04-17T03:11:56.753474" elapsed="0.000559">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-04-17T03:11:56.754154" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:11:56.752960" elapsed="0.001225"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:11:56.754610" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:11:56.754276" elapsed="0.000406"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:11:56.755338" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:11:56.754962" elapsed="0.000408"/>
</kw>
<status status="PASS" start="2026-04-17T03:11:56.754713" elapsed="0.000702"/>
</branch>
<status status="PASS" start="2026-04-17T03:11:56.754254" elapsed="0.001187"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:11:56.758009" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:11:56.755629" elapsed="0.002407"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:11:56.758089" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:11:56.758246" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:11:56.752490" elapsed="0.005780"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:11:56.759687" 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-04-17T03:11:56.759431" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:11:56.760146" 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-04-17T03:11:56.759886" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:11:56.760656" 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-04-17T03:11:56.760390" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:11:56.761139" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:11:56.760850" elapsed="0.000336"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:11:56.762105" 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-04-17T03:11:56.761820" elapsed="0.000313"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:11:56.762498" 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-04-17T03:11:56.762315" elapsed="0.000209"/>
</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-04-17T03:11:56.762673" elapsed="0.000207"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:11:56.763295" 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-04-17T03:11:56.763049" elapsed="0.000289"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:11:56.763380" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:11:56.763534" 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-04-17T03:11:56.761390" elapsed="0.002169"/>
</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-04-17T03:11:56.769227" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:11:56.971112" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:11:57.374059" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:11:57.376321" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:11:56.766009" elapsed="0.612657">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:11:56.763627" elapsed="0.615152">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:11:57.379068" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:11:57.378825" elapsed="0.000317"/>
</branch>
<status status="FAIL" start="2026-04-17T03:11:56.763611" elapsed="0.615556">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-17T03:11:57.379666" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:11:57.379868" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:11:57.379770" elapsed="0.000148"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:11:57.379750" 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-04-17T03:11:57.380117" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:11:57.380194" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:11:56.758618" elapsed="0.621693">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:11:57.380392" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:11:56.573757" elapsed="0.806734">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:11:57.380781" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:11:57.380599" elapsed="0.000250"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:11:57.380583" elapsed="0.000289"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:11:57.380904" elapsed="0.000014"/>
</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="FAIL" start="2026-04-17T03:11:56.569114" elapsed="0.811937">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Configure BGP peer modules with initiate-connection set to false with short ipv6 address.</doc>
<status status="FAIL" start="2026-04-17T03:11:56.494890" elapsed="0.886399">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:11:57.386630" elapsed="0.000362"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:11:57.386247" elapsed="0.000828"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:11:57.388585" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:11:57.388417" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-04-17T03:11:57.388389" elapsed="0.000292"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:11:57.394827" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:11:57.394699" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-17T03:11:57.394677" elapsed="0.000225"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:11:57.396086" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:11:57.395617" elapsed="0.000498"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:11:57.396589" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:11:57.396280" elapsed="0.000335"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:11:57.396659" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:11:57.396826" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:11:57.395199" elapsed="0.001651"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:11:57.403673" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:11:57.403488" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-04-17T03:11:57.403452" elapsed="0.000339"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:11:57.405659" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:11:57.405519" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-04-17T03:11:57.405493" elapsed="0.000237"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:11:57.406312" level="INFO">${karaf_connection_index} = 16</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:11:57.405881" elapsed="0.000470"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:11:57.406875" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:11:57.406579" elapsed="0.000332"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:11:57.408056" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:11:57.407567" elapsed="0.001198">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:11:57.408975" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:11:57.409023" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:11:57.407147" elapsed="0.001900"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:11:57.409806" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:11:57.409563" elapsed="0.000908">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:11:57.410658" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:11:57.410703" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:11:57.409221" elapsed="0.001505"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:11:57.411678" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Start_Exabgp"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:11:57.411036" elapsed="0.000705">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Start_Exabgp"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:11:57.410799" elapsed="0.001014">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Start_Exabgp"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:11:57.410781" elapsed="0.001065">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Start_Exabgp"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:11:57.412028" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:11:57.412292" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:11:57.412117" elapsed="0.000234"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:11:57.412100" elapsed="0.000274"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:11:57.412407" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:11:57.415210" elapsed="0.000150"/>
</kw>
<msg time="2026-04-17T03:11:57.415428" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:11:57.414004" 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-04-17T03:11:57.415834" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:11:57.416236" 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-04-17T03:11:57.413254" elapsed="0.003204"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:11:57.412692" elapsed="0.003830"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:11:57.405126" elapsed="0.011487">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Start_Exabgp"</status>
</kw>
<msg time="2026-04-17T03:11:57.416717" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:11:57.416761" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Start_Exabgp"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:11:57.404157" elapsed="0.012632"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:11:57.417058" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:11:57.416917" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-17T03:11:57.416897" elapsed="0.000229"/>
</if>
<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-04-17T03:11:57.417962" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:11:57.417824" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-17T03:11:57.417807" elapsed="0.000223"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:11:57.418307" level="INFO">index=15
host=10.30.170.120
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-04-17T03:11:57.418412" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
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-04-17T03:11:57.418182" elapsed="0.000257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:11:57.418858" level="INFO">{1: 16}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:11:57.418595" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:11:57.419335" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:11:57.419071" elapsed="0.000309"/>
</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-04-17T03:11:57.419907" elapsed="0.000392"/>
</kw>
<msg time="2026-04-17T03:11:57.420445" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:11:57.420506" level="INFO">${old_connection_index} = 16</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:11:57.419536" elapsed="0.000999"/>
</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-04-17T03:11:57.421456" elapsed="0.000201"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:11:57.423114" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:11:57.422410" elapsed="0.001666">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:11:57.421895" elapsed="0.002287"/>
</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-04-17T03:11:57.424840" elapsed="0.000300"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:11:57.424373" elapsed="0.000852"/>
</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-04-17T03:11:57.420908" elapsed="0.004364"/>
</kw>
<status status="PASS" start="2026-04-17T03:11:57.420631" elapsed="0.004690"/>
</branch>
<status status="PASS" start="2026-04-17T03:11:57.420609" elapsed="0.004737"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:11:57.426207" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:11:57.425877" elapsed="0.000357"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:11:57.426283" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:11:57.426435" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:11:57.425552" elapsed="0.000908"/>
</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-04-17T03:11:57.426612" elapsed="0.000492"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:11:57.427403" level="INFO">index=17
host=10.30.170.120
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-04-17T03:11:57.427506" level="INFO">${karaf_connection_object} = index=17
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:11:57.427288" elapsed="0.000245"/>
</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-04-17T03:11:57.427683" elapsed="0.002385"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:11:57.430491" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:11:57.431724" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:11:57.430231" elapsed="0.001884">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:11:57.447980" elapsed="0.000477"/>
</kw>
<msg time="2026-04-17T03:11:57.448572" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:11:57.446294" elapsed="0.002460"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:11:57.449227" elapsed="0.000029"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:11:57.449428" elapsed="0.000025"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:11:57.433079" elapsed="0.016448"/>
</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-04-17T03:11:57.432398" elapsed="0.017186"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:11:57.417530" elapsed="0.032160">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:11:57.450212" elapsed="0.000032"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:11:57.450304" 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="FAIL" start="2026-04-17T03:11:57.402847" elapsed="0.047594">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:11:57.450574" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:11:57.450625" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:11:57.397345" elapsed="0.053307"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:11:57.451134" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:11:57.450751" elapsed="0.000445"/>
</branch>
<status status="PASS" start="2026-04-17T03:11:57.450727" elapsed="0.000498"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:11:57.397198" elapsed="0.054055"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:11:57.397003" elapsed="0.054289"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:11:57.394247" elapsed="0.057115"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:11:57.387996" elapsed="0.063441"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:11:57.387288" elapsed="0.064203"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:11:57.382594" elapsed="0.068961"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:11:57.452173" level="INFO">${cmd} = exaipv6.cfg &gt; exaipv6.log</msg>
<var>${cmd}</var>
<arg>${EXABGP_CFG} &gt; ${EXABGP_LOG}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:11:57.451759" elapsed="0.000446"/>
</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-04-17T03:11:57.456866" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exaipv6.cfg &gt; exaipv6.log</msg>
<var>${start_cmd}</var>
<arg>${CMD} ${cfg_file}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:11:57.456464" elapsed="0.000436"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:11:57.457537" 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-04-17T03:11:57.457251" elapsed="0.000339"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:11:57.460437" 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-04-17T03:11:57.458317" elapsed="0.002194"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:11:57.463957" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:11:57.464088" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:11:57.460728" elapsed="0.003392"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:11:57.464947" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:11:57.464583" elapsed="0.000426"/>
</kw>
<status status="PASS" start="2026-04-17T03:11:57.464222" elapsed="0.000825"/>
</branch>
<status status="PASS" start="2026-04-17T03:11:57.464192" elapsed="0.000886"/>
</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-04-17T03:11:57.457873" elapsed="0.007355"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:11:57.467437" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exaipv6.cfg &gt; exaipv6.log</msg>
<msg time="2026-04-17T03:11:57.467551" 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-04-17T03:11:57.465419" elapsed="0.002163"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:11:57.468122" 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-04-17T03:11:57.467782" elapsed="0.000401"/>
</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-04-17T03:11:57.456078" elapsed="0.012185"/>
</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-04-17T03:11:57.470686" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:11:57.470200" elapsed="0.000522"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:11:57.473432" 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-04-17T03:11:57.470942" elapsed="0.002529"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:11:57.477049" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:11:57.678613" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:11:58.081205" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:11:58.083761" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:11:57.473693" elapsed="0.615121">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:11:58.089381" elapsed="0.000063"/>
</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="NOT RUN" start="2026-04-17T03:11:58.089776" elapsed="0.000047"/>
</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-04-17T03:11:57.469586" elapsed="0.620506">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:12:01.093978" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:01.092798" elapsed="0.001232"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:01.097195" 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-04-17T03:12:01.094291" elapsed="0.002945"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:12:01.101440" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:01.303741" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:01.706053" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:01.708235" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:12:01.097467" elapsed="0.615875">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:01.713841" elapsed="0.000060"/>
</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="NOT RUN" start="2026-04-17T03:12:01.714365" elapsed="0.000077"/>
</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-04-17T03:12:01.091207" elapsed="0.623500">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:12:04.718967" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:04.717808" elapsed="0.001251"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:04.723256" 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-04-17T03:12:04.719476" elapsed="0.003829"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:12:04.727753" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:04.929450" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:05.332766" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:05.336313" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:12:04.723570" elapsed="0.618149">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:05.342384" elapsed="0.000078"/>
</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="NOT RUN" start="2026-04-17T03:12:05.342882" elapsed="0.000088"/>
</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-04-17T03:12:04.716007" elapsed="0.627242">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:12:05.343451" level="FAIL">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:11:57.468963" elapsed="7.874634">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:12:05.343883" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:12:05.344042" level="INFO">${value} = Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/...</msg>
<var>${status}</var>
<var>${value}</var>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:11:57.468471" elapsed="7.875611"/>
</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-04-17T03:12:05.346522" level="INFO">[?2004l</msg>
<msg time="2026-04-17T03:12:05.346688" level="INFO">${output} = [?2004l</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-04-17T03:12:05.345754" elapsed="0.000971"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:05.347593" level="INFO">[?2004l</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:05.347070" elapsed="0.000628"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:12:05.349428" 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-04-17T03:12:05.348734" elapsed="0.000747"/>
</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-04-17T03:12:05.349781" elapsed="0.000555"/>
</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-04-17T03:12:05.348147" elapsed="0.002329"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:12:05.473561" level="INFO">^C[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:12:05.473948" level="INFO">${output} = ^C[?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:12:05.351277" elapsed="0.122709"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:05.475051" level="INFO">^C[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:05.474430" elapsed="0.000674"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:12:05.477481" 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-04-17T03:12:05.476019" elapsed="0.001524"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:12:05.478647" level="INFO">[?2004l[?2004h[jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:12:05.478741" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-188-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-04-17T03:12:05.477714" elapsed="0.001054"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:05.479539" level="INFO">[?2004l[?2004h[jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:05.479220" elapsed="0.000370"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:05.478867" elapsed="0.000758"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:05.478833" elapsed="0.000827"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-04-17T03:12:05.475501" elapsed="0.004217"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-04-17T03:12:05.345082" elapsed="0.134693"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:05.344321" elapsed="0.135483"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:05.344251" elapsed="0.135579"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="NOT RUN" start="2026-04-17T03:12:05.480044" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:05.479893" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:05.479876" elapsed="0.000243"/>
</if>
<var name="${idx}">0</var>
<status status="PASS" start="2026-04-17T03:11:57.455817" elapsed="8.024327"/>
</iter>
<iter>
<kw name="Start_ExaBgp" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:12:05.481565" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exaipv6.cfg &gt; exaipv6.log</msg>
<var>${start_cmd}</var>
<arg>${CMD} ${cfg_file}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:05.480979" elapsed="0.000618"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:05.482056" 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-04-17T03:12:05.481766" elapsed="0.000336"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:12:05.484687" 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-04-17T03:12:05.482947" elapsed="0.001804"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:12:05.489358" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:12:05.489456" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:12:05.484917" elapsed="0.004566"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:05.490085" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:05.489807" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:05.489553" elapsed="0.000611"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:05.489533" elapsed="0.000656"/>
</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-04-17T03:12:05.482562" elapsed="0.007692"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:12:05.492486" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exaipv6.cfg &gt; exaipv6.log</msg>
<msg time="2026-04-17T03:12:05.492582" 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-04-17T03:12:05.490405" elapsed="0.002202"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:05.493043" 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-04-17T03:12:05.492773" elapsed="0.000316"/>
</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-04-17T03:12:05.480611" elapsed="0.012533"/>
</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-04-17T03:12:05.495199" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:05.494821" elapsed="0.000544"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:05.497844" 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-04-17T03:12:05.495535" elapsed="0.002337"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:12:05.500968" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:05.702866" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:06.106471" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:06.109153" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:12:05.498053" elapsed="0.615456">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:06.114104" elapsed="0.000061"/>
</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="NOT RUN" start="2026-04-17T03:12:06.114402" elapsed="0.000031"/>
</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-04-17T03:12:05.494359" elapsed="0.620292">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:12:09.118062" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:09.117088" elapsed="0.001047"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:09.123434" 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-04-17T03:12:09.118648" elapsed="0.004850"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:12:09.128787" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:09.330265" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:09.732859" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:09.735419" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:12:09.123907" elapsed="0.615925">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:09.740213" elapsed="0.000043"/>
</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="NOT RUN" start="2026-04-17T03:12:09.740471" elapsed="0.000030"/>
</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-04-17T03:12:09.115695" elapsed="0.624990">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:12:12.743140" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:12.742391" elapsed="0.000796"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:12.748257" 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-04-17T03:12:12.743438" elapsed="0.004882"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:12:12.753425" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:12.955460" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:13.358157" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:13.360370" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:12:12.748686" elapsed="0.614935">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:13.364029" elapsed="0.000053"/>
</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="NOT RUN" start="2026-04-17T03:12:13.364351" elapsed="0.000035"/>
</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-04-17T03:12:12.741362" elapsed="0.623184">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:12:13.364697" level="FAIL">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:05.493748" elapsed="7.871088">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:12:13.365079" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:12:13.365155" level="INFO">${value} = Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/...</msg>
<var>${status}</var>
<var>${value}</var>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:05.493313" elapsed="7.871878"/>
</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-04-17T03:12:13.366525" level="INFO">[?2004l</msg>
<msg time="2026-04-17T03:12:13.366638" level="INFO">${output} = [?2004l</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-04-17T03:12:13.366335" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:13.367300" level="INFO">[?2004l</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:13.366881" elapsed="0.000512"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:12:13.368578" 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-04-17T03:12:13.368118" elapsed="0.000499"/>
</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-04-17T03:12:13.368829" elapsed="0.000368"/>
</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-04-17T03:12:13.367714" elapsed="0.001567"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:12:13.491226" level="INFO">^C[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:12:13.491507" level="INFO">${output} = ^C[?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:12:13.369499" elapsed="0.122065"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:13.492433" level="INFO">^C[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:13.491940" elapsed="0.000676"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:12:13.494968" 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-04-17T03:12:13.493607" elapsed="0.001464"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:12:13.496756" level="INFO">[?2004l[?2004h[jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:12:13.496920" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-188-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-04-17T03:12:13.495375" elapsed="0.001627"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:13.498158" level="INFO">[?2004l[?2004h[jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:13.497606" elapsed="0.000646"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:13.497137" elapsed="0.001180"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:13.497094" elapsed="0.001278"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-04-17T03:12:13.493052" elapsed="0.005407"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-04-17T03:12:13.365791" elapsed="0.132768"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:13.365341" elapsed="0.133269"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:13.365305" elapsed="0.133351"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="NOT RUN" start="2026-04-17T03:12:13.499006" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:13.498766" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:13.498733" elapsed="0.000396"/>
</if>
<var name="${idx}">1</var>
<status status="PASS" start="2026-04-17T03:12:05.480372" elapsed="8.018799"/>
</iter>
<iter>
<kw name="Start_ExaBgp" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:12:13.501075" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exaipv6.cfg &gt; exaipv6.log</msg>
<var>${start_cmd}</var>
<arg>${CMD} ${cfg_file}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:13.500550" elapsed="0.000567"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:13.501690" 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-04-17T03:12:13.501342" elapsed="0.000412"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:12:13.505021" 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-04-17T03:12:13.503072" elapsed="0.002031"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:12:13.509540" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:12:13.509640" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:12:13.505326" elapsed="0.004341"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:13.510316" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:13.510040" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:13.509741" elapsed="0.000660"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:13.509721" elapsed="0.000706"/>
</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-04-17T03:12:13.502476" elapsed="0.007998"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:12:13.512315" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exaipv6.cfg &gt; exaipv6.log</msg>
<msg time="2026-04-17T03:12:13.512407" 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-04-17T03:12:13.510625" elapsed="0.001808"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:13.512858" 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-04-17T03:12:13.512604" elapsed="0.000300"/>
</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-04-17T03:12:13.499900" elapsed="0.013077"/>
</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-04-17T03:12:13.515434" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:13.514877" elapsed="0.000596"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:13.518620" 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-04-17T03:12:13.515711" elapsed="0.002948"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:12:13.522838" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:13.724324" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:14.126489" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:14.129060" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:12:13.519041" elapsed="0.616110">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:14.135634" elapsed="0.000061"/>
</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="NOT RUN" start="2026-04-17T03:12:14.136009" elapsed="0.000046"/>
</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-04-17T03:12:13.514185" elapsed="0.622092">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:12:17.140033" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:17.138755" elapsed="0.001359"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:17.147152" 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-04-17T03:12:17.140594" elapsed="0.006601"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:12:17.150829" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:17.352566" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:17.755228" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:17.757791" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:12:17.147435" elapsed="0.614877">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:17.762669" elapsed="0.000041"/>
</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="NOT RUN" start="2026-04-17T03:12:17.762957" elapsed="0.000032"/>
</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-04-17T03:12:17.137370" elapsed="0.625787">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:12:20.766426" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:20.765476" elapsed="0.001021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:20.771518" 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-04-17T03:12:20.766884" elapsed="0.004699"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:12:20.776896" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:20.978359" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:21.380715" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:21.382881" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:12:20.771984" elapsed="0.615015">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:21.387359" elapsed="0.000041"/>
</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="NOT RUN" start="2026-04-17T03:12:21.387618" elapsed="0.000031"/>
</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-04-17T03:12:20.764067" elapsed="0.623739">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:12:21.387984" level="FAIL">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:13.513562" elapsed="7.874567">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:12:21.388373" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:12:21.388442" level="INFO">${value} = Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/...</msg>
<var>${status}</var>
<var>${value}</var>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:13.513150" elapsed="7.875329"/>
</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-04-17T03:12:21.389767" level="INFO">[?2004l</msg>
<msg time="2026-04-17T03:12:21.389907" level="INFO">${output} = [?2004l</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-04-17T03:12:21.389584" elapsed="0.000379"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:21.391013" level="INFO">[?2004l</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:21.390186" elapsed="0.000925"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:12:21.392421" 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-04-17T03:12:21.391839" elapsed="0.000626"/>
</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-04-17T03:12:21.392750" elapsed="0.000353"/>
</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-04-17T03:12:21.391426" elapsed="0.001760"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:12:21.516698" level="INFO">^C[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:12:21.516904" level="INFO">${output} = ^C[?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:12:21.393385" elapsed="0.123562"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:21.517558" level="INFO">^C[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:21.517203" elapsed="0.000406"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:12:21.519236" 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-04-17T03:12:21.518377" elapsed="0.000914"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:12:21.520159" level="INFO">[?2004l[?2004h[jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:12:21.520250" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-188-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-04-17T03:12:21.519467" elapsed="0.000809"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:21.521010" level="INFO">[?2004l[?2004h[jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:21.520692" elapsed="0.000367"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:21.520412" elapsed="0.000681"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:21.520383" elapsed="0.000738"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-04-17T03:12:21.517895" elapsed="0.003275"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-04-17T03:12:21.389145" elapsed="0.132088"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:21.388657" elapsed="0.132632"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:21.388619" elapsed="0.132694"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="NOT RUN" start="2026-04-17T03:12:21.521622" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:21.521495" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:21.521477" elapsed="0.000220"/>
</if>
<var name="${idx}">2</var>
<status status="PASS" start="2026-04-17T03:12:13.499529" elapsed="8.022192"/>
</iter>
<var>${idx}</var>
<value>${connection_retries}</value>
<status status="PASS" start="2026-04-17T03:11:57.455557" elapsed="24.066201"/>
</for>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:12:21.522309" level="FAIL">Unable to connect ExaBgp to ODL</msg>
<arg>Unable to connect ExaBgp to ODL</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:12:21.521916" elapsed="0.000482">Unable to connect ExaBgp to ODL</status>
</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="FAIL" start="2026-04-17T03:11:57.452591" elapsed="24.069917">Unable to connect ExaBgp to ODL</status>
</kw>
<doc>Start exabgp with</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:11:57.381788" elapsed="24.140903">Unable to connect ExaBgp to ODL</status>
</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-04-17T03:12:21.526176" elapsed="0.000212"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:12:21.525882" elapsed="0.000560"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:12:21.527483" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:21.527371" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:21.527352" 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-04-17T03:12:21.532991" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:21.532865" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:21.532846" elapsed="0.000215"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:21.534105" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:12:21.533683" elapsed="0.000449"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:12:21.534590" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:12:21.534291" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:12:21.534659" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:12:21.534825" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:12:21.533297" elapsed="0.001553"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:12:21.545911" elapsed="0.000043"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:21.540301" elapsed="0.005699"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:21.540281" elapsed="0.005742"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:12:21.547411" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:21.547303" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:21.547286" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:12:21.547964" level="INFO">${karaf_connection_index} = 17</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:12:21.547624" elapsed="0.000368"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:12:21.548432" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:12:21.548151" elapsed="0.000311"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:12:21.549374" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:12:21.549090" elapsed="0.001022">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:12:21.550310" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:12:21.550356" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:21.548638" elapsed="0.001742"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:12:21.551147" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:12:21.550886" elapsed="0.000911">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:12:21.552008" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:12:21.552054" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:21.550546" elapsed="0.001531"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:12:21.553182" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Filled"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:12:21.552484" elapsed="0.000761">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Filled"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:12:21.552226" elapsed="0.001090">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Filled"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:12:21.552206" elapsed="0.001323">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Filled"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:21.553693" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:21.553921" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:21.553783" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:21.553764" elapsed="0.000262"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:12:21.554060" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:12:21.556833" elapsed="0.000174"/>
</kw>
<msg time="2026-04-17T03:12:21.557076" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:12:21.555608" 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-04-17T03:12:21.557479" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:21.557809" 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-04-17T03:12:21.554973" elapsed="0.003147"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:12:21.554390" elapsed="0.003796"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:12:21.546979" elapsed="0.011292">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Filled"</status>
</kw>
<msg time="2026-04-17T03:12:21.558375" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:12:21.558418" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Filled"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:21.546224" elapsed="0.012217"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:12:21.558627" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:21.558518" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:21.558499" elapsed="0.000194"/>
</if>
<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-04-17T03:12:21.559515" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:21.559410" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:21.559392" elapsed="0.000189"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:12:21.560006" level="INFO">index=15
host=10.30.170.120
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-04-17T03:12:21.562298" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
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-04-17T03:12:21.559773" elapsed="0.002552"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:21.562748" level="INFO">{1: 17}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:21.562478" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:21.563206" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:21.562962" elapsed="0.000287"/>
</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-04-17T03:12:21.563801" elapsed="0.000378"/>
</kw>
<msg time="2026-04-17T03:12:21.564279" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:12:21.564373" level="INFO">${old_connection_index} = 17</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:21.563406" elapsed="0.000996"/>
</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-04-17T03:12:21.565259" elapsed="0.000194"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:12:21.566691" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:12:21.566201" elapsed="0.003125">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:21.565619" elapsed="0.003855"/>
</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-04-17T03:12:21.570197" elapsed="0.000277"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:21.569647" elapsed="0.000911"/>
</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-04-17T03:12:21.564727" elapsed="0.005876"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:21.564494" elapsed="0.006158"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:21.564472" elapsed="0.006205"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:12:21.571619" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:12:21.571264" elapsed="0.000382"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:12:21.571703" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:12:21.571862" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:12:21.570882" elapsed="0.001005"/>
</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-04-17T03:12:21.572061" elapsed="0.000524"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:12:21.572878" level="INFO">index=18
host=10.30.170.120
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-04-17T03:12:21.572998" level="INFO">${karaf_connection_object} = index=18
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:12:21.572766" elapsed="0.000260"/>
</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-04-17T03:12:21.573174" elapsed="0.002435"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:12:21.576100" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:12:21.577268" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:12:21.575773" elapsed="0.001880">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:12:21.594662" elapsed="0.000576"/>
</kw>
<msg time="2026-04-17T03:12:21.595369" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:12:21.592713" elapsed="0.002870"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:21.595804" elapsed="0.000031"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:21.596053" elapsed="0.000030"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:12:21.578485" elapsed="0.017685"/>
</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-04-17T03:12:21.577964" elapsed="0.018271"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:12:21.559117" elapsed="0.037287">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:21.600150" elapsed="0.000039"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:12:21.600258" 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="FAIL" start="2026-04-17T03:12:21.539948" elapsed="0.060545">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:12:21.600664" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:12:21.600725" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:21.535246" elapsed="0.065512"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:21.601328" elapsed="0.000071"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:21.600848" elapsed="0.000586"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:21.600828" elapsed="0.000632"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:12:21.535104" elapsed="0.066381"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:12:21.534910" elapsed="0.066609"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:12:21.532474" elapsed="0.069104"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:12:21.527078" elapsed="0.074556"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:21.526591" elapsed="0.075090"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:12:21.523498" elapsed="0.078237"/>
</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-04-17T03:12:21.659051" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:21.658569" elapsed="0.000517"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:21.659914" 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-04-17T03:12:21.659610" elapsed="0.000412">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-04-17T03:12:21.660129" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:21.659263" elapsed="0.000891"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:21.660844" 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-04-17T03:12:21.660386" elapsed="0.000486"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:12:21.661212" 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-04-17T03:12:21.661392" 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-04-17T03:12:21.661059" elapsed="0.000359"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:21.661835" 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-04-17T03:12:21.661584" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:21.663077" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:21.662713" elapsed="0.000464"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:12:21.663656" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:12:21.663348" elapsed="0.000333"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:21.664055" 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-04-17T03:12:21.664303" elapsed="0.000186"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:12:21.664651" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:12:21.663896" elapsed="0.000826"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:12:21.663736" elapsed="0.001019"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:12:21.664830" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:12:21.665045" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:12:21.662352" elapsed="0.002724"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:21.661977" elapsed="0.003133"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:21.665295" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:21.665148" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:21.661950" elapsed="0.003420"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:12:21.666009" 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-04-17T03:12:21.665524" elapsed="0.000561"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:12:21.666136" 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-04-17T03:12:21.657758" elapsed="0.008507"/>
</kw>
<msg time="2026-04-17T03:12:21.666320" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:12:21.644056" elapsed="0.022314"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:12:21.680149" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:21.694058" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:21.707162" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:21.707363" 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-04-17T03:12:21.707536" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:21.707947" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:21.707787" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:21.707772" 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-04-17T03:12:21.708175" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:21.708393" elapsed="0.000037"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:21.708606" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:12:21.707729" elapsed="0.000932"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:12:21.707620" elapsed="0.001067"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:21.708831" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:21.708905" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:12:21.709049" 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-04-17T03:12:21.638691" elapsed="0.070384"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:21.710490" 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-04-17T03:12:21.710218" elapsed="0.000351">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-04-17T03:12:21.710661" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:21.709824" elapsed="0.000862"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:21.711016" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:21.710754" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:12:21.711583" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:21.711283" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:21.711098" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:21.710737" elapsed="0.000927"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:21.714168" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:12:21.711811" elapsed="0.002383"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:12:21.714245" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:12:21.714401" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:12:21.709457" elapsed="0.004968"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:21.715706" 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-04-17T03:12:21.715450" elapsed="0.000326">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-04-17T03:12:21.715870" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:21.715099" elapsed="0.000795"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:12:21.716123" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:12:21.715989" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:21.715970" elapsed="0.000237"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:21.716407" elapsed="0.000026"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:21.716610" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:12:21.716678" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:12:21.718949" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:12:21.714755" elapsed="0.004222"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:21.720409" 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-04-17T03:12:21.720130" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:21.720887" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:21.720630" elapsed="0.000316"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:12:21.726166" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:21.927718" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:22.330419" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:22.333128" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:12:21.723246" elapsed="0.613155">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:12:21.721024" elapsed="0.615646">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:22.337114" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:22.336733" elapsed="0.000489"/>
</branch>
<status status="FAIL" start="2026-04-17T03:12:21.720995" elapsed="0.616262">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:22.337967" elapsed="0.000043"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:22.338176" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:22.338120" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:22.338093" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:22.338477" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:12:22.338577" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:12:21.719292" elapsed="0.619446">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:22.338851" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:12:21.613401" elapsed="0.725613">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:22.339411" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:22.339150" elapsed="0.000364"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:22.339125" elapsed="0.000423"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:22.339593" elapsed="0.000020"/>
</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-04-17T03:12:21.606770" elapsed="0.732963">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:24.401796" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:24.401384" elapsed="0.000447"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:24.402623" 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-04-17T03:12:24.402365" elapsed="0.000336">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-04-17T03:12:24.402803" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:24.402020" elapsed="0.000875"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:24.403496" 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-04-17T03:12:24.403084" elapsed="0.000440"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:12:24.403831" 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-04-17T03:12:24.404005" 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-04-17T03:12:24.403686" elapsed="0.000345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:24.404467" 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-04-17T03:12:24.404197" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:24.405647" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:24.405328" elapsed="0.000369"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:12:24.406319" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:12:24.405874" elapsed="0.000472"/>
</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-04-17T03:12:24.406686" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:24.406897" elapsed="0.000044"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:24.407198" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:12:24.406548" elapsed="0.000708"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:12:24.406402" elapsed="0.000884"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:12:24.407333" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:12:24.407506" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:12:24.404974" elapsed="0.002563"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:24.404593" elapsed="0.002979"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:24.407744" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:24.407598" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:24.404569" elapsed="0.003252"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:12:24.408439" 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-04-17T03:12:24.407982" elapsed="0.000486"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:12:24.408517" 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-04-17T03:12:24.400732" elapsed="0.007912"/>
</kw>
<msg time="2026-04-17T03:12:24.408698" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:12:24.387750" elapsed="0.020997"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:12:24.423214" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:24.437575" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:24.450659" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:24.450879" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:24.451080" 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-04-17T03:12:24.451479" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:24.451329" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:24.451312" 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-04-17T03:12:24.451700" 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-04-17T03:12:24.451865" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:24.452045" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:12:24.451275" elapsed="0.000825"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:12:24.451163" elapsed="0.000964"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:24.452273" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:24.452350" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:12:24.452492" 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-04-17T03:12:24.383367" elapsed="0.069151"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:24.454000" 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-04-17T03:12:24.453645" elapsed="0.000435">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-04-17T03:12:24.454179" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:24.453262" elapsed="0.000950"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:24.454565" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:24.454301" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:12:24.455165" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:24.454828" elapsed="0.000364"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:24.454647" elapsed="0.000581"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:24.454282" elapsed="0.000968"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:24.457840" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:12:24.455414" elapsed="0.002454"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:12:24.457919" elapsed="0.000049"/>
</return>
<msg time="2026-04-17T03:12:24.458096" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:12:24.452850" elapsed="0.005271"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:24.459440" 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-04-17T03:12:24.459201" elapsed="0.000306">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-04-17T03:12:24.459658" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:24.458836" elapsed="0.000859"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:12:24.459941" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-17T03:12:24.459783" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:24.459764" elapsed="0.000267"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:24.460180" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:24.460350" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:12:24.460414" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:12:24.462628" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:12:24.458460" elapsed="0.004196"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:24.464145" 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-04-17T03:12:24.463858" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:24.464597" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:24.464347" 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-04-17T03:12:24.469696" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:24.671118" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:25.074237" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:25.077633" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:12:24.466986" elapsed="0.618290">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:12:24.464708" elapsed="0.620983">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:25.086792" elapsed="0.000102"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:25.085834" elapsed="0.001348"/>
</branch>
<status status="FAIL" start="2026-04-17T03:12:24.464690" elapsed="0.622575">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:25.088196" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:25.088404" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:25.088343" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:25.088313" elapsed="0.000171"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:25.088665" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:12:25.088741" 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-04-17T03:12:24.463038" elapsed="0.625842">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:25.089106" 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-04-17T03:12:24.358195" elapsed="0.731022">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:25.089544" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:25.089321" elapsed="0.000326"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:25.089303" elapsed="0.000379"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:25.089731" elapsed="0.000020"/>
</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-04-17T03:12:24.349185" elapsed="0.740693">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:27.152548" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:27.151812" elapsed="0.000772"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:27.153411" 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-04-17T03:12:27.153144" elapsed="0.000345">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-04-17T03:12:27.153630" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:27.152776" elapsed="0.000882"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:27.154262" 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-04-17T03:12:27.153824" elapsed="0.000484"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:12:27.154664" 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-04-17T03:12:27.154872" 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-04-17T03:12:27.154493" elapsed="0.000405"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:27.155324" 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-04-17T03:12:27.155073" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:27.156573" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:27.156250" elapsed="0.000370"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:12:27.157121" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:12:27.156811" elapsed="0.000345"/>
</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-04-17T03:12:27.157545" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:27.157822" elapsed="0.000027"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:27.158028" elapsed="0.000023"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:12:27.157405" elapsed="0.000684"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:12:27.157235" elapsed="0.000953"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:12:27.158244" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:12:27.158430" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:12:27.155876" elapsed="0.002580"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:27.155494" elapsed="0.002994"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:27.158661" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:27.158514" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:27.155464" elapsed="0.003276"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:12:27.159453" 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-04-17T03:12:27.158972" elapsed="0.000510"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:12:27.159532" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:12:27.151109" elapsed="0.008554"/>
</kw>
<msg time="2026-04-17T03:12:27.159730" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:12:27.136104" elapsed="0.023684"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:12:27.175019" elapsed="0.000069"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:12:27.190311" elapsed="0.000061"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:12:27.204929" elapsed="0.000059"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:27.205202" 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-04-17T03:12:27.205390" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:27.205834" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:27.205676" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:27.205657" 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-04-17T03:12:27.206086" 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-04-17T03:12:27.206254" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:27.206417" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:12:27.205608" elapsed="0.000860"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:12:27.205475" elapsed="0.001022"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:27.206643" elapsed="0.000108"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:27.206826" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:12:27.207044" 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-04-17T03:12:27.131228" elapsed="0.075845"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:27.208587" 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-04-17T03:12:27.208288" elapsed="0.000379">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-04-17T03:12:27.208763" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:27.207807" 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-04-17T03:12:27.209154" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:27.208867" elapsed="0.000348"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:12:27.209728" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:27.209422" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:27.209240" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:27.208849" elapsed="0.000967"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:27.212313" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:12:27.209992" elapsed="0.002349"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:12:27.212423" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:12:27.212596" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:12:27.207424" elapsed="0.005198"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:27.213889" 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-04-17T03:12:27.213651" elapsed="0.000322">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-04-17T03:12:27.214080" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:27.213312" elapsed="0.000792"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:12:27.214310" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:12:27.214174" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:27.214157" elapsed="0.000237"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:27.214540" 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-04-17T03:12:27.214707" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:12:27.214772" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:12:27.216991" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:12:27.212947" elapsed="0.004072"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:27.218463" 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-04-17T03:12:27.218199" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:27.218911" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:27.218663" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:12:27.224639" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:27.427354" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:27.830583" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:27.833229" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:12:27.221534" elapsed="0.617528">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:12:27.219040" elapsed="0.620262">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:27.839935" elapsed="0.000095"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:27.839398" elapsed="0.000745"/>
</branch>
<status status="FAIL" start="2026-04-17T03:12:27.219023" elapsed="0.621182">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:27.841277" elapsed="0.000068"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:27.841616" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:27.841523" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:27.841478" elapsed="0.000296"/>
</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-04-17T03:12:27.842211" elapsed="0.000149"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:12:27.842511" elapsed="0.000049"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:12:27.217345" elapsed="0.625454">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:27.843040" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:12:27.107618" elapsed="0.735575">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:27.843528" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:27.843299" elapsed="0.000331"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:27.843281" elapsed="0.000381"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:27.843709" 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="FAIL" start="2026-04-17T03:12:27.099258" elapsed="0.744590">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:29.911172" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:29.910691" elapsed="0.000518"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:29.912096" 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-04-17T03:12:29.911806" elapsed="0.000373">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-04-17T03:12:29.912277" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:29.911392" elapsed="0.000910"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:29.912863" 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-04-17T03:12:29.912467" elapsed="0.000424"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:12:29.913218" 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-04-17T03:12:29.913385" 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-04-17T03:12:29.913072" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:29.913821" 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-04-17T03:12:29.913569" 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-04-17T03:12:29.915037" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:29.914698" elapsed="0.000386"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:12:29.915524" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:12:29.915244" elapsed="0.000345"/>
</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-04-17T03:12:29.915955" elapsed="0.000025"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:29.916205" 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-04-17T03:12:29.916378" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:12:29.915799" elapsed="0.000635"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:12:29.915646" elapsed="0.000821"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:12:29.916518" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:12:29.916695" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:12:29.914353" elapsed="0.002367"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:29.913972" elapsed="0.002779"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:29.916922" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:29.916777" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:29.913929" elapsed="0.003089"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:12:29.917632" 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-04-17T03:12:29.917166" elapsed="0.000493"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:12:29.917708" 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-04-17T03:12:29.909739" elapsed="0.008097"/>
</kw>
<msg time="2026-04-17T03:12:29.917894" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:12:29.893789" elapsed="0.024174"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:12:29.931380" elapsed="0.000061"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:12:29.946211" 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/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-04-17T03:12:29.959250" elapsed="0.000048"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:29.959525" 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-04-17T03:12:29.959708" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:29.960157" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:29.960004" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:29.959985" 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-04-17T03:12:29.960430" 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-04-17T03:12:29.960598" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:29.960761" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:12:29.959931" elapsed="0.000882"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:12:29.959793" elapsed="0.001049"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:29.961006" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:29.961093" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:12:29.961288" 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-04-17T03:12:29.889103" elapsed="0.072219"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:29.962785" 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-04-17T03:12:29.962491" elapsed="0.000371">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-04-17T03:12:29.962973" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:29.962081" elapsed="0.000918"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:29.963330" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:29.963069" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:12:29.963883" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:29.963589" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:29.963411" elapsed="0.000606"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:29.963051" elapsed="0.000993"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:29.966466" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:12:29.964195" elapsed="0.002297"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:12:29.966543" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:12:29.966701" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:12:29.961683" elapsed="0.005042"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:29.968116" 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-04-17T03:12:29.967709" elapsed="0.000476">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-04-17T03:12:29.968282" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:29.967377" elapsed="0.000929"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:12:29.968602" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-04-17T03:12:29.968378" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:29.968360" elapsed="0.000373"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:29.968884" 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-04-17T03:12:29.969073" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:12:29.969138" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:12:29.971292" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:12:29.967055" elapsed="0.004263"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:29.972754" 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-04-17T03:12:29.972495" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:29.973219" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:29.972968" 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-04-17T03:12:29.978390" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:30.180021" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:30.583303" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:30.585812" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:12:29.975532" elapsed="0.613698">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:12:29.973328" elapsed="0.616053">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:30.589752" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:30.589444" elapsed="0.000410"/>
</branch>
<status status="FAIL" start="2026-04-17T03:12:29.973310" elapsed="0.616580">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:30.590551" elapsed="0.000093"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:30.590901" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:30.590843" elapsed="0.000165"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:30.590813" elapsed="0.000247"/>
</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-04-17T03:12:30.591320" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:12:30.591424" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:12:29.971631" elapsed="0.619958">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:30.591698" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:12:29.858712" elapsed="0.733124">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:30.592471" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:30.592198" elapsed="0.000408"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:30.592168" elapsed="0.000476"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:30.592693" elapsed="0.000022"/>
</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-04-17T03:12:29.850184" elapsed="0.742658">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:32.654773" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:32.654143" elapsed="0.000665"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:32.655653" 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-04-17T03:12:32.655362" elapsed="0.000473">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-04-17T03:12:32.655977" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:32.655005" elapsed="0.000999"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:32.656674" 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-04-17T03:12:32.656214" elapsed="0.000492"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:12:32.657073" 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-04-17T03:12:32.657245" 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-04-17T03:12:32.656903" elapsed="0.000368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:32.657679" 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-04-17T03:12:32.657428" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:32.659163" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:32.658766" elapsed="0.000445"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:12:32.659651" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:12:32.659374" elapsed="0.000303"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:32.660149" elapsed="0.000030"/>
</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-04-17T03:12:32.660372" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:32.660548" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:12:32.659993" elapsed="0.000613"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:12:32.659780" elapsed="0.000858"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:12:32.660686" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:12:32.660861" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:12:32.658274" elapsed="0.002613"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:32.657882" elapsed="0.003039"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:32.661117" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:32.660967" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:32.657855" elapsed="0.003341"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:12:32.661804" 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-04-17T03:12:32.661338" elapsed="0.000494"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:12:32.661882" 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-04-17T03:12:32.653384" elapsed="0.008647"/>
</kw>
<msg time="2026-04-17T03:12:32.662088" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:12:32.640038" elapsed="0.022107"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:12:32.675634" elapsed="0.000065"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:12:32.688573" elapsed="0.000044"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:12:32.702185" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:32.702435" 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-04-17T03:12:32.702618" 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-04-17T03:12:32.703201" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:32.703004" elapsed="0.000264"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:32.702982" elapsed="0.000315"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:32.703447" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:32.703618" 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-04-17T03:12:32.703788" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:12:32.702901" elapsed="0.000941"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:12:32.702771" elapsed="0.001099"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:32.704037" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:32.704118" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:12:32.704276" 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-04-17T03:12:32.635390" elapsed="0.068952"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:32.705781" 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-04-17T03:12:32.705489" elapsed="0.000370">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-04-17T03:12:32.705976" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:32.705077" elapsed="0.000926"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:32.706343" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:32.706076" elapsed="0.000326"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:12:32.706925" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:32.706617" elapsed="0.000352"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:32.706427" elapsed="0.000579"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:32.706057" elapsed="0.000971"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:32.709478" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:12:32.707180" elapsed="0.002326"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:12:32.709558" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:12:32.709721" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:12:32.704695" elapsed="0.005052"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:32.711037" 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-04-17T03:12:32.710764" elapsed="0.000343">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-04-17T03:12:32.711205" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:32.710419" elapsed="0.000811"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:12:32.711444" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:12:32.711302" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:32.711284" elapsed="0.000248"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:32.711681" 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-04-17T03:12:32.711854" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:12:32.711987" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:12:32.714198" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:12:32.710081" elapsed="0.004145"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:32.715647" 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-04-17T03:12:32.715386" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:32.716105" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:32.715844" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:12:32.721311" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:32.922747" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:33.325629" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:33.327480" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:12:32.718359" elapsed="0.612460">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:12:32.716213" elapsed="0.614809">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:33.331410" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:33.331091" elapsed="0.000424"/>
</branch>
<status status="FAIL" start="2026-04-17T03:12:32.716196" elapsed="0.615355">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:33.332275" elapsed="0.000042"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:33.332489" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:33.332430" elapsed="0.000124"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:33.332402" elapsed="0.000183"/>
</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-04-17T03:12:33.332799" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:12:33.332900" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:12:32.714548" elapsed="0.618545">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:33.333209" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:12:32.610811" elapsed="0.722542">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:33.333763" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:33.333489" elapsed="0.000475"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:33.333465" elapsed="0.000538"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:33.334054" elapsed="0.000022"/>
</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-04-17T03:12:32.602137" elapsed="0.732067">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:12:33.334363" level="FAIL">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 5 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-17T03:12:21.602177" elapsed="11.732343">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 5 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verifies that example-ipv6-topology is filled with ipv6 route</doc>
<status status="FAIL" start="2026-04-17T03:12:21.601881" elapsed="11.732804">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 5 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verifies that example-ipv6-topology is filled after starting exabgp.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:12:21.522948" elapsed="11.811968">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 5 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:12:33.339140" elapsed="0.000299"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:12:33.338837" elapsed="0.000680"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:12:33.340821" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:33.340680" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:33.340655" elapsed="0.000243"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:12:33.346098" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:33.345976" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:33.345956" elapsed="0.000215"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:33.347318" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:12:33.346826" elapsed="0.000523"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:12:33.347863" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:12:33.347514" elapsed="0.000377"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:12:33.347936" elapsed="0.000055"/>
</return>
<msg time="2026-04-17T03:12:33.348124" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:12:33.346428" elapsed="0.001720"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:12:33.354393" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:33.354252" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:33.354225" 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-04-17T03:12:33.355883" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:33.355770" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:33.355751" elapsed="0.000288"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:12:33.356549" level="INFO">${karaf_connection_index} = 18</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:12:33.356199" elapsed="0.000384"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:12:33.357147" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:12:33.356877" elapsed="0.000298"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:12:33.358210" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:12:33.357728" elapsed="0.001162">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:12:33.359101" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:12:33.359148" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:33.357342" elapsed="0.001830"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:12:33.360009" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:12:33.359690" elapsed="0.000973">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:12:33.360848" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:12:33.360894" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:33.359341" elapsed="0.001576"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:12:33.361918" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Bgp_Peer_Configuration"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:12:33.361297" elapsed="0.000704">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Bgp_Peer_Configuration"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:12:33.361024" elapsed="0.001047">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Bgp_Peer_Configuration"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:12:33.361001" elapsed="0.001105">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Bgp_Peer_Configuration"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:33.362266" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:33.362495" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:33.362357" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:33.362340" elapsed="0.000228"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:12:33.362603" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:12:33.365349" elapsed="0.000158"/>
</kw>
<msg time="2026-04-17T03:12:33.365578" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:12:33.364253" elapsed="0.001463"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:33.366040" elapsed="0.000083"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:33.366414" 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-04-17T03:12:33.363485" elapsed="0.003129"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:12:33.362902" elapsed="0.003780"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:12:33.355428" elapsed="0.011345">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Bgp_Peer_Configuration"</status>
</kw>
<msg time="2026-04-17T03:12:33.366885" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:12:33.367066" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Bgp_Peer_Configuration"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:33.354676" elapsed="0.012438"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:12:33.367378" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:33.367226" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:33.367197" elapsed="0.000266"/>
</if>
<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-04-17T03:12:33.368454" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:33.368343" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:33.368324" elapsed="0.000198"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:12:33.368867" level="INFO">index=15
host=10.30.170.120
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-04-17T03:12:33.369169" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
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-04-17T03:12:33.368689" elapsed="0.000509"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:33.369684" level="INFO">{1: 18}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:33.369376" elapsed="0.000356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:33.370159" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:33.369888" elapsed="0.000316"/>
</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-04-17T03:12:33.370827" elapsed="0.000308"/>
</kw>
<msg time="2026-04-17T03:12:33.371239" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:12:33.371286" level="INFO">${old_connection_index} = 18</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:33.370399" elapsed="0.000911"/>
</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-04-17T03:12:33.372243" elapsed="0.000226"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:12:33.374028" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:12:33.373269" elapsed="0.001902">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:33.372646" elapsed="0.002667"/>
</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-04-17T03:12:33.376255" elapsed="0.000348"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:33.375530" elapsed="0.001171"/>
</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-04-17T03:12:33.371642" elapsed="0.005109"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:33.371406" elapsed="0.005396"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:33.371385" elapsed="0.005451"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:12:33.377914" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:12:33.377572" elapsed="0.000390"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:12:33.378017" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:12:33.378195" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:12:33.377160" elapsed="0.001061"/>
</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-04-17T03:12:33.378380" elapsed="0.000456"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:12:33.379159" level="INFO">index=19
host=10.30.170.120
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-04-17T03:12:33.379265" level="INFO">${karaf_connection_object} = index=19
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:12:33.379031" elapsed="0.000262"/>
</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-04-17T03:12:33.379443" elapsed="0.002493"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:12:33.382409" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:12:33.383587" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:12:33.382131" elapsed="0.001915">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:12:33.401587" elapsed="0.000501"/>
</kw>
<msg time="2026-04-17T03:12:33.402205" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:12:33.399870" 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-04-17T03:12:33.402609" elapsed="0.000028"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:33.402835" elapsed="0.000036"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:12:33.385452" elapsed="0.017513"/>
</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-04-17T03:12:33.384595" elapsed="0.018517"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:12:33.367906" elapsed="0.035313">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:33.403661" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:12:33.403744" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:12:33.353719" elapsed="0.050143">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:12:33.404213" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:12:33.404260" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:33.348535" elapsed="0.055749"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:33.404668" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:33.404373" elapsed="0.000351"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:33.404351" elapsed="0.000399"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:12:33.348390" elapsed="0.056385"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:12:33.348209" elapsed="0.056607"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:12:33.345573" elapsed="0.059333"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:12:33.340359" elapsed="0.064630"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:33.339715" elapsed="0.065328"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:12:33.336233" elapsed="0.068868"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:12:33.406074" 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-04-17T03:12:33.405323" elapsed="0.000781"/>
</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-04-17T03:12:33.452847" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:33.452395" elapsed="0.000489"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:33.453771" 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-04-17T03:12:33.453497" elapsed="0.000356">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-04-17T03:12:33.453969" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:33.453134" elapsed="0.000862"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:33.454567" 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-04-17T03:12:33.454162" elapsed="0.000433"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:12:33.454916" 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-04-17T03:12:33.455110" 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-04-17T03:12:33.454768" elapsed="0.000369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:33.455568" 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-04-17T03:12:33.455309" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:33.456762" 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-04-17T03:12:33.456484" elapsed="0.000330"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:12:33.457339" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:12:33.456993" elapsed="0.000373"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:12:33.458097" 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-04-17T03:12:33.457755" elapsed="0.000369"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:12:33.458888" 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-04-17T03:12:33.458648" elapsed="0.000268"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:12:33.458987" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:12:33.459159" 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-04-17T03:12:33.458318" elapsed="0.000868"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:12:33.459340" elapsed="0.000246"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">2607:f0d0:1002:0011:0000:0000:0000:0002</var>
<status status="PASS" start="2026-04-17T03:12:33.457615" elapsed="0.002012"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:12:33.460222" 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-04-17T03:12:33.459891" elapsed="0.000358"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:12:33.462782" 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-04-17T03:12:33.460786" elapsed="0.002025"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:12:33.462864" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:12:33.463054" 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-04-17T03:12:33.460437" elapsed="0.002642"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:12:33.463232" elapsed="0.000234"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:12:33.459746" elapsed="0.003761"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:12:33.464083" 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-04-17T03:12:33.463754" elapsed="0.000355"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:12:33.464843" 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-04-17T03:12:33.464627" elapsed="0.000241"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:12:33.464918" elapsed="0.000048"/>
</return>
<msg time="2026-04-17T03:12:33.465096" 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-04-17T03:12:33.464302" elapsed="0.000823"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:12:33.465299" elapsed="0.000228"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:12:33.463622" elapsed="0.001947"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:12:33.466157" 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-04-17T03:12:33.465823" elapsed="0.000361"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:12:33.466911" 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-04-17T03:12:33.466695" elapsed="0.000259"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:12:33.467006" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:12:33.467164" 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-04-17T03:12:33.466372" elapsed="0.000817"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:12:33.467339" elapsed="0.000229"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:12:33.465689" elapsed="0.001919"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:12:33.468205" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:12:33.467856" elapsed="0.000381"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:12:33.469045" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:12:33.468808" elapsed="0.000264"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:12:33.469123" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:12:33.469342" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:12:33.468483" 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-04-17T03:12:33.469522" elapsed="0.000229"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:12:33.467724" elapsed="0.002067"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:12:33.470371" 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-04-17T03:12:33.470060" elapsed="0.000338"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:12:33.471149" 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-04-17T03:12:33.470912" elapsed="0.000263"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:12:33.471225" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:12:33.471383" 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-04-17T03:12:33.470588" elapsed="0.000820"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:12:33.471557" elapsed="0.000225"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:12:33.469909" elapsed="0.001914"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:12:33.472392" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:12:33.472090" elapsed="0.000329"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:12:33.473166" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:12:33.472934" elapsed="0.000259"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:12:33.473287" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:12:33.473447" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:12:33.472606" 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-04-17T03:12:33.473621" elapsed="0.000228"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:12:33.471957" elapsed="0.001932"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:12:33.474458" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:12:33.474156" elapsed="0.000329"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:12:33.475456" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:12:33.475238" elapsed="0.000245"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:12:33.475533" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:12:33.475689" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:12:33.474863" elapsed="0.000851"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:12:33.475862" elapsed="0.000248"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:12:33.474023" elapsed="0.002128"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:12:33.457422" elapsed="0.018770"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:12:33.476238" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:12:33.476408" 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-04-17T03:12:33.456149" elapsed="0.020286"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:33.455770" elapsed="0.020698"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:33.476653" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:33.476498" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:33.455745" elapsed="0.020986"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:12:33.477713" 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-04-17T03:12:33.476875" elapsed="0.000868"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:12:33.477846" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:12:33.451645" elapsed="0.026352"/>
</kw>
<msg time="2026-04-17T03:12:33.478055" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:12:33.437187" elapsed="0.040920"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:12:33.490793" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:33.503412" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. 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-04-17T03:12:33.516177" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:33.516399" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:33.516579" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:33.517045" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:33.516856" elapsed="0.000251"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:33.516839" elapsed="0.000297"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:33.517287" 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-04-17T03:12:33.517465" 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-04-17T03:12:33.517639" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:12:33.516800" elapsed="0.000896"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:12:33.516659" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:33.517968" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:33.518057" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:12:33.518218" 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-04-17T03:12:33.432454" elapsed="0.085794"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:33.519529" 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-04-17T03:12:33.519228" elapsed="0.000355"/>
</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-04-17T03:12:33.524781" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:12:33.726586" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:12:34.129669" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:12:34.132576" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:33.521849" elapsed="0.615926">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:12:33.519651" elapsed="0.618269">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:34.138312" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:34.138013" elapsed="0.000394"/>
</branch>
<status status="FAIL" start="2026-04-17T03:12:33.519633" elapsed="0.618809">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:12:34.139556" elapsed="0.000043"/>
</kw>
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:34.139676" elapsed="0.000029"/>
</return>
<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-04-17T03:12:33.518520" elapsed="0.621322">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:34.139959" 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="FAIL" start="2026-04-17T03:12:33.406345" elapsed="0.733754">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="FAIL" start="2026-04-17T03:12:33.335278" elapsed="0.805057">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:12:34.145478" elapsed="0.000290"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:12:34.145167" 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-04-17T03:12:34.146896" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:34.146772" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:34.146751" 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-04-17T03:12:34.152251" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:34.152141" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:34.152122" elapsed="0.000198"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:34.153401" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:12:34.152990" elapsed="0.000439"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:12:34.153993" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:12:34.153625" elapsed="0.000398"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:12:34.154069" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:12:34.154231" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:12:34.152588" elapsed="0.001668"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:12:34.160114" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:34.160002" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:34.159983" 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-04-17T03:12:34.161448" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:34.161340" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:34.161323" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:12:34.161984" level="INFO">${karaf_connection_index} = 19</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:12:34.161660" elapsed="0.000352"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:12:34.162396" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:12:34.162176" elapsed="0.000246"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:12:34.163188" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:12:34.162913" elapsed="0.000873">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:12:34.163993" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:12:34.164040" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:34.162578" elapsed="0.001485"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:12:34.164857" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:12:34.164572" elapsed="0.000986">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:12:34.165744" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:12:34.165789" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:34.164233" elapsed="0.001578"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:12:34.166745" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Empty"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:12:34.166128" elapsed="0.000678">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Empty"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:12:34.165885" elapsed="0.000987">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Empty"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:12:34.165866" elapsed="0.001039">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Empty"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:34.167092" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:34.167316" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:34.167178" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:34.167161" elapsed="0.000269"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:12:34.167463" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:12:34.170011" elapsed="0.000144"/>
</kw>
<msg time="2026-04-17T03:12:34.170221" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:12:34.168926" elapsed="0.001420"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:34.170616" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:34.170970" 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-04-17T03:12:34.168293" elapsed="0.002860"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:12:34.167739" elapsed="0.003478"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:12:34.161031" elapsed="0.010269">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Empty"</status>
</kw>
<msg time="2026-04-17T03:12:34.171401" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:12:34.171444" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Empty"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:34.160334" elapsed="0.011133"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:12:34.171648" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:34.171542" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:34.171524" elapsed="0.000188"/>
</if>
<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-04-17T03:12:34.172697" elapsed="0.000061"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:34.172589" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:34.172571" elapsed="0.000247"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:12:34.173112" level="INFO">index=15
host=10.30.170.120
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-04-17T03:12:34.173216" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
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-04-17T03:12:34.172986" elapsed="0.000257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:34.173652" level="INFO">{1: 19}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:34.173393" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:34.174177" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:34.173845" elapsed="0.000375"/>
</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-04-17T03:12:34.174741" elapsed="0.000275"/>
</kw>
<msg time="2026-04-17T03:12:34.175116" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:12:34.175162" level="INFO">${old_connection_index} = 19</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:34.174378" elapsed="0.000807"/>
</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-04-17T03:12:34.175999" elapsed="0.000194"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:12:34.177296" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:12:34.176877" elapsed="0.001364">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:34.176361" elapsed="0.001979"/>
</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-04-17T03:12:34.178984" elapsed="0.000273"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:34.178509" elapsed="0.000830"/>
</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-04-17T03:12:34.175477" elapsed="0.003908"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:34.175260" elapsed="0.004173"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:34.175242" elapsed="0.004215"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:12:34.180350" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:12:34.180038" elapsed="0.000339"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:12:34.180426" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:12:34.180577" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:12:34.179659" elapsed="0.000942"/>
</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-04-17T03:12:34.180753" elapsed="0.000477"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:12:34.181509" level="INFO">index=20
host=10.30.170.120
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-04-17T03:12:34.181608" level="INFO">${karaf_connection_object} = index=20
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:12:34.181403" elapsed="0.000230"/>
</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-04-17T03:12:34.181778" elapsed="0.002382"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:12:34.184659" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:12:34.185902" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:12:34.184372" elapsed="0.001990">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:12:34.200290" elapsed="0.000392"/>
</kw>
<msg time="2026-04-17T03:12:34.200778" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:12:34.198929" elapsed="0.002004"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:34.201121" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:34.201283" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:12:34.187220" elapsed="0.014144"/>
</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-04-17T03:12:34.186683" elapsed="0.014726"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:12:34.172297" elapsed="0.029196">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:34.201847" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:12:34.201921" elapsed="0.000344"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:12:34.159633" elapsed="0.042742">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:12:34.202486" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:12:34.202529" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:34.154637" elapsed="0.047915"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:34.202890" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:34.202632" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:34.202613" elapsed="0.000375"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:12:34.154493" elapsed="0.048519"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:12:34.154315" elapsed="0.048730"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:12:34.151731" elapsed="0.051373"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:12:34.146467" elapsed="0.056695"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:34.146008" elapsed="0.057200"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:12:34.141832" elapsed="0.061475"/>
</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-04-17T03:12:34.258061" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:34.257647" elapsed="0.000447"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:34.258902" 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-04-17T03:12:34.258632" elapsed="0.000369">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-04-17T03:12:34.259098" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:34.258292" elapsed="0.000830"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:34.259672" 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-04-17T03:12:34.259285" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:12:34.260018" 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-04-17T03:12:34.260192" 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-04-17T03:12:34.259858" elapsed="0.000360"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:34.260627" 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-04-17T03:12:34.260376" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:34.261720" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:34.261390" elapsed="0.000375"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:12:34.262263" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:12:34.261925" elapsed="0.000365"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:34.262619" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:34.262824" 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-04-17T03:12:34.263013" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:12:34.262487" elapsed="0.000584"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:12:34.262346" elapsed="0.000756"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:12:34.263148" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:12:34.263314" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:12:34.261066" elapsed="0.002273"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:34.260747" elapsed="0.002624"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:34.263536" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:34.263395" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:34.260724" elapsed="0.002886"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:12:34.264205" 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-04-17T03:12:34.263749" elapsed="0.000483"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:12:34.264279" 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-04-17T03:12:34.256987" elapsed="0.007413"/>
</kw>
<msg time="2026-04-17T03:12:34.264454" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:12:34.243728" elapsed="0.020816"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:12:34.277424" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:34.290311" 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-04-17T03:12:34.303746" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:34.304000" 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-04-17T03:12:34.304193" 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-04-17T03:12:34.304595" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:34.304446" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:34.304429" 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-04-17T03:12:34.304816" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:34.305000" 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-04-17T03:12:34.305179" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:12:34.304394" elapsed="0.000840"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:12:34.304276" elapsed="0.000987"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:34.305406" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:34.305484" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:12:34.305626" 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-04-17T03:12:34.238918" elapsed="0.066737"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:34.307116" 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-04-17T03:12:34.306795" elapsed="0.000397">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-04-17T03:12:34.307286" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:34.306416" elapsed="0.000894"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:34.307637" elapsed="0.000069"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:34.307380" elapsed="0.000364"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:12:34.308265" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:34.307966" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:34.307769" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:34.307363" elapsed="0.000986"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:34.310837" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:12:34.308516" elapsed="0.002348"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:12:34.310917" elapsed="0.000057"/>
</return>
<msg time="2026-04-17T03:12:34.311104" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:12:34.306012" elapsed="0.005116"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:34.312398" 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-04-17T03:12:34.312153" elapsed="0.000324">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-04-17T03:12:34.312575" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:34.311790" elapsed="0.000809"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:12:34.312807" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:12:34.312670" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:34.312652" elapsed="0.000240"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:34.313060" elapsed="0.000025"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:34.313271" elapsed="0.000027"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:12:34.313353" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:12:34.315930" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:12:34.311452" elapsed="0.004521"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:34.317563" 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-04-17T03:12:34.317306" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:34.318043" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:34.317768" elapsed="0.000321"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:12:34.323485" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:34.526857" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:34.930550" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:34.932842" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:12:34.320488" elapsed="0.618159">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:12:34.318196" elapsed="0.620695">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:34.939518" elapsed="0.000066"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:34.939025" elapsed="0.000783"/>
</branch>
<status status="FAIL" start="2026-04-17T03:12:34.318175" elapsed="0.621698">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:34.941037" elapsed="0.000069"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:34.941310" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:34.941269" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:34.941245" elapsed="0.000168"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:34.941570" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:12:34.941646" 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-04-17T03:12:34.316291" elapsed="0.625476">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:34.941848" 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-04-17T03:12:34.214852" elapsed="0.727124">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:34.942268" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:34.942077" elapsed="0.000400"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:34.942059" elapsed="0.000449"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:34.942550" elapsed="0.000017"/>
</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="FAIL" start="2026-04-17T03:12:34.208198" elapsed="0.734463">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:37.006968" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:37.006268" elapsed="0.000764"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:37.008643" 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-04-17T03:12:37.008139" elapsed="0.000650">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-04-17T03:12:37.009014" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:37.007468" elapsed="0.001596"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:37.010226" 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-04-17T03:12:37.009463" elapsed="0.000815"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:12:37.010634" 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-04-17T03:12:37.010911" 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-04-17T03:12:37.010462" elapsed="0.000492"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:37.011419" 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-04-17T03:12:37.011144" elapsed="0.000322"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:37.012623" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:37.012303" elapsed="0.000368"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:12:37.013175" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:12:37.012834" elapsed="0.000368"/>
</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-04-17T03:12:37.013568" elapsed="0.000032"/>
</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-04-17T03:12:37.013802" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:37.014007" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:12:37.013430" elapsed="0.000647"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:12:37.013270" elapsed="0.000840"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:12:37.014159" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:12:37.014344" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:12:37.011950" elapsed="0.002419"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:37.011551" elapsed="0.002896"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:37.014641" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:37.014473" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:37.011524" elapsed="0.003264"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:12:37.015567" 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-04-17T03:12:37.014998" elapsed="0.000598"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:12:37.015647" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_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-04-17T03:12:37.005428" elapsed="0.010350"/>
</kw>
<msg time="2026-04-17T03:12:37.015840" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:12:36.990192" elapsed="0.025717"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:12:37.030203" elapsed="0.000063"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:12:37.043847" elapsed="0.000045"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:12:37.058397" elapsed="0.000057"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:37.058846" 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-04-17T03:12:37.059066" 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-04-17T03:12:37.059481" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:37.059332" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:37.059315" 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-04-17T03:12:37.059703" 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-04-17T03:12:37.059867" 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-04-17T03:12:37.060058" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:12:37.059279" elapsed="0.000833"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:12:37.059153" elapsed="0.000985"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:37.060292" elapsed="0.000028"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:37.060411" elapsed="0.000021"/>
</return>
<msg time="2026-04-17T03:12:37.060599" 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-04-17T03:12:36.985054" elapsed="0.075575"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:37.062238" 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-04-17T03:12:37.061902" elapsed="0.000417">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-04-17T03:12:37.062429" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:37.061456" elapsed="0.000998"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:37.062815" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:37.062525" elapsed="0.000348"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:12:37.063497" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:37.063120" elapsed="0.000404"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:37.062897" elapsed="0.000664"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:37.062507" elapsed="0.001075"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:37.066166" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:12:37.063745" elapsed="0.002448"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:12:37.066244" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:12:37.066400" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:12:37.061023" elapsed="0.005401"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:37.067665" 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-04-17T03:12:37.067427" elapsed="0.000302">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-17T03:12:37.067822" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:37.067075" elapsed="0.000772"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:12:37.068081" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-17T03:12:37.067916" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:37.067898" elapsed="0.000278"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:37.068382" 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-04-17T03:12:37.068554" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:12:37.068619" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:12:37.070897" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:12:37.066730" elapsed="0.004193"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:37.072683" 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-04-17T03:12:37.072328" elapsed="0.000407"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:37.073195" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:37.072889" elapsed="0.000352"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:12:37.078791" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:37.280657" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:37.683338" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:37.685907" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:12:37.075718" elapsed="0.615995">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:12:37.073308" elapsed="0.618662">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:37.692478" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:37.692061" elapsed="0.000566"/>
</branch>
<status status="FAIL" start="2026-04-17T03:12:37.073290" elapsed="0.619391">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:37.693619" elapsed="0.000059"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:37.694020" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:37.693906" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:37.693866" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:37.694390" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:12:37.694461" 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-04-17T03:12:37.071287" elapsed="0.623289">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:37.694653" 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-04-17T03:12:36.960357" elapsed="0.734393">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:37.695117" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:37.694911" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:37.694893" elapsed="0.000322"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:37.695248" elapsed="0.000014"/>
</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="FAIL" start="2026-04-17T03:12:36.952436" elapsed="0.742914">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:39.759907" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:39.759442" elapsed="0.000519"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:39.760771" 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-04-17T03:12:39.760507" elapsed="0.000342">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-04-17T03:12:39.760968" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:39.760146" elapsed="0.000850"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:39.761588" 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-04-17T03:12:39.761166" elapsed="0.000453"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:12:39.762031" 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-04-17T03:12:39.762205" 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-04-17T03:12:39.761846" elapsed="0.000386"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:39.762830" 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-04-17T03:12:39.762416" elapsed="0.000463"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:39.764054" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:39.763704" elapsed="0.000398"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:12:39.764697" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:12:39.764270" elapsed="0.000454"/>
</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-04-17T03:12:39.765098" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:39.765314" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:39.765493" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:12:39.764957" elapsed="0.000594"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:12:39.764780" elapsed="0.000802"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:12:39.765631" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:12:39.765826" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:12:39.763361" elapsed="0.002491"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:39.762980" elapsed="0.002906"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:39.766080" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:39.765912" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:39.762954" elapsed="0.003273"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:12:39.766858" 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-04-17T03:12:39.766379" elapsed="0.000508"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:12:39.766956" elapsed="0.000033"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:12:39.758583" elapsed="0.008512"/>
</kw>
<msg time="2026-04-17T03:12:39.767171" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:12:39.744902" elapsed="0.022346"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:12:39.782440" elapsed="0.000058"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/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-04-17T03:12:39.798127" elapsed="0.000066"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:12:39.813467" elapsed="0.000055"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:39.813763" 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-04-17T03:12:39.813961" 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-04-17T03:12:39.814428" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:39.814273" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:39.814255" 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-04-17T03:12:39.814654" 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-04-17T03:12:39.814819" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:39.814998" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:12:39.814216" elapsed="0.000837"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:12:39.814075" elapsed="0.001005"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:39.815248" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:39.815327" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:12:39.815493" 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-04-17T03:12:39.740038" elapsed="0.075484"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:39.817216" 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-04-17T03:12:39.816889" elapsed="0.000406">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-04-17T03:12:39.817399" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:39.816433" 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-04-17T03:12:39.817775" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:39.817500" elapsed="0.000334"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:12:39.818439" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:39.818122" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:39.817860" elapsed="0.000642"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:39.817482" elapsed="0.001042"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:39.821084" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:12:39.818677" elapsed="0.002435"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:12:39.821164" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:12:39.821327" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:12:39.816025" elapsed="0.005328"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:39.822663" 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-04-17T03:12:39.822420" elapsed="0.000309">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-04-17T03:12:39.822826" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:39.822034" elapsed="0.000816"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:12:39.823080" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:12:39.822922" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:39.822903" elapsed="0.000280"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:39.823331" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:39.823503" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:12:39.823569" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:12:39.825761" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:12:39.821674" elapsed="0.004115"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:39.827483" 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-04-17T03:12:39.827216" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:39.827981" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:39.827687" elapsed="0.000341"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:12:39.833159" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:40.034974" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:40.437293" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:40.440285" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:12:39.830270" elapsed="0.616387">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:12:39.828096" elapsed="0.618932">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:40.447414" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:40.447096" elapsed="0.000419"/>
</branch>
<status status="FAIL" start="2026-04-17T03:12:39.828078" elapsed="0.619473">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:40.448206" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:40.448424" elapsed="0.000047"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:40.448357" elapsed="0.000171"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:40.448330" elapsed="0.000232"/>
</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-04-17T03:12:40.448781" elapsed="0.000035"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:12:40.448890" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:12:39.826251" elapsed="0.622837">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:40.449278" elapsed="0.000026"/>
</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-04-17T03:12:39.713555" elapsed="0.735876">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:40.449733" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:40.449546" elapsed="0.000260"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:40.449528" elapsed="0.000302"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:40.449863" elapsed="0.000014"/>
</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="FAIL" start="2026-04-17T03:12:39.706132" elapsed="0.743875">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:42.509287" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:42.508765" elapsed="0.000567"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:42.510246" 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-04-17T03:12:42.509973" elapsed="0.000358">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-04-17T03:12:42.510430" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:42.509570" elapsed="0.000968"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:42.511127" 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-04-17T03:12:42.510708" elapsed="0.000447"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:12:42.511460" 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-04-17T03:12:42.511604" 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-04-17T03:12:42.511317" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:42.512055" 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-04-17T03:12:42.511787" 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-04-17T03:12:42.513174" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:42.512851" elapsed="0.000369"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:12:42.513660" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:12:42.513380" 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-04-17T03:12:42.514135" 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-04-17T03:12:42.514360" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:42.514541" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:12:42.513966" elapsed="0.000631"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:12:42.513741" elapsed="0.000888"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:12:42.514678" elapsed="0.000053"/>
</return>
<msg time="2026-04-17T03:12:42.514892" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:12:42.512524" elapsed="0.002432"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:42.512183" elapsed="0.002815"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:42.515187" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:42.515026" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:42.512159" elapsed="0.003105"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:12:42.515862" 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-04-17T03:12:42.515408" elapsed="0.000481"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:12:42.515955" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:12:42.508030" elapsed="0.008053"/>
</kw>
<msg time="2026-04-17T03:12:42.516138" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:12:42.494588" elapsed="0.021601"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:12:42.529491" elapsed="0.000034"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_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-04-17T03:12:42.542472" 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-04-17T03:12:42.555715" elapsed="0.000032"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:42.555955" elapsed="0.000039"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:42.556171" 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-04-17T03:12:42.556621" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:42.556446" elapsed="0.000236"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:42.556418" elapsed="0.000290"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:42.556850" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:42.557034" 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-04-17T03:12:42.557200" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:12:42.556369" elapsed="0.000885"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:12:42.556257" elapsed="0.001024"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:42.557423" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:42.557505" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:12:42.557650" 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-04-17T03:12:42.489739" elapsed="0.067939"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:42.559141" 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-04-17T03:12:42.558805" elapsed="0.000413">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-04-17T03:12:42.559313" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:42.558392" elapsed="0.000946"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:42.559668" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:42.559408" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:12:42.560272" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:42.559968" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:42.559750" elapsed="0.000587"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:42.559389" elapsed="0.000969"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:42.562839" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:12:42.560558" elapsed="0.002309"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:12:42.562919" elapsed="0.000052"/>
</return>
<msg time="2026-04-17T03:12:42.563100" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:12:42.558041" elapsed="0.005084"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:42.564346" 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-04-17T03:12:42.564112" elapsed="0.000297">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-04-17T03:12:42.564547" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:42.563758" elapsed="0.000814"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:12:42.564777" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:12:42.564642" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:42.564624" elapsed="0.000237"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:42.565024" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:42.565205" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:12:42.565271" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:12:42.567412" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:12:42.563430" elapsed="0.004009"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:42.568854" 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-04-17T03:12:42.568598" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:42.569312" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:42.569069" 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-04-17T03:12:42.575639" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:42.777491" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:43.193361" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:43.195820" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:12:42.572144" elapsed="0.629119">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:12:42.569420" elapsed="0.631998">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:43.201795" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:43.201483" elapsed="0.000413"/>
</branch>
<status status="FAIL" start="2026-04-17T03:12:42.569402" elapsed="0.632551">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:43.202663" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:43.202867" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:43.202812" elapsed="0.000140"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:43.202786" elapsed="0.000197"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:43.203185" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:12:43.203283" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:12:42.567754" elapsed="0.635688">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:43.203623" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:12:42.466236" elapsed="0.737531">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:43.204186" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:43.203900" elapsed="0.000421"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:43.203877" elapsed="0.000480"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:43.204404" 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="FAIL" start="2026-04-17T03:12:42.459441" elapsed="0.745115">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:45.272523" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:45.272080" elapsed="0.000486"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:45.273456" 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-04-17T03:12:45.273130" elapsed="0.000415">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-04-17T03:12:45.273647" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:45.272754" elapsed="0.000919"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:45.274278" 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-04-17T03:12:45.273841" elapsed="0.000465"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:12:45.274654" 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-04-17T03:12:45.274848" 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-04-17T03:12:45.274473" elapsed="0.000402"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:45.275327" 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-04-17T03:12:45.275065" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:45.276515" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:45.276201" elapsed="0.000362"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:12:45.277051" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:12:45.276727" elapsed="0.000358"/>
</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-04-17T03:12:45.277471" elapsed="0.000025"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:45.277694" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:45.277872" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:12:45.277327" elapsed="0.000625"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:12:45.277160" elapsed="0.000923"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:12:45.278157" elapsed="0.000052"/>
</return>
<msg time="2026-04-17T03:12:45.278357" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:12:45.275832" elapsed="0.002551"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:45.275470" elapsed="0.002947"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:45.278595" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:45.278445" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:45.275437" elapsed="0.003280"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:12:45.279390" 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-04-17T03:12:45.278865" elapsed="0.000554"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:12:45.279469" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:12:45.271371" elapsed="0.008267"/>
</kw>
<msg time="2026-04-17T03:12:45.279700" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:12:45.257735" elapsed="0.022027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:12:45.295305" elapsed="0.000102"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:12:45.308583" elapsed="0.000070"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:12:45.321632" elapsed="0.000057"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:45.321967" 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-04-17T03:12:45.322156" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:45.322666" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:45.322502" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:45.322481" elapsed="0.000310"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:45.322964" 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-04-17T03:12:45.323132" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:45.323294" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:12:45.322424" elapsed="0.000922"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:12:45.322252" elapsed="0.001124"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:45.323523" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:45.323700" elapsed="0.000023"/>
</return>
<msg time="2026-04-17T03:12:45.323913" 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-04-17T03:12:45.249271" elapsed="0.074689"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:45.325612" 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-04-17T03:12:45.325274" elapsed="0.000425">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-04-17T03:12:45.325797" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:45.324787" 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-04-17T03:12:45.326182" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:45.325891" elapsed="0.000348"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:12:45.326780" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:45.326452" elapsed="0.000356"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:45.326263" elapsed="0.000580"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:45.325873" elapsed="0.000990"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:45.329268" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:12:45.327034" elapsed="0.002261"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:12:45.329345" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:12:45.329504" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:12:45.324358" elapsed="0.005171"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:45.330780" 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-04-17T03:12:45.330530" elapsed="0.000316">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-04-17T03:12:45.330963" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:45.330188" elapsed="0.000801"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:12:45.331194" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:12:45.331059" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:45.331041" 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-04-17T03:12:45.331423" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:45.331591" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:12:45.331654" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:12:45.333782" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:12:45.329846" elapsed="0.003962"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:45.335315" 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-04-17T03:12:45.335055" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:45.335752" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:45.335511" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:12:45.340911" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:45.542405" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:45.945319" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:45.947476" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:12:45.337972" elapsed="0.613692">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:12:45.335858" elapsed="0.615975">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:45.952245" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:45.951896" elapsed="0.000453"/>
</branch>
<status status="FAIL" start="2026-04-17T03:12:45.335840" elapsed="0.616543">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:45.953067" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:45.953271" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:45.953216" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:45.953189" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:45.953563" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:12:45.953661" elapsed="0.000030"/>
</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-04-17T03:12:45.334143" elapsed="0.619700">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:45.953972" 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-04-17T03:12:45.222260" elapsed="0.731853">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:45.954501" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:45.954244" elapsed="0.000366"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:45.954221" elapsed="0.000422"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:45.954688" elapsed="0.000019"/>
</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="FAIL" start="2026-04-17T03:12:45.214108" elapsed="0.740738">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:12:45.955018" level="FAIL">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 5 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-17T03:12:34.203731" elapsed="11.751540">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 5 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verifies that example-ipv6-topology is empty</doc>
<status status="FAIL" start="2026-04-17T03:12:34.203450" elapsed="11.751991">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 5 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verifies that example-ipv6-topology is empty after deconfiguring peer for the first time.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:12:34.140930" elapsed="11.814753">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 5 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:12:45.960096" elapsed="0.000253"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:12:45.959810" 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-04-17T03:12:45.961515" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:45.961386" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:45.961368" 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-04-17T03:12:45.966704" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:45.966582" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:45.966564" elapsed="0.000208"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:45.967818" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:12:45.967410" elapsed="0.000434"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:12:45.968341" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:12:45.968022" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:12:45.968413" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:12:45.968598" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:12:45.967023" elapsed="0.001600"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:12:45.974294" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:45.974165" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:45.974138" elapsed="0.000224"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:12:45.975642" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:45.975481" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:45.975462" elapsed="0.000277"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:12:45.976256" level="INFO">${karaf_connection_index} = 20</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:12:45.975892" elapsed="0.000392"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:12:45.976690" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:12:45.976444" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:12:45.977657" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:12:45.977250" elapsed="0.001095">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:12:45.978540" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:12:45.978586" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:45.976873" elapsed="0.001737"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:12:45.979396" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:12:45.979141" elapsed="0.000928">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:12:45.980305" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:12:45.980352" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:45.978779" elapsed="0.001596"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:12:45.981371" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Reconfigure_ODL_To_Accept_Connections_2"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:12:45.980717" elapsed="0.000717">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Reconfigure_ODL_To_Accept_Connections_2"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:12:45.980451" elapsed="0.001050">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Reconfigure_ODL_To_Accept_Connections_2"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:12:45.980432" elapsed="0.001102">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Reconfigure_ODL_To_Accept_Connections_2"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:45.981693" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:45.981915" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:45.981778" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:45.981762" elapsed="0.000248"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:12:45.982042" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:12:45.984627" elapsed="0.000144"/>
</kw>
<msg time="2026-04-17T03:12:45.984838" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:12:45.983527" 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-04-17T03:12:45.985379" elapsed="0.000084"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:45.985738" 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-04-17T03:12:45.982871" elapsed="0.003053"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:12:45.982330" elapsed="0.003680"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:12:45.975127" elapsed="0.010967">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Reconfigure_ODL_To_Accept_Connections_2"</status>
</kw>
<msg time="2026-04-17T03:12:45.986196" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:12:45.986239" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Reconfigure_ODL_To_Accept_Connections_2"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:45.974513" elapsed="0.011750"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:12:45.986463" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:45.986338" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:45.986320" elapsed="0.000209"/>
</if>
<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-04-17T03:12:45.987357" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:45.987245" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:45.987228" elapsed="0.000229"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:12:45.987768" level="INFO">index=15
host=10.30.170.120
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-04-17T03:12:45.987873" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
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-04-17T03:12:45.987637" elapsed="0.000262"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:45.988451" level="INFO">{1: 20}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:45.988189" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:45.989012" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:45.988720" elapsed="0.000338"/>
</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-04-17T03:12:45.989583" elapsed="0.000269"/>
</kw>
<msg time="2026-04-17T03:12:45.989972" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:12:45.990021" level="INFO">${old_connection_index} = 20</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:45.989216" elapsed="0.000832"/>
</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-04-17T03:12:45.990920" elapsed="0.000223"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:12:45.992390" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:12:45.991801" elapsed="0.001622">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:45.991310" elapsed="0.002215"/>
</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-04-17T03:12:45.994190" elapsed="0.000281"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:45.993700" elapsed="0.000856"/>
</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-04-17T03:12:45.990400" elapsed="0.004203"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:45.990124" elapsed="0.004528"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:45.990105" elapsed="0.004573"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:12:45.995533" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:12:45.995224" elapsed="0.000336"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:12:45.995613" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:12:45.995767" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:12:45.994882" elapsed="0.000909"/>
</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-04-17T03:12:45.995960" elapsed="0.000440"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:12:45.996739" level="INFO">index=21
host=10.30.170.120
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-04-17T03:12:45.996838" level="INFO">${karaf_connection_object} = index=21
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:12:45.996629" elapsed="0.000235"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:12:45.997029" elapsed="0.003237"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:12:46.001053" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:12:46.002498" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:12:46.000599" elapsed="0.002587">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:12:46.019070" elapsed="0.000411"/>
</kw>
<msg time="2026-04-17T03:12:46.019589" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:12:46.017513" elapsed="0.002236"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:46.019945" elapsed="0.000033"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:46.020136" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:12:46.004366" elapsed="0.015872"/>
</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-04-17T03:12:46.003595" elapsed="0.016702"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:12:45.986945" elapsed="0.033441">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:46.020828" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:12:46.020910" elapsed="0.000211"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:12:45.973784" elapsed="0.047439">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:12:46.021339" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:12:46.021383" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:45.969045" elapsed="0.052430"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:46.021846" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:46.021564" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:46.021544" elapsed="0.000398"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:12:45.968855" elapsed="0.053116"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:12:45.968681" elapsed="0.053323"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:12:45.966217" elapsed="0.055865"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:12:45.961082" elapsed="0.061067"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:45.960610" elapsed="0.061586"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:12:45.957189" elapsed="0.065064"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:12:46.023213" 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-04-17T03:12:46.022466" elapsed="0.000776"/>
</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-04-17T03:12:46.060167" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:46.059745" elapsed="0.000462"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:46.061134" 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-04-17T03:12:46.060803" elapsed="0.000428">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-04-17T03:12:46.061332" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:46.060402" elapsed="0.000955"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:46.061905" 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-04-17T03:12:46.061519" elapsed="0.000428"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:12:46.062248" 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-04-17T03:12:46.062415" 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-04-17T03:12:46.062108" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:46.062838" 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-04-17T03:12:46.062593" 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-04-17T03:12:46.063873" 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-04-17T03:12:46.063614" elapsed="0.000304"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:12:46.064357" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:12:46.064095" elapsed="0.000287"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:12:46.065130" 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-04-17T03:12:46.064802" elapsed="0.000354"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:12:46.065977" 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-04-17T03:12:46.065725" elapsed="0.000333"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:12:46.066113" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:12:46.066274" 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-04-17T03:12:46.065343" 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-04-17T03:12:46.066448" elapsed="0.000241"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">2607:f0d0:1002:11:0:0:0:2</var>
<status status="PASS" start="2026-04-17T03:12:46.064646" elapsed="0.002083"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:12:46.067294" 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-04-17T03:12:46.066994" elapsed="0.000325"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:12:46.115943" 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-04-17T03:12:46.115601" elapsed="0.000379"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:12:46.116049" elapsed="0.000048"/>
</return>
<msg time="2026-04-17T03:12:46.116235" 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-04-17T03:12:46.067505" elapsed="0.048756"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:12:46.116416" elapsed="0.000252"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:12:46.066846" elapsed="0.049863"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:12:46.117407" 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-04-17T03:12:46.117045" elapsed="0.000388"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:12:46.118215" 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-04-17T03:12:46.117997" elapsed="0.000244"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:12:46.118291" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:12:46.118446" 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-04-17T03:12:46.117653" elapsed="0.000818"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:12:46.118621" elapsed="0.000231"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:12:46.116878" elapsed="0.002015"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:12:46.119463" 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-04-17T03:12:46.119158" elapsed="0.000331"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:12:46.120233" 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-04-17T03:12:46.120015" elapsed="0.000244"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:12:46.120308" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:12:46.120463" 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-04-17T03:12:46.119676" elapsed="0.000812"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:12:46.120637" elapsed="0.000246"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:12:46.119026" elapsed="0.001898"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:12:46.121680" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:12:46.121236" elapsed="0.000472"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:12:46.122446" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:12:46.122235" elapsed="0.000237"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:12:46.122521" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:12:46.122675" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:12:46.121896" 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-04-17T03:12:46.122848" elapsed="0.000245"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:12:46.121056" elapsed="0.002077"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:12:46.123709" 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-04-17T03:12:46.123374" elapsed="0.000364"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:12:46.124463" 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-04-17T03:12:46.124254" elapsed="0.000310"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:12:46.124615" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:12:46.124780" 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-04-17T03:12:46.123922" 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-04-17T03:12:46.125014" elapsed="0.000269"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:12:46.123245" elapsed="0.002088"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:12:46.126160" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:12:46.125638" elapsed="0.000550"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:12:46.126907" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:12:46.126696" elapsed="0.000254"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:12:46.127002" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:12:46.127158" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:12:46.126379" elapsed="0.000803"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:12:46.127332" elapsed="0.000243"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:12:46.125470" elapsed="0.002147"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:12:46.128197" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:12:46.127863" elapsed="0.000360"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:12:46.129014" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:12:46.128725" elapsed="0.000316"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:12:46.129090" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:12:46.129245" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:12:46.128408" elapsed="0.000861"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:12:46.129417" elapsed="0.000222"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:12:46.127732" elapsed="0.001949"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:12:46.064434" elapsed="0.065282"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:12:46.129760" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:12:46.129945" 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-04-17T03:12:46.063277" elapsed="0.066697"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:46.062977" elapsed="0.067031"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:46.130190" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:46.130038" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:46.062954" elapsed="0.067314"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:12:46.131169" 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-04-17T03:12:46.130413" elapsed="0.000785"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:12:46.131245" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:12:46.059113" elapsed="0.072259"/>
</kw>
<msg time="2026-04-17T03:12:46.131428" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:12:46.045830" elapsed="0.085652"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:12:46.144998" 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/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-04-17T03:12:46.159503" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:46.174298" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:46.174533" 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-04-17T03:12:46.174734" 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-04-17T03:12:46.175198" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:46.175028" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:46.175009" 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-04-17T03:12:46.175444" 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-04-17T03:12:46.175625" 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-04-17T03:12:46.175804" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:12:46.174969" elapsed="0.000890"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:12:46.174823" elapsed="0.001065"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:46.176068" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:46.176152" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:12:46.176313" 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-04-17T03:12:46.041410" elapsed="0.134932"/>
</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-04-17T03:12:46.206836" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:46.206420" elapsed="0.000450"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:46.207671" 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-04-17T03:12:46.207403" elapsed="0.000346">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-04-17T03:12:46.207845" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:46.207059" elapsed="0.000810"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:46.208441" 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-04-17T03:12:46.208051" elapsed="0.000418"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:12:46.208770" 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-04-17T03:12:46.209015" 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-04-17T03:12:46.208628" elapsed="0.000478"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:46.209594" 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-04-17T03:12:46.209305" 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-04-17T03:12:46.210109" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:46.209733" elapsed="0.000439"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:12:46.210647" level="INFO">${mapping_to_use} = {'IP': '2607:f0d0:1002:11:0:0:0:2', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_IN...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:46.210345" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:46.210200" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:46.209708" elapsed="0.001023"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:12:46.211668" 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-04-17T03:12:46.210877" elapsed="0.000823"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:12:46.211755" elapsed="0.000053"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:12:46.205749" elapsed="0.006204"/>
</kw>
<msg time="2026-04-17T03:12:46.212017" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:12:46.190167" elapsed="0.021902"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:12:46.225418" elapsed="0.000034"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. 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-04-17T03:12:46.238007" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:46.250799" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:46.251021" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:46.251256" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:46.251639" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:46.251496" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:46.251481" 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-04-17T03:12:46.251855" 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-04-17T03:12:46.252035" 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-04-17T03:12:46.252199" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:12:46.251447" elapsed="0.000803"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:12:46.251337" elapsed="0.000941"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:46.252421" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:46.252496" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:12:46.252642" 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-04-17T03:12:46.187156" elapsed="0.065515"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:46.254559" 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-04-17T03:12:46.254126" elapsed="0.000536">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-04-17T03:12:46.254796" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:46.253462" elapsed="0.001369"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:46.255304" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:46.254947" elapsed="0.000436"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:12:46.256119" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:46.255663" elapsed="0.000493"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:46.255418" elapsed="0.000788"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:46.254903" elapsed="0.001333"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:46.259100" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:12:46.256445" elapsed="0.002682"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:12:46.259179" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:12:46.259339" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:12:46.253063" elapsed="0.006301"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:46.260826" 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-04-17T03:12:46.260559" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:46.261324" 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-04-17T03:12:46.261051" elapsed="0.000374"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:46.261914" 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-04-17T03:12:46.261580" elapsed="0.000411"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:46.262450" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:46.262194" elapsed="0.000300"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:12:46.263338" 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-04-17T03:12:46.263128" elapsed="0.000236"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:12:46.263748" 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-04-17T03:12:46.263522" elapsed="0.000253"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:12:46.263924" elapsed="0.000234"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:46.264558" 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-04-17T03:12:46.264313" elapsed="0.000289"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:12:46.264643" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:12:46.264801" 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-04-17T03:12:46.262699" elapsed="0.002126"/>
</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-04-17T03:12:46.271612" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:12:46.473827" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:12:46.877221" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:12:46.880281" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:12:46.267987" elapsed="0.617032">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:12:46.264896" elapsed="0.620299">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:46.885587" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:46.885263" elapsed="0.000454"/>
</branch>
<status status="FAIL" start="2026-04-17T03:12:46.264878" elapsed="0.620877">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:46.886439" elapsed="0.000050"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:46.886727" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:46.886629" elapsed="0.000339"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:46.886591" elapsed="0.000425"/>
</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-04-17T03:12:46.887244" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:12:46.887344" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:12:46.259699" elapsed="0.627814">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:46.887628" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:12:46.030208" elapsed="0.857565">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:46.888323" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:46.887996" elapsed="0.000430"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:46.887959" elapsed="0.000504"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:46.888512" elapsed="0.000021"/>
</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="FAIL" start="2026-04-17T03:12:46.023518" elapsed="0.865141">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Configure BGP peer modules with initiate-connection set to false with ipv6 address without "::" shortened version.</doc>
<status status="FAIL" start="2026-04-17T03:12:45.956105" elapsed="0.932803">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:12:46.893727" elapsed="0.000360"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:12:46.893435" 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-04-17T03:12:46.895408" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:46.895268" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:46.895243" 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-04-17T03:12:46.900699" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:46.900575" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:46.900553" elapsed="0.000221"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:46.901923" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:12:46.901479" elapsed="0.000493"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:12:46.902532" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:12:46.902157" elapsed="0.000403"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:12:46.902606" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:12:46.902799" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:12:46.901045" elapsed="0.001778"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:12:46.970201" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:46.970004" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:46.969969" elapsed="0.000352"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:12:46.972115" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:46.972003" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:46.971983" elapsed="0.000202"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:12:46.972663" level="INFO">${karaf_connection_index} = 21</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:12:46.972332" elapsed="0.000361"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:12:46.973104" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:12:46.972858" elapsed="0.000273"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:12:46.974101" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:12:46.973802" elapsed="0.001019">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:12:46.975049" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:12:46.975096" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:46.973292" elapsed="0.001828"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:12:46.975910" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:12:46.975658" elapsed="0.000936">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:12:46.976785" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:12:46.976831" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:46.975294" elapsed="0.001560"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:12:46.977819" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Filled_2"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:12:46.977188" elapsed="0.000707">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Filled_2"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:12:46.976955" elapsed="0.001042">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Filled_2"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:12:46.976913" elapsed="0.001120">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Filled_2"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:46.978199" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:46.978434" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:46.978285" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:46.978268" elapsed="0.000241"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:12:46.978541" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:12:46.981389" elapsed="0.000160"/>
</kw>
<msg time="2026-04-17T03:12:46.981620" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:12:46.980176" elapsed="0.001582"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:46.982071" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:46.982428" 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-04-17T03:12:46.979490" elapsed="0.003131"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:12:46.978817" 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="FAIL" start="2026-04-17T03:12:46.971628" elapsed="0.011153">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Filled_2"</status>
</kw>
<msg time="2026-04-17T03:12:46.982907" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:12:46.982972" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Filled_2"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:46.970579" elapsed="0.012470"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:12:46.983252" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:46.983134" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:46.983115" elapsed="0.000207"/>
</if>
<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-04-17T03:12:46.984207" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:46.984094" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:46.984075" elapsed="0.000203"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:12:46.984580" level="INFO">index=15
host=10.30.170.120
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-04-17T03:12:46.984690" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
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-04-17T03:12:46.984446" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:46.985256" level="INFO">{1: 21}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:46.984886" elapsed="0.000417"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:46.985736" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:46.985471" elapsed="0.000312"/>
</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-04-17T03:12:46.986368" elapsed="0.000276"/>
</kw>
<msg time="2026-04-17T03:12:46.986750" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:12:46.986800" level="INFO">${old_connection_index} = 21</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:46.985971" elapsed="0.000854"/>
</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-04-17T03:12:46.987773" elapsed="0.000409"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:12:46.989478" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:12:46.989068" elapsed="0.001280">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:46.988373" elapsed="0.002074"/>
</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-04-17T03:12:46.991131" elapsed="0.000277"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:46.990619" elapsed="0.000873"/>
</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-04-17T03:12:46.987206" elapsed="0.004334"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:46.986949" elapsed="0.004640"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:46.986887" elapsed="0.004727"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:12:46.992468" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:12:46.992161" elapsed="0.000333"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:12:46.992542" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:12:46.992696" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:12:46.991821" elapsed="0.000899"/>
</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-04-17T03:12:46.992872" elapsed="0.000462"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:12:46.993609" level="INFO">index=22
host=10.30.170.120
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-04-17T03:12:46.993708" level="INFO">${karaf_connection_object} = index=22
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:12:46.993503" elapsed="0.000230"/>
</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-04-17T03:12:46.993878" elapsed="0.002351"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:12:46.996653" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:12:46.997908" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:12:46.996393" elapsed="0.001916">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:12:47.012391" elapsed="0.000405"/>
</kw>
<msg time="2026-04-17T03:12:47.012894" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:12:47.010879" elapsed="0.002476"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:47.013520" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:47.013684" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:12:46.999237" elapsed="0.014532"/>
</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-04-17T03:12:46.998631" elapsed="0.015187"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:12:46.983761" elapsed="0.030143">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:47.014289" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:12:47.014366" 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="FAIL" start="2026-04-17T03:12:46.969373" elapsed="0.045106">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:12:47.014590" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:12:47.014634" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:46.959391" elapsed="0.055267"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:47.015245" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:47.014742" elapsed="0.000562"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:47.014722" elapsed="0.000608"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:12:46.958820" elapsed="0.056536"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:12:46.958177" elapsed="0.057214"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:12:46.900143" elapsed="0.115308"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:12:46.894946" elapsed="0.120564"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:46.894391" elapsed="0.121165"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:12:46.890310" elapsed="0.125299"/>
</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-04-17T03:12:47.072224" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:47.071802" elapsed="0.000453"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:47.073051" 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-04-17T03:12:47.072770" elapsed="0.000389">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-04-17T03:12:47.073270" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:47.072432" elapsed="0.000865"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:47.073881" 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-04-17T03:12:47.073471" elapsed="0.000445"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:12:47.074301" 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-04-17T03:12:47.074531" 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-04-17T03:12:47.074136" elapsed="0.000422"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:47.074998" 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-04-17T03:12:47.074723" elapsed="0.000322"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:47.076187" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:47.075855" elapsed="0.000380"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:12:47.076706" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:12:47.076413" elapsed="0.000320"/>
</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-04-17T03:12:47.077125" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:47.077351" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:47.077540" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:12:47.076974" elapsed="0.000625"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:12:47.076792" elapsed="0.000840"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:12:47.077683" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:12:47.077861" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:12:47.075503" elapsed="0.002385"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:47.075163" elapsed="0.002759"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:47.078133" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:47.077969" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:47.075138" elapsed="0.003075"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:12:47.078842" 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-04-17T03:12:47.078372" elapsed="0.000500"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:12:47.078923" 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/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-04-17T03:12:47.071079" elapsed="0.007997"/>
</kw>
<msg time="2026-04-17T03:12:47.079153" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:12:47.057226" elapsed="0.021980"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:12:47.094007" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:47.108597" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_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-04-17T03:12:47.122226" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:47.122471" 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-04-17T03:12:47.122665" 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-04-17T03:12:47.123090" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:47.122909" elapsed="0.000241"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:47.122893" 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-04-17T03:12:47.123360" 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-04-17T03:12:47.123543" 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-04-17T03:12:47.123722" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:12:47.122860" elapsed="0.000918"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:12:47.122746" elapsed="0.001060"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:47.123986" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:47.124069" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:12:47.124212" 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-04-17T03:12:47.052275" elapsed="0.071965"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:47.125558" 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-04-17T03:12:47.125292" elapsed="0.000337">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-04-17T03:12:47.125723" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:47.124907" elapsed="0.000841"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:47.126083" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:47.125819" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:12:47.126659" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:47.126356" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:47.126173" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:47.125801" elapsed="0.000941"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:47.129175" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:12:47.126891" elapsed="0.002316"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:12:47.129266" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:12:47.129425" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:12:47.124570" elapsed="0.004879"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:47.130786" 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-04-17T03:12:47.130444" elapsed="0.000407">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-04-17T03:12:47.130966" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:47.130094" elapsed="0.000898"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:12:47.131199" elapsed="0.000075"/>
</return>
<status status="PASS" start="2026-04-17T03:12:47.131063" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:47.131046" elapsed="0.000294"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:47.131523" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:47.131695" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:12:47.131760" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:12:47.133949" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:12:47.129755" elapsed="0.004223"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:47.135436" 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-04-17T03:12:47.135147" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:47.135912" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:47.135652" elapsed="0.000324"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:12:47.141399" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:47.343113" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:47.745454" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:47.747828" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:12:47.138456" elapsed="0.614656">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:12:47.136048" elapsed="0.617282">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:47.753832" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:47.753418" elapsed="0.000526"/>
</branch>
<status status="FAIL" start="2026-04-17T03:12:47.136029" elapsed="0.617952">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:47.754614" elapsed="0.000040"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:47.754810" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:47.754756" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:47.754731" elapsed="0.000171"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:47.755124" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:12:47.755221" 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-04-17T03:12:47.134301" elapsed="0.621078">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:47.755486" 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-04-17T03:12:47.027501" elapsed="0.728122">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:47.756098" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:47.755824" elapsed="0.000378"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:47.755799" elapsed="0.000437"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:47.756282" elapsed="0.000021"/>
</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-04-17T03:12:47.021102" elapsed="0.735320">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:49.816635" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:49.816134" elapsed="0.000537"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:49.817520" 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-04-17T03:12:49.817226" elapsed="0.000374">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-04-17T03:12:49.817699" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:49.816851" elapsed="0.000878"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:49.818448" 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-04-17T03:12:49.817951" elapsed="0.000532"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:12:49.818876" 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-04-17T03:12:49.819070" 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-04-17T03:12:49.818697" elapsed="0.000401"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:49.819611" 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-04-17T03:12:49.819291" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:49.820893" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:49.820568" elapsed="0.000397"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:12:49.821441" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:12:49.821128" elapsed="0.000342"/>
</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-04-17T03:12:49.821848" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:49.822083" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:49.822261" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:12:49.821678" elapsed="0.000642"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:12:49.821526" elapsed="0.000825"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:12:49.822399" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:12:49.822576" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:12:49.820211" elapsed="0.002391"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:49.819775" elapsed="0.002860"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:49.822809" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:49.822662" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:49.819743" elapsed="0.003229"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:12:49.823604" 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-04-17T03:12:49.823134" elapsed="0.000499"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:12:49.823684" 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-04-17T03:12:49.815372" elapsed="0.008442"/>
</kw>
<msg time="2026-04-17T03:12:49.823871" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:12:49.800389" elapsed="0.023547"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:12:49.838729" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:49.852387" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:49.866988" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:49.867220" 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-04-17T03:12:49.867419" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:49.867844" elapsed="0.000227"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:49.867679" elapsed="0.000430"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:49.867661" elapsed="0.000476"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:49.868298" 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-04-17T03:12:49.868483" 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-04-17T03:12:49.868685" elapsed="0.000026"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:12:49.867623" elapsed="0.001126"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:12:49.867503" elapsed="0.001275"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:49.868951" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:49.869036" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:12:49.869183" 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-04-17T03:12:49.795731" elapsed="0.073481"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:49.870816" 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-04-17T03:12:49.870506" elapsed="0.000394">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-04-17T03:12:49.871029" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:49.870067" 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-04-17T03:12:49.871434" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:49.871138" elapsed="0.000361"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:12:49.872091" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:49.871737" elapsed="0.000383"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:49.871527" elapsed="0.000633"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:49.871118" elapsed="0.001066"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:49.875024" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:12:49.872361" elapsed="0.002693"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:12:49.875112" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:12:49.875289" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:12:49.869640" elapsed="0.005676"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:49.876728" 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-04-17T03:12:49.876438" elapsed="0.000361">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-04-17T03:12:49.876905" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:49.876054" elapsed="0.000894"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:12:49.877181" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-04-17T03:12:49.877029" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:49.877009" 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-04-17T03:12:49.877445" elapsed="0.000025"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:49.877642" elapsed="0.000023"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:12:49.877715" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:12:49.880231" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:12:49.875665" elapsed="0.004596"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:49.881900" 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-04-17T03:12:49.881606" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:49.882429" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:49.882151" elapsed="0.000327"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:12:49.888248" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:50.090222" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:50.493187" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:50.495376" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:12:49.885088" elapsed="0.614034">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:12:49.882553" elapsed="0.616846">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:50.499861" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:50.499477" elapsed="0.000550"/>
</branch>
<status status="FAIL" start="2026-04-17T03:12:49.882532" elapsed="0.617547">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:50.500764" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:50.501003" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:50.500915" elapsed="0.000156"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:50.500887" elapsed="0.000217"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:50.501329" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:12:50.501433" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:12:49.880654" elapsed="0.620944">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:50.501755" elapsed="0.000026"/>
</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-04-17T03:12:49.772040" elapsed="0.729861">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:50.502342" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:50.502063" elapsed="0.000386"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:50.502037" elapsed="0.000447"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:50.502532" elapsed="0.000021"/>
</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-04-17T03:12:49.764255" elapsed="0.738465">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:52.566858" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:52.566454" elapsed="0.000439"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:52.567679" 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-04-17T03:12:52.567422" elapsed="0.000336">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-04-17T03:12:52.567857" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:52.567082" elapsed="0.000892"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:52.568543" 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-04-17T03:12:52.568147" elapsed="0.000423"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:12:52.568916" 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-04-17T03:12:52.569090" 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-04-17T03:12:52.568764" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:52.569524" 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-04-17T03:12:52.569274" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:52.570602" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:52.570295" elapsed="0.000352"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:12:52.571103" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:12:52.570807" elapsed="0.000322"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:52.571463" 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-04-17T03:12:52.571669" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:52.571843" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:12:52.571329" elapsed="0.000571"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:12:52.571185" elapsed="0.000762"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:12:52.571997" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:12:52.572169" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:12:52.569969" elapsed="0.002226"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:52.569648" elapsed="0.002579"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:52.572396" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:52.572252" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:52.569623" elapsed="0.002849"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:12:52.573099" 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-04-17T03:12:52.572615" elapsed="0.000513"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:12:52.573177" 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-04-17T03:12:52.565811" elapsed="0.007491"/>
</kw>
<msg time="2026-04-17T03:12:52.573356" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:12:52.552615" elapsed="0.020788"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:12:52.586265" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_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-04-17T03:12:52.599132" 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-04-17T03:12:52.612094" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:52.612313" 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-04-17T03:12:52.612493" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:52.612948" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:52.612744" elapsed="0.000267"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:52.612726" elapsed="0.000313"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:52.613182" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:52.613347" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:52.613511" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:12:52.612689" elapsed="0.000875"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:12:52.612575" elapsed="0.001017"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:52.613737" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:52.613815" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:12:52.613979" 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-04-17T03:12:52.548166" elapsed="0.065841"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:52.615384" 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-04-17T03:12:52.615099" elapsed="0.000361">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-04-17T03:12:52.615555" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:52.614694" elapsed="0.000886"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:52.615910" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:52.615651" elapsed="0.000334"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:12:52.616483" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:52.616187" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:52.616010" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:52.615633" elapsed="0.000934"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:52.619029" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:12:52.616717" elapsed="0.002339"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:12:52.619108" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:12:52.619265" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:12:52.614344" elapsed="0.004945"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:52.620507" 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-04-17T03:12:52.620269" elapsed="0.000303">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-04-17T03:12:52.620719" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:52.619920" elapsed="0.000824"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:12:52.620987" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:12:52.620834" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:52.620815" elapsed="0.000257"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:52.621235" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:52.621405" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:12:52.621470" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:12:52.623639" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:12:52.619595" elapsed="0.004071"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:52.625176" 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-04-17T03:12:52.624892" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:52.625622" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:52.625377" 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-04-17T03:12:52.630832" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:52.832393" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:53.235005" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:53.237338" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:12:52.628109" elapsed="0.615210">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:12:52.625733" elapsed="0.617827">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:53.244111" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:53.243656" elapsed="0.000614"/>
</branch>
<status status="FAIL" start="2026-04-17T03:12:52.625715" elapsed="0.618610">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:53.245397" elapsed="0.000080"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:53.245893" elapsed="0.000089"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:53.245773" elapsed="0.000284"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:53.245713" elapsed="0.000396"/>
</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-04-17T03:12:53.246442" elapsed="0.000056"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:12:53.246631" elapsed="0.000037"/>
</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-04-17T03:12:52.623996" elapsed="0.622861">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:53.247021" 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-04-17T03:12:52.525301" elapsed="0.721822">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:53.247436" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:53.247238" elapsed="0.000286"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:53.247216" elapsed="0.000334"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:53.247585" 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-04-17T03:12:52.518826" elapsed="0.728862">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:55.306499" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:55.305909" elapsed="0.000638"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:55.307627" 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-04-17T03:12:55.307288" elapsed="0.000443">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-04-17T03:12:55.307863" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:55.306787" elapsed="0.001110"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:55.308730" 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-04-17T03:12:55.308184" elapsed="0.000583"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:12:55.309162" 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-04-17T03:12:55.309328" 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-04-17T03:12:55.309014" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:55.309763" 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-04-17T03:12:55.309512" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:55.310847" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:55.310534" elapsed="0.000359"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:12:55.311352" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:12:55.311081" elapsed="0.000297"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:55.311706" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:55.311914" elapsed="0.000041"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:12:55.312124" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:12:55.311572" elapsed="0.000609"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:12:55.311430" elapsed="0.000837"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:12:55.312317" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:12:55.312489" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:12:55.310211" elapsed="0.002303"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:55.309885" elapsed="0.002661"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:55.312715" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:55.312570" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:55.309862" elapsed="0.002929"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:12:55.313402" 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-04-17T03:12:55.312949" elapsed="0.000481"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:12:55.313478" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:12:55.305023" elapsed="0.008579"/>
</kw>
<msg time="2026-04-17T03:12:55.313657" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:12:55.291258" elapsed="0.022448"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:12:55.326642" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:55.341687" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:55.354326" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:55.354523" 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-04-17T03:12:55.354696" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:55.355072" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:55.354911" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:55.354897" 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-04-17T03:12:55.355325" 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-04-17T03:12:55.355507" 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-04-17T03:12:55.355672" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:12:55.354869" elapsed="0.000856"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:12:55.354768" elapsed="0.000983"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:55.355896" elapsed="0.000076"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:55.356033" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:12:55.356170" 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-04-17T03:12:55.286687" elapsed="0.069510"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:55.357460" 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-04-17T03:12:55.357213" elapsed="0.000314">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-04-17T03:12:55.357621" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:55.356851" elapsed="0.000794"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:55.357975" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:55.357715" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:12:55.358531" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:55.358234" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:55.358058" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:55.357697" elapsed="0.000915"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:55.361150" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:12:55.358760" elapsed="0.002426"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:12:55.361256" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:12:55.361430" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:12:55.356527" elapsed="0.004928"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:55.362797" 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-04-17T03:12:55.362551" elapsed="0.000310">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-04-17T03:12:55.362974" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:55.362132" elapsed="0.000868"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:12:55.363209" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-17T03:12:55.363072" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:55.363054" elapsed="0.000239"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:55.363439" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:55.363636" elapsed="0.000025"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:12:55.363710" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:12:55.365876" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:12:55.361788" elapsed="0.004114"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:55.367322" 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-04-17T03:12:55.367069" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:55.367763" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:55.367520" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:12:55.372769" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:55.574372" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:55.987709" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:55.990408" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:12:55.370086" elapsed="0.626112">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:12:55.367873" elapsed="0.628558">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:55.997044" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:55.996527" elapsed="0.000634"/>
</branch>
<status status="FAIL" start="2026-04-17T03:12:55.367855" elapsed="0.629342">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:55.997820" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:55.998141" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:55.998053" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:55.998011" elapsed="0.000327"/>
</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-04-17T03:12:55.998783" elapsed="0.000066"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:12:55.999007" elapsed="0.000036"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:12:55.366235" elapsed="0.633023">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:55.999429" elapsed="0.000036"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:12:55.263717" elapsed="0.735930">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:56.000297" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:55.999857" elapsed="0.000605"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:55.999820" elapsed="0.000696"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:56.000589" elapsed="0.000031"/>
</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-04-17T03:12:55.255974" elapsed="0.744836">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:58.065182" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:58.064735" elapsed="0.000482"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:58.066134" 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-04-17T03:12:58.065827" elapsed="0.000389">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-04-17T03:12:58.066317" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:58.065443" elapsed="0.000907"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:58.067018" 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-04-17T03:12:58.066532" elapsed="0.000515"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:12:58.067406" 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-04-17T03:12:58.067580" 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-04-17T03:12:58.067239" elapsed="0.000368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:58.068064" 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-04-17T03:12:58.067766" elapsed="0.000348"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:58.069217" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:58.068877" elapsed="0.000387"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:12:58.069725" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:12:58.069446" 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-04-17T03:12:58.070116" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:58.070326" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:58.070500" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:12:58.069977" elapsed="0.000580"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:12:58.069806" elapsed="0.000783"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:12:58.070638" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:12:58.070810" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:12:58.068549" elapsed="0.002286"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:58.068197" elapsed="0.002671"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:58.071061" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:58.070893" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:58.068172" elapsed="0.002968"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:12:58.071742" 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-04-17T03:12:58.071284" elapsed="0.000487"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:12:58.071824" 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-04-17T03:12:58.063871" elapsed="0.008125"/>
</kw>
<msg time="2026-04-17T03:12:58.072055" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:12:58.050523" elapsed="0.021583"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:12:58.085275" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:58.098337" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:58.110968" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:58.111175" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:58.111351" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:58.111731" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:58.111583" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:58.111568" 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-04-17T03:12:58.111972" 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-04-17T03:12:58.112142" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:58.112305" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:12:58.111535" elapsed="0.000821"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:12:58.111427" elapsed="0.000957"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:58.112527" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:58.112603" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:12:58.112735" 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-04-17T03:12:58.045788" elapsed="0.066973"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:58.114110" 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-04-17T03:12:58.113816" elapsed="0.000371">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-04-17T03:12:58.114282" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:58.113446" 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-04-17T03:12:58.114658" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:58.114376" elapsed="0.000342"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:12:58.115239" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:58.114922" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:58.114742" elapsed="0.000605"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:58.114358" elapsed="0.001014"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:58.117754" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:12:58.115523" elapsed="0.002258"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:12:58.117832" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:12:58.118006" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:12:58.113107" elapsed="0.004925"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:58.119275" 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-04-17T03:12:58.119037" elapsed="0.000300">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-04-17T03:12:58.119432" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:58.118659" elapsed="0.000796"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:12:58.119659" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:12:58.119524" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:58.119507" 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-04-17T03:12:58.119887" 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-04-17T03:12:58.120077" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:12:58.120143" elapsed="0.000014"/>
</return>
<msg time="2026-04-17T03:12:58.122267" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:12:58.118338" elapsed="0.003955"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:58.123743" 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-04-17T03:12:58.123488" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:58.124328" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:58.123943" 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-04-17T03:12:58.129486" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:58.332917" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:58.736493" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:58.739218" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:12:58.126554" elapsed="0.616313">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:12:58.124436" elapsed="0.618614">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:58.743498" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:58.743116" elapsed="0.000499"/>
</branch>
<status status="FAIL" start="2026-04-17T03:12:58.124419" elapsed="0.619232">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:58.744353" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:58.744668" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:58.744607" elapsed="0.000129"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:58.744576" elapsed="0.000193"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:58.745014" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:12:58.745123" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:12:58.122607" elapsed="0.622689">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:58.745413" 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-04-17T03:12:58.019201" elapsed="0.726375">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:58.746043" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:58.745735" elapsed="0.000422"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:58.745707" elapsed="0.000486"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:58.746243" elapsed="0.000023"/>
</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-04-17T03:12:58.010775" elapsed="0.735623">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:12:58.746559" level="FAIL">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 5 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-17T03:12:47.016055" elapsed="11.730660">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 5 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verifies that example-ipv6-topology is filled with ipv6 route</doc>
<status status="FAIL" start="2026-04-17T03:12:47.015754" elapsed="11.731134">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 5 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verifies that example-ipv6-topology is filled after configuring the peer for the second time.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:12:46.889267" elapsed="11.857927">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 5 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:12:58.751140" elapsed="0.000294"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:12:58.750843" elapsed="0.000661"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:12:58.752617" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:58.752492" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:58.752473" elapsed="0.000213"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:12:58.757883" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:58.757772" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:58.757754" elapsed="0.000215"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:58.759073" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:12:58.758650" elapsed="0.000451"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:12:58.759588" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:12:58.759282" elapsed="0.000333"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:12:58.759660" elapsed="0.000047"/>
</return>
<msg time="2026-04-17T03:12:58.759866" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:12:58.758256" elapsed="0.001661"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:12:58.765659" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:58.765546" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:58.765526" 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-04-17T03:12:58.767148" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:58.767037" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:58.767018" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:12:58.767670" level="INFO">${karaf_connection_index} = 22</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:12:58.767360" elapsed="0.000337"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:12:58.768173" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:12:58.767886" elapsed="0.000328"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:12:58.770707" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:12:58.770418" elapsed="0.000954">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:12:58.771568" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:12:58.771618" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:58.768396" elapsed="0.003247"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:12:58.772520" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:12:58.772258" elapsed="0.000951">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:12:58.773401" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:12:58.773449" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:58.771818" elapsed="0.001655"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:12:58.774444" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Bgp_Peer_Configuration_2"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:12:58.773777" elapsed="0.000733">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Bgp_Peer_Configuration_2"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:12:58.773551" elapsed="0.001028">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Bgp_Peer_Configuration_2"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:12:58.773532" elapsed="0.001082">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Bgp_Peer_Configuration_2"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:58.774777" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:58.775025" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:58.774866" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:58.774849" elapsed="0.000255"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:12:58.775137" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:12:58.777776" elapsed="0.000148"/>
</kw>
<msg time="2026-04-17T03:12:58.778010" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:12:58.776737" 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-04-17T03:12:58.778504" elapsed="0.000083"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:58.778861" elapsed="0.000081"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:12:58.776038" elapsed="0.003151"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:12:58.775411" elapsed="0.003845"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:12:58.766700" elapsed="0.012643">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Bgp_Peer_Configuration_2"</status>
</kw>
<msg time="2026-04-17T03:12:58.779448" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:12:58.779492" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Bgp_Peer_Configuration_2"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:58.765921" elapsed="0.013595"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:12:58.779703" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:58.779593" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:58.779575" elapsed="0.000193"/>
</if>
<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-04-17T03:12:58.780700" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:58.780585" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:58.780565" elapsed="0.000204"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:12:58.781069" level="INFO">index=15
host=10.30.170.120
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-04-17T03:12:58.781175" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
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-04-17T03:12:58.780923" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:58.781626" level="INFO">{1: 22}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:58.781356" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:58.782098" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:58.781826" elapsed="0.000316"/>
</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-04-17T03:12:58.782708" elapsed="0.000310"/>
</kw>
<msg time="2026-04-17T03:12:58.783121" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:12:58.783168" level="INFO">${old_connection_index} = 22</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:58.782303" elapsed="0.000888"/>
</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-04-17T03:12:58.784092" elapsed="0.000202"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:12:58.785646" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:12:58.785031" elapsed="0.001575">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:58.784465" elapsed="0.002261"/>
</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-04-17T03:12:58.787548" elapsed="0.000348"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:58.786925" elapsed="0.001144"/>
</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-04-17T03:12:58.783495" elapsed="0.004641"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:58.783270" elapsed="0.004932"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:58.783251" elapsed="0.004985"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:12:58.789305" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:12:58.788895" elapsed="0.000448"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:12:58.789407" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:12:58.789576" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:12:58.788484" elapsed="0.001117"/>
</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-04-17T03:12:58.789760" elapsed="0.000509"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:12:58.790635" level="INFO">index=23
host=10.30.170.120
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-04-17T03:12:58.790740" level="INFO">${karaf_connection_object} = index=23
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:12:58.790516" elapsed="0.000251"/>
</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-04-17T03:12:58.790920" elapsed="0.002491"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:12:58.793887" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:12:58.795158" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:12:58.793584" elapsed="0.001994">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:12:58.810728" elapsed="0.000762"/>
</kw>
<msg time="2026-04-17T03:12:58.811598" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:12:58.809154" elapsed="0.002611"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:58.811937" elapsed="0.000037"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:58.812120" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:12:58.796551" elapsed="0.015658"/>
</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-04-17T03:12:58.795898" elapsed="0.016361"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:12:58.780231" elapsed="0.032125">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:58.812766" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:12:58.812847" elapsed="0.000024"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:12:58.765173" elapsed="0.047814">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:12:58.813107" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:12:58.813153" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:58.760364" elapsed="0.052812"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:58.813590" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:58.813265" elapsed="0.000380"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:58.813242" elapsed="0.000431"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:12:58.760188" elapsed="0.053510"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:12:58.759996" elapsed="0.053738"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:12:58.757398" elapsed="0.056398"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:12:58.752186" elapsed="0.061668"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:58.751692" elapsed="0.062212"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:12:58.748274" elapsed="0.065711"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:12:58.815506" 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-04-17T03:12:58.814280" elapsed="0.001268"/>
</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-04-17T03:12:58.864130" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:58.863684" elapsed="0.000485"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:58.864987" 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-04-17T03:12:58.864699" elapsed="0.000367">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-04-17T03:12:58.865166" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:58.864352" elapsed="0.000847"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:58.865767" 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-04-17T03:12:58.865370" elapsed="0.000425"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:12:58.866128" 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-04-17T03:12:58.866308" 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-04-17T03:12:58.865979" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:58.866777" 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-04-17T03:12:58.866497" elapsed="0.000328"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:58.867846" 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-04-17T03:12:58.867582" elapsed="0.000311"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:12:58.868340" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:12:58.868072" elapsed="0.000293"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:12:58.869055" 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-04-17T03:12:58.868739" elapsed="0.000342"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:12:58.869805" 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-04-17T03:12:58.869581" elapsed="0.000249"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:12:58.869883" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:12:58.870066" 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-04-17T03:12:58.869266" elapsed="0.000825"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:12:58.870242" elapsed="0.000239"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">2607:f0d0:1002:11:0:0:0:2</var>
<status status="PASS" start="2026-04-17T03:12:58.868604" elapsed="0.001917"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:12:58.871166" 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-04-17T03:12:58.870765" elapsed="0.000428"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:12:58.871907" 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-04-17T03:12:58.871696" elapsed="0.000241"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:12:58.872016" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:12:58.872191" 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-04-17T03:12:58.871380" 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-04-17T03:12:58.872364" elapsed="0.000397"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:12:58.870637" elapsed="0.002165"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:12:58.873368" 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-04-17T03:12:58.873067" elapsed="0.000326"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:12:58.874198" 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-04-17T03:12:58.873986" elapsed="0.000238"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:12:58.874273" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:12:58.874424" 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-04-17T03:12:58.873655" elapsed="0.000793"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:12:58.874597" elapsed="0.000221"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:12:58.872914" elapsed="0.001944"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:12:58.875483" 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-04-17T03:12:58.875176" elapsed="0.000332"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:12:58.876240" 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-04-17T03:12:58.876029" elapsed="0.000236"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:12:58.876314" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:12:58.876464" 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-04-17T03:12:58.875692" 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-04-17T03:12:58.876635" elapsed="0.000222"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:12:58.875014" elapsed="0.001883"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:12:58.877456" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:12:58.877159" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:12:58.878206" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:12:58.877994" elapsed="0.000237"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:12:58.878281" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:12:58.878432" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:12:58.877663" elapsed="0.000793"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:12:58.878604" elapsed="0.000221"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:12:58.877028" elapsed="0.001836"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:12:58.879523" 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-04-17T03:12:58.879197" elapsed="0.000352"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:12:58.880420" 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-04-17T03:12:58.880204" elapsed="0.000242"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:12:58.880496" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:12:58.880650" 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-04-17T03:12:58.879741" 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-04-17T03:12:58.880823" elapsed="0.000263"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:12:58.879006" elapsed="0.002123"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:12:58.881675" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:12:58.881374" elapsed="0.000327"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:12:58.882457" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:12:58.882241" elapsed="0.000242"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:12:58.882534" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:12:58.882685" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:12:58.881884" elapsed="0.000825"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:12:58.882857" elapsed="0.000246"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:12:58.881242" elapsed="0.001902"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:12:58.883736" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:12:58.883432" elapsed="0.000368"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:12:58.884721" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:12:58.884509" elapsed="0.000238"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:12:58.884795" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:12:58.884963" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:12:58.884184" 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-04-17T03:12:58.885142" elapsed="0.000227"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:12:58.883298" elapsed="0.002125"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:12:58.868419" elapsed="0.017045"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:12:58.885508" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:12:58.885675" 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-04-17T03:12:58.867261" elapsed="0.018441"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:58.866904" elapsed="0.018830"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:58.885907" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:58.885760" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:58.866880" elapsed="0.019123"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:12:58.886855" 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-04-17T03:12:58.886144" elapsed="0.000740"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:12:58.886937" 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/bgp_peer.vanadium/${file_name} exists. 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-04-17T03:12:58.862924" elapsed="0.024156"/>
</kw>
<msg time="2026-04-17T03:12:58.887136" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:12:58.849028" elapsed="0.038156"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:12:58.899998" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:58.912758" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:58.925947" elapsed="0.000047"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:58.926198" 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-04-17T03:12:58.926384" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:58.926812" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:58.926664" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:58.926649" 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-04-17T03:12:58.927053" 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-04-17T03:12:58.927248" 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-04-17T03:12:58.927431" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:12:58.926618" elapsed="0.000869"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:12:58.926506" elapsed="0.001007"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:58.927660" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:58.927738" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:12:58.927875" 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-04-17T03:12:58.844403" elapsed="0.083500"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:58.929139" 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-04-17T03:12:58.928848" elapsed="0.000353"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:12:58.934641" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:12:59.136435" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:12:59.540285" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:12:59.543243" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:58.931409" elapsed="0.615868">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:12:58.929275" elapsed="0.618160">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:12:59.547842" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:59.547540" elapsed="0.000402"/>
</branch>
<status status="FAIL" start="2026-04-17T03:12:58.929257" elapsed="0.618747">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:12:59.549167" elapsed="0.000064"/>
</kw>
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:59.549338" elapsed="0.000039"/>
</return>
<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-04-17T03:12:58.928194" elapsed="0.621329">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:59.549620" elapsed="0.000022"/>
</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="FAIL" start="2026-04-17T03:12:58.815982" elapsed="0.733777">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="FAIL" start="2026-04-17T03:12:58.747537" elapsed="0.802495">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:12:59.554583" elapsed="0.000312"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:12:59.554239" elapsed="0.000735"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:12:59.556413" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:59.556245" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:59.556216" elapsed="0.000295"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:12:59.562656" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:59.562497" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:59.562468" elapsed="0.000288"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:59.564110" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:12:59.563617" elapsed="0.000523"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:12:59.564666" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:12:59.564307" elapsed="0.000385"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:12:59.564740" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:12:59.564908" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:12:59.563117" elapsed="0.001820"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:12:59.571152" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:59.571041" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:59.571020" 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-04-17T03:12:59.572557" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:59.572443" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:59.572425" elapsed="0.000226"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:12:59.573200" level="INFO">${karaf_connection_index} = 23</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:12:59.572848" elapsed="0.000380"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:12:59.573619" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:12:59.573394" elapsed="0.000318"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:12:59.574575" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:12:59.574251" elapsed="0.001013">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:12:59.575462" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:12:59.575508" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:59.573880" elapsed="0.001652"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:12:59.576366" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:12:59.576069" elapsed="0.000983">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:12:59.577241" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:12:59.577288" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:59.575703" elapsed="0.001608"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:12:59.578382" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Empty_2"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:12:59.577607" elapsed="0.000841">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Empty_2"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:12:59.577386" elapsed="0.001136">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Empty_2"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:12:59.577367" elapsed="0.001189">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Empty_2"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:59.578721" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:59.578966" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:59.578809" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:59.578792" elapsed="0.000252"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:12:59.579076" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:12:59.581739" elapsed="0.000150"/>
</kw>
<msg time="2026-04-17T03:12:59.581978" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:12:59.580583" 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-04-17T03:12:59.582442" elapsed="0.000082"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:59.582795" 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-04-17T03:12:59.579901" elapsed="0.003103"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:12:59.579356" elapsed="0.003715"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:12:59.572116" elapsed="0.011044">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Empty_2"</status>
</kw>
<msg time="2026-04-17T03:12:59.583265" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:12:59.583309" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Empty_2"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:59.571380" elapsed="0.011952"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:12:59.583520" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:59.583411" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:59.583392" elapsed="0.000194"/>
</if>
<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-04-17T03:12:59.584649" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:12:59.584543" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:59.584524" elapsed="0.000192"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:12:59.585074" level="INFO">index=15
host=10.30.170.120
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-04-17T03:12:59.585181" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
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-04-17T03:12:59.584870" elapsed="0.000392"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:59.585726" level="INFO">{1: 23}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:59.585451" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:59.586199" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:59.585929" elapsed="0.000313"/>
</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-04-17T03:12:59.586769" elapsed="0.000286"/>
</kw>
<msg time="2026-04-17T03:12:59.587155" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:12:59.587200" level="INFO">${old_connection_index} = 23</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:59.586402" elapsed="0.000821"/>
</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-04-17T03:12:59.588066" elapsed="0.000197"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:12:59.589531" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:12:59.589047" elapsed="0.001462">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:59.588458" elapsed="0.002155"/>
</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-04-17T03:12:59.591281" elapsed="0.000335"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:59.590788" elapsed="0.000919"/>
</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-04-17T03:12:59.587526" elapsed="0.004234"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:59.587299" elapsed="0.004530"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:59.587281" elapsed="0.004582"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:12:59.593121" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:12:59.592632" elapsed="0.000525"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:12:59.593224" elapsed="0.000045"/>
</return>
<msg time="2026-04-17T03:12:59.593451" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:12:59.592155" elapsed="0.001331"/>
</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-04-17T03:12:59.593668" elapsed="0.000471"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:12:59.594516" level="INFO">index=24
host=10.30.170.120
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-04-17T03:12:59.594652" level="INFO">${karaf_connection_object} = index=24
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:12:59.594364" elapsed="0.000323"/>
</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-04-17T03:12:59.594884" elapsed="0.002731"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:12:59.598067" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:12:59.599253" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:12:59.597782" elapsed="0.001870">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:12:59.614030" elapsed="0.000404"/>
</kw>
<msg time="2026-04-17T03:12:59.614532" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:12:59.612357" elapsed="0.002332"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:59.614852" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:59.615158" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:12:59.600500" elapsed="0.014745"/>
</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-04-17T03:12:59.599962" elapsed="0.015330"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:12:59.584204" elapsed="0.031239">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:59.615825" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:12:59.615903" 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="FAIL" start="2026-04-17T03:12:59.570665" elapsed="0.045374">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:12:59.616155" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:12:59.616199" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:59.565394" elapsed="0.050828"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:59.616568" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:59.616305" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:59.616285" elapsed="0.000363"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:12:59.565236" elapsed="0.051437"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:12:59.565023" elapsed="0.051683"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:12:59.561974" elapsed="0.054792"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:12:59.555815" elapsed="0.061011"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:12:59.555173" elapsed="0.061700"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:12:59.551617" elapsed="0.065316"/>
</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-04-17T03:12:59.678115" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:59.677686" elapsed="0.000470"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:59.679165" 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-04-17T03:12:59.678817" elapsed="0.000429">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-04-17T03:12:59.679389" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:59.678345" elapsed="0.001078"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:59.680103" 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-04-17T03:12:59.679638" elapsed="0.000495"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:12:59.680446" 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-04-17T03:12:59.680613" 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-04-17T03:12:59.680298" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:59.681103" 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-04-17T03:12:59.680814" elapsed="0.000346"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:59.682285" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:59.681961" elapsed="0.000371"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:12:59.682804" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:12:59.682491" elapsed="0.000339"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:59.683261" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:59.683475" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:59.683652" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:12:59.683123" elapsed="0.000588"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:12:59.682972" elapsed="0.000769"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:12:59.683788" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:12:59.683985" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:12:59.681560" elapsed="0.002452"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:59.681241" elapsed="0.002805"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:59.684234" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:59.684071" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:59.681218" elapsed="0.003095"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:12:59.684911" 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-04-17T03:12:59.684456" elapsed="0.000487"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:12:59.685010" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:12:59.677050" elapsed="0.008090"/>
</kw>
<msg time="2026-04-17T03:12:59.685197" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:12:59.663543" elapsed="0.021704"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:12:59.698875" elapsed="0.000033"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:59.711458" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:59.724037" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:59.724243" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:59.724421" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:59.724798" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:59.724654" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:12:59.724639" 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-04-17T03:12:59.725039" 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-04-17T03:12:59.725279" 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-04-17T03:12:59.725446" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:12:59.724605" elapsed="0.000895"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:12:59.724498" elapsed="0.001029"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:59.725672" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:12:59.725749" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:12:59.725886" 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-04-17T03:12:59.658821" elapsed="0.067092"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:59.727268" 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-04-17T03:12:59.726995" elapsed="0.000346">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-04-17T03:12:59.727436" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:59.726604" 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-04-17T03:12:59.727801" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:12:59.727530" elapsed="0.000329"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:12:59.728373" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:12:59.728075" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-17T03:12:59.727883" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:59.727512" elapsed="0.000945"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:12:59.730843" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:12:59.728605" elapsed="0.002264"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:12:59.730921" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:12:59.731093" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:12:59.726261" elapsed="0.004857"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:12:59.732359" 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-04-17T03:12:59.732124" elapsed="0.000298">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-04-17T03:12:59.732515" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:12:59.731739" elapsed="0.000801"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:12:59.732743" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:12:59.732609" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-17T03:12:59.732591" elapsed="0.000235"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:59.732986" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:12:59.733156" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:12:59.733220" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:12:59.735323" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:12:59.731421" elapsed="0.003928"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:59.736771" 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-04-17T03:12:59.736517" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:12:59.737277" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:12:59.737028" 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-04-17T03:12:59.742262" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:59.944506" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:00.347264" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:00.349513" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:12:59.739506" elapsed="0.615328">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:12:59.737389" elapsed="0.617721">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:00.355677" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:00.355206" elapsed="0.000641"/>
</branch>
<status status="FAIL" start="2026-04-17T03:12:59.737371" elapsed="0.618535">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:00.356980" elapsed="0.000065"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:00.357315" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:00.357221" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:00.357178" elapsed="0.000295"/>
</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-04-17T03:13:00.357996" elapsed="0.000068"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:13:00.358160" 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-04-17T03:12:59.735655" elapsed="0.622624">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:00.358359" 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-04-17T03:12:59.633492" elapsed="0.724997">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:00.358796" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:00.358609" elapsed="0.000263"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:00.358591" elapsed="0.000306"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:00.358936" elapsed="0.000029"/>
</return>
<arg>${BGP_VAR_FOLDER}/ipv6_topology_empty</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-04-17T03:12:59.625203" elapsed="0.733851">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:02.424226" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:02.423559" elapsed="0.000717"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:02.425486" 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-04-17T03:13:02.425109" elapsed="0.000488">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-04-17T03:13:02.425744" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:02.424567" elapsed="0.001214"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:02.426770" 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-04-17T03:13:02.426102" elapsed="0.000711"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:13:02.427310" 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-04-17T03:13:02.427549" 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-04-17T03:13:02.427089" elapsed="0.000498"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:02.428259" 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-04-17T03:13:02.427824" elapsed="0.000506"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:02.429781" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:02.429452" elapsed="0.000377"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:13:02.430312" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:13:02.430024" elapsed="0.000315"/>
</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-04-17T03:13:02.430688" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:02.430919" 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-04-17T03:13:02.431121" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:13:02.430549" elapsed="0.000632"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:13:02.430397" elapsed="0.000815"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:13:02.431264" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:13:02.431452" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:13:02.429067" elapsed="0.002412"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:02.428448" elapsed="0.003066"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:02.431732" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:02.431543" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:02.428412" elapsed="0.003408"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:13:02.432509" 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-04-17T03:13:02.431994" elapsed="0.000544"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:13:02.432588" elapsed="0.000057"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:13:02.422392" elapsed="0.010358"/>
</kw>
<msg time="2026-04-17T03:13:02.432890" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:13:02.408427" elapsed="0.024541"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:13:02.446759" elapsed="0.000072"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:13:02.461309" elapsed="0.000072"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:13:02.475006" elapsed="0.000043"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:02.475273" 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-04-17T03:13:02.475460" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:02.475876" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:02.475725" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:02.475708" 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-04-17T03:13:02.476124" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:02.476297" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:02.476462" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:13:02.475670" elapsed="0.000846"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:13:02.475541" elapsed="0.001001"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:02.476688" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:02.476768" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:13:02.476921" 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-04-17T03:13:02.403489" elapsed="0.073477"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:02.478401" 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-04-17T03:13:02.478108" elapsed="0.000367">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-04-17T03:13:02.478570" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:02.477699" elapsed="0.000897"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:02.479073" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:02.478737" elapsed="0.000413"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:13:02.479660" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:02.479358" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:02.479176" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:02.478719" elapsed="0.001036"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:02.482447" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:13:02.479976" elapsed="0.002498"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:13:02.482529" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:13:02.482692" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:13:02.477324" elapsed="0.005393"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:02.484056" 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-04-17T03:13:02.483776" elapsed="0.000357">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-04-17T03:13:02.484248" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:02.483427" elapsed="0.000856"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:13:02.484558" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-17T03:13:02.484380" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:02.484357" elapsed="0.000301"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:02.484809" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:02.485002" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:13:02.485071" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:13:02.487622" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:13:02.483059" elapsed="0.004592"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:02.489374" 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-04-17T03:13:02.489095" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:02.489885" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:02.489632" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:13:02.495403" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:02.698124" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:03.101413" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:03.103530" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:13:02.492237" elapsed="0.614342">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:13:02.490020" elapsed="0.616700">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:03.107102" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:03.106783" elapsed="0.000499"/>
</branch>
<status status="FAIL" start="2026-04-17T03:13:02.489999" elapsed="0.617318">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:03.108009" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:03.108203" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:03.108149" elapsed="0.000113"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:03.108122" elapsed="0.000168"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:03.108490" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:13:03.108585" 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-04-17T03:13:02.488010" elapsed="0.620727">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:03.108843" 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-04-17T03:13:02.377205" elapsed="0.731800">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:03.109379" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:03.109133" elapsed="0.000340"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:03.109109" elapsed="0.000396"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:03.109546" elapsed="0.000019"/>
</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="FAIL" start="2026-04-17T03:13:02.368981" elapsed="0.740696">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:05.172278" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:05.171791" elapsed="0.000522"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:05.173163" 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-04-17T03:13:05.172875" elapsed="0.000368">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-04-17T03:13:05.173341" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:05.172516" elapsed="0.000851"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:05.173971" 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-04-17T03:13:05.173543" elapsed="0.000458"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:13:05.174313" 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-04-17T03:13:05.174573" 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-04-17T03:13:05.174166" elapsed="0.000435"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:05.175108" 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-04-17T03:13:05.174820" elapsed="0.000337"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:05.176355" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:05.176024" elapsed="0.000378"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:13:05.176878" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:13:05.176588" elapsed="0.000317"/>
</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-04-17T03:13:05.177281" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:05.177499" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:05.177690" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:13:05.177139" elapsed="0.000611"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:13:05.176991" elapsed="0.000789"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:13:05.177829" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:13:05.178030" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:13:05.175621" elapsed="0.002435"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:05.175244" elapsed="0.002844"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:05.178266" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:05.178115" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:05.175215" elapsed="0.003129"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:13:05.179052" 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-04-17T03:13:05.178490" elapsed="0.000590"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:13:05.179129" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:13:05.170937" elapsed="0.008324"/>
</kw>
<msg time="2026-04-17T03:13:05.179320" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:13:05.157347" elapsed="0.022030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:13:05.193535" elapsed="0.000085"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:13:05.208637" elapsed="0.000071"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:13:05.222685" elapsed="0.000065"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:05.223112" 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-04-17T03:13:05.223372" 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-04-17T03:13:05.223837" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:05.223676" elapsed="0.000232"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:05.223658" elapsed="0.000296"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:05.224137" 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-04-17T03:13:05.224312" 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-04-17T03:13:05.224479" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:13:05.223615" elapsed="0.000920"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:13:05.223466" elapsed="0.001098"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:05.224714" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:05.224796" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:13:05.224985" 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-04-17T03:13:05.152784" elapsed="0.072232"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:05.226620" 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-04-17T03:13:05.226283" elapsed="0.000418">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-04-17T03:13:05.226800" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:05.225796" elapsed="0.001029"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:05.227192" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:05.226900" elapsed="0.000353"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:13:05.228062" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:05.227701" elapsed="0.000390"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:05.227278" elapsed="0.000849"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:05.226880" elapsed="0.001270"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:05.230677" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:13:05.228314" elapsed="0.002391"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:13:05.230761" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:13:05.230952" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:13:05.225414" elapsed="0.005565"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:05.232353" 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-04-17T03:13:05.232074" elapsed="0.000352">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-04-17T03:13:05.232522" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:05.231711" elapsed="0.000835"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:13:05.232764" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:13:05.232621" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:05.232602" elapsed="0.000248"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:05.233096" elapsed="0.000024"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:05.233273" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:13:05.233340" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:13:05.235555" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:13:05.231321" elapsed="0.004261"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:05.237334" 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-04-17T03:13:05.236903" elapsed="0.000485"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:05.237795" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:05.237545" 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-04-17T03:13:05.242982" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:05.445881" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:05.849842" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:05.852024" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:13:05.240149" elapsed="0.615252">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:13:05.237913" elapsed="0.617634">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:05.855897" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:05.855606" elapsed="0.000413"/>
</branch>
<status status="FAIL" start="2026-04-17T03:13:05.237892" elapsed="0.618161">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:05.856697" elapsed="0.000044"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:05.856929" elapsed="0.000050"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:05.856870" elapsed="0.000153"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:05.856841" elapsed="0.000213"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:05.857262" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:13:05.857363" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:13:05.235922" elapsed="0.621603">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:05.857638" elapsed="0.000030"/>
</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-04-17T03:13:05.129269" elapsed="0.728566">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:05.858519" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:05.858193" elapsed="0.000448"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:05.858095" elapsed="0.000583"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:05.858729" elapsed="0.000023"/>
</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="FAIL" start="2026-04-17T03:13:05.120479" elapsed="0.738411">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:07.920385" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:07.919976" elapsed="0.000444"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:07.921216" 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-04-17T03:13:07.920950" elapsed="0.000347">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-04-17T03:13:07.921393" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:07.920597" elapsed="0.000822"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:07.922044" 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-04-17T03:13:07.921637" elapsed="0.000434"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:13:07.922383" 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-04-17T03:13:07.922546" 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-04-17T03:13:07.922233" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:07.922997" 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-04-17T03:13:07.922729" 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-04-17T03:13:07.924082" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:07.923752" elapsed="0.000375"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:13:07.924557" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:13:07.924286" elapsed="0.000297"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:07.924908" elapsed="0.000048"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:07.925145" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:07.925329" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:13:07.924775" elapsed="0.000613"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:13:07.924635" elapsed="0.000789"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:13:07.925504" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:13:07.925685" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:13:07.923427" elapsed="0.002284"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:07.923120" elapsed="0.002628"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:07.925924" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:07.925775" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:07.923097" elapsed="0.002985"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:13:07.926712" 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-04-17T03:13:07.926235" elapsed="0.000507"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:13:07.926793" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:13:07.919331" elapsed="0.007592"/>
</kw>
<msg time="2026-04-17T03:13:07.926999" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:13:07.905980" elapsed="0.021071"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:13:07.940048" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:07.952920" elapsed="0.000045"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:13:07.965856" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:07.966082" 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-04-17T03:13:07.966266" 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-04-17T03:13:07.966711" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:07.966557" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:07.966540" 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-04-17T03:13:07.966979" 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-04-17T03:13:07.967193" 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-04-17T03:13:07.967384" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:13:07.966505" elapsed="0.000935"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:13:07.966378" elapsed="0.001089"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:07.967614" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:07.967693" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:13:07.967829" 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-04-17T03:13:07.901442" elapsed="0.066415"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:07.969306" 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-04-17T03:13:07.969027" elapsed="0.000356">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-04-17T03:13:07.969479" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:07.968616" elapsed="0.000888"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:07.969833" elapsed="0.000078"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:07.969575" elapsed="0.000393"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:13:07.970487" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:07.970175" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:07.969995" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:07.969557" elapsed="0.001015"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:07.972985" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:13:07.970725" elapsed="0.002288"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:13:07.973065" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:13:07.973226" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:13:07.968271" elapsed="0.004980"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:07.974492" 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-04-17T03:13:07.974250" elapsed="0.000306">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-04-17T03:13:07.974651" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:07.973898" elapsed="0.000778"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:13:07.974880" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:13:07.974746" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:07.974728" elapsed="0.000260"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:07.975134" 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-04-17T03:13:07.975304" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:13:07.975370" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:13:07.977492" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:13:07.973557" elapsed="0.003963"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:07.979003" 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-04-17T03:13:07.978727" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:07.979454" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:07.979204" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:13:07.984672" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:08.186458" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:08.589734" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:08.593668" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:13:07.981699" elapsed="0.617782">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:13:07.979568" elapsed="0.620247">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:08.600212" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:08.599879" elapsed="0.000433"/>
</branch>
<status status="FAIL" start="2026-04-17T03:13:07.979550" elapsed="0.620797">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:08.601008" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:08.601232" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:08.601176" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:08.601148" 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-04-17T03:13:08.601532" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:13:08.601633" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:13:07.977835" elapsed="0.623959">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:08.601902" 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-04-17T03:13:07.876194" elapsed="0.725888">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:08.602480" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:08.602221" elapsed="0.000380"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:08.602197" elapsed="0.000446"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:08.602692" elapsed="0.000022"/>
</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="FAIL" start="2026-04-17T03:13:07.868051" elapsed="0.734826">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:10.669522" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:10.668881" elapsed="0.000688"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:10.670678" 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-04-17T03:13:10.670326" elapsed="0.000457">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-04-17T03:13:10.670911" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:10.669812" elapsed="0.001227"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:10.671615" 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-04-17T03:13:10.671214" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:13:10.671972" 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-04-17T03:13:10.672135" 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-04-17T03:13:10.671807" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:10.672765" 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-04-17T03:13:10.672349" elapsed="0.000471"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:10.674315" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:10.673828" elapsed="0.000552"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:13:10.674848" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:13:10.674563" elapsed="0.000311"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:10.675248" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:10.675464" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:10.675641" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:13:10.675112" elapsed="0.000588"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:13:10.674959" elapsed="0.000773"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:13:10.675780" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:13:10.675980" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:13:10.673425" elapsed="0.002583"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:10.672915" elapsed="0.003126"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:10.676216" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:10.676067" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:10.672882" elapsed="0.003411"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:13:10.677018" 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-04-17T03:13:10.676439" elapsed="0.000608"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:13:10.677097" 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/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-04-17T03:13:10.667767" elapsed="0.009470"/>
</kw>
<msg time="2026-04-17T03:13:10.677295" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:13:10.651396" elapsed="0.025955"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:13:10.690441" 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/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-04-17T03:13:10.704910" elapsed="0.000076"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:13:10.718217" elapsed="0.000062"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:10.718530" 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-04-17T03:13:10.718718" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:10.719174" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:10.719022" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:10.719004" 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-04-17T03:13:10.719397" 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-04-17T03:13:10.719560" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:10.719721" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:13:10.718962" elapsed="0.000811"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:13:10.718802" elapsed="0.000998"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:10.719961" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:10.720044" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:13:10.720209" 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-04-17T03:13:10.645465" elapsed="0.074772"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:10.721778" 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-04-17T03:13:10.721482" elapsed="0.000373">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-04-17T03:13:10.721979" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:10.721064" elapsed="0.000946"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:10.722379" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:10.722087" elapsed="0.000363"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:13:10.723044" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:10.722676" elapsed="0.000399"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:10.722483" elapsed="0.000629"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:10.722067" elapsed="0.001066"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:10.725748" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:13:10.723287" elapsed="0.002489"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:13:10.725833" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:13:10.726024" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:13:10.720616" elapsed="0.005433"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:10.727541" 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-04-17T03:13:10.727094" elapsed="0.000517">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-04-17T03:13:10.727802" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:10.726730" elapsed="0.001116"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:13:10.728121" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:13:10.727972" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:10.727922" elapsed="0.000288"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:10.728360" 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-04-17T03:13:10.728542" elapsed="0.000042"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:13:10.728650" elapsed="0.000023"/>
</return>
<msg time="2026-04-17T03:13:10.731493" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:13:10.726386" elapsed="0.005147"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:10.733664" 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-04-17T03:13:10.733280" elapsed="0.000453"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:10.734311" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:10.733964" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:13:10.741096" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:10.942680" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:11.345151" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:11.347371" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:13:10.737507" elapsed="0.615780">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:13:10.734474" elapsed="0.619076">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:11.353850" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:11.353606" elapsed="0.000316"/>
</branch>
<status status="FAIL" start="2026-04-17T03:13:10.734444" elapsed="0.619520">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:11.354437" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:11.354583" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:11.354541" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:11.354521" elapsed="0.000130"/>
</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-04-17T03:13:11.354795" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:13:11.354867" 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-04-17T03:13:10.732030" elapsed="0.622970">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:11.355137" 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-04-17T03:13:10.620622" elapsed="0.734616">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:11.355517" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:11.355332" elapsed="0.000259"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:11.355315" elapsed="0.000299"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:11.355647" elapsed="0.000015"/>
</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="FAIL" start="2026-04-17T03:13:10.613691" elapsed="0.742057">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:13:11.355857" level="FAIL">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 5 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-17T03:12:59.617531" elapsed="11.738442">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 5 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verifies that example-ipv6-topology is empty</doc>
<status status="FAIL" start="2026-04-17T03:12:59.617136" elapsed="11.738954">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 5 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verifies that example-ipv6-topology is empty after deconfiguring peer for the second time.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:12:59.550593" elapsed="11.805665">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 5 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:13:11.377851" elapsed="0.000290"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:13:11.377402" elapsed="0.000804"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:13:11.379296" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:11.379163" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:11.379140" 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-04-17T03:13:11.390259" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:11.390122" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:11.390102" elapsed="0.000227"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:11.391383" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:13:11.390970" elapsed="0.000442"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:13:11.391967" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:13:11.391574" elapsed="0.000429"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:13:11.392059" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:13:11.392262" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:13:11.390568" elapsed="0.001721"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:13:11.398198" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:11.398089" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:11.398069" 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-04-17T03:13:11.399497" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:11.399390" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:11.399372" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:13:11.400040" level="INFO">${karaf_connection_index} = 24</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:13:11.399710" elapsed="0.000358"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:13:11.400450" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:13:11.400228" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:13:11.401328" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:13:11.401054" elapsed="0.001127">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:13:11.402375" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:13:11.402425" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:11.400633" elapsed="0.001816"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:13:11.403231" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:13:11.402984" elapsed="0.000896">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:13:11.404093" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:13:11.404139" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:11.402618" elapsed="0.001544"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:13:11.405165" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Reconfigure_ODL_To_Accept_Connections_3"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:13:11.404458" elapsed="0.000770">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Reconfigure_ODL_To_Accept_Connections_3"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:13:11.404238" elapsed="0.001061">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Reconfigure_ODL_To_Accept_Connections_3"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:13:11.404219" elapsed="0.001114">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Reconfigure_ODL_To_Accept_Connections_3"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:11.405498" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:11.405741" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:11.405585" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:11.405568" elapsed="0.000249"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:13:11.405849" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:13:11.408334" elapsed="0.000142"/>
</kw>
<msg time="2026-04-17T03:13:11.408541" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:13:11.407315" 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-04-17T03:13:11.414028" elapsed="0.000087"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:11.414408" 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-04-17T03:13:11.406678" elapsed="0.007925"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:13:11.406144" elapsed="0.008527"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:13:11.399084" elapsed="0.015706">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Reconfigure_ODL_To_Accept_Connections_3"</status>
</kw>
<msg time="2026-04-17T03:13:11.414911" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:13:11.414978" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Reconfigure_ODL_To_Accept_Connections_3"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:11.398440" elapsed="0.016605"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:13:11.415240" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:11.415128" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:11.415109" elapsed="0.000197"/>
</if>
<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-04-17T03:13:11.416141" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:11.416035" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:11.416017" elapsed="0.000190"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:13:11.416491" level="INFO">index=15
host=10.30.170.120
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-04-17T03:13:11.416596" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
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-04-17T03:13:11.416361" elapsed="0.000262"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:11.417124" level="INFO">{1: 24}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:11.416774" elapsed="0.000394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:11.417570" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:11.417321" elapsed="0.000293"/>
</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-04-17T03:13:11.418233" elapsed="0.000271"/>
</kw>
<msg time="2026-04-17T03:13:11.418604" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:13:11.418650" level="INFO">${old_connection_index} = 24</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:11.417771" elapsed="0.000900"/>
</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-04-17T03:13:11.419522" elapsed="0.000196"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:13:11.420790" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:13:11.420382" elapsed="0.001535">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:11.419885" elapsed="0.002159"/>
</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-04-17T03:13:11.422722" elapsed="0.000297"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:11.422251" elapsed="0.000853"/>
</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-04-17T03:13:11.418989" elapsed="0.004163"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:11.418748" elapsed="0.004452"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:11.418729" elapsed="0.004497"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:13:11.424086" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:13:11.423756" elapsed="0.000356"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:13:11.424161" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:13:11.424316" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:13:11.423430" elapsed="0.000911"/>
</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-04-17T03:13:11.424497" elapsed="0.000494"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:13:11.425311" level="INFO">index=25
host=10.30.170.120
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-04-17T03:13:11.425413" level="INFO">${karaf_connection_object} = index=25
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:13:11.425199" elapsed="0.000241"/>
</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-04-17T03:13:11.425590" elapsed="0.002403"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:13:11.428423" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:13:11.429710" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:13:11.428159" elapsed="0.002051">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:13:11.492758" elapsed="0.000508"/>
</kw>
<msg time="2026-04-17T03:13:11.493389" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:13:11.491137" elapsed="0.002584"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:11.494648" elapsed="0.000032"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:11.494849" elapsed="0.000023"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:13:11.431069" elapsed="0.064200"/>
</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-04-17T03:13:11.430534" elapsed="0.064797"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:13:11.415717" elapsed="0.079731">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:11.495909" elapsed="0.000050"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:13:11.496018" 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="FAIL" start="2026-04-17T03:13:11.397717" elapsed="0.098434">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:13:11.496286" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:13:11.496335" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:11.392784" elapsed="0.103577"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:11.496789" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:11.496465" elapsed="0.000383"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:11.496440" elapsed="0.000434"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:13:11.392597" elapsed="0.104304"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:13:11.392413" elapsed="0.104941"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:13:11.384432" elapsed="0.112995"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:13:11.378837" elapsed="0.118658"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:11.378362" elapsed="0.119186"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:13:11.373104" elapsed="0.124505"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:13:11.498758" 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-04-17T03:13:11.497876" elapsed="0.000915"/>
</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-04-17T03:13:11.537944" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:11.537485" elapsed="0.000501"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:11.538834" 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-04-17T03:13:11.538552" elapsed="0.000366">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-04-17T03:13:11.539040" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:11.538182" elapsed="0.000885"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:11.539764" 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-04-17T03:13:11.539342" elapsed="0.000452"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:13:11.540153" 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-04-17T03:13:11.540324" 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-04-17T03:13:11.539995" elapsed="0.000359"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:11.540803" 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-04-17T03:13:11.540531" elapsed="0.000322"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:11.541999" 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-04-17T03:13:11.541699" elapsed="0.000351"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:13:11.542534" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:13:11.542228" elapsed="0.000333"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:13:11.543316" 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-04-17T03:13:11.542994" elapsed="0.000350"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:13:11.544167" 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-04-17T03:13:11.543905" elapsed="0.000290"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:13:11.544252" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:13:11.544426" 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-04-17T03:13:11.543553" 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-04-17T03:13:11.544622" elapsed="0.000260"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">2607:f0d0:1002:11::2</var>
<status status="PASS" start="2026-04-17T03:13:11.542825" elapsed="0.002116"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:13:11.545575" 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-04-17T03:13:11.545214" elapsed="0.000389"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:13:11.546600" 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-04-17T03:13:11.546370" elapsed="0.000259"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:13:11.546690" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:13:11.546848" 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-04-17T03:13:11.545809" elapsed="0.001064"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:13:11.547042" elapsed="0.000225"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:13:11.545069" elapsed="0.002239"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:13:11.547850" 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-04-17T03:13:11.547550" elapsed="0.000325"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:13:11.548629" 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-04-17T03:13:11.548415" elapsed="0.000239"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:13:11.548703" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:13:11.548853" 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-04-17T03:13:11.548077" elapsed="0.000800"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:13:11.549044" elapsed="0.000225"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:13:11.547420" elapsed="0.001890"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:13:11.549908" 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-04-17T03:13:11.549605" elapsed="0.000344"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:13:11.550672" 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-04-17T03:13:11.550460" elapsed="0.000282"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:13:11.550794" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:13:11.550966" 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-04-17T03:13:11.550136" 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-04-17T03:13:11.551142" elapsed="0.000223"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:13:11.549421" elapsed="0.001984"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:13:11.551973" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:13:11.551650" elapsed="0.000349"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:13:11.552724" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:13:11.552509" elapsed="0.000240"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:13:11.552800" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:13:11.552970" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:13:11.552188" elapsed="0.000809"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:13:11.553147" elapsed="0.000224"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:13:11.551520" elapsed="0.001894"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:13:11.554022" 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-04-17T03:13:11.553701" elapsed="0.000346"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:13:11.554775" 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-04-17T03:13:11.554554" elapsed="0.000247"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:13:11.554851" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:13:11.555028" 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-04-17T03:13:11.554233" elapsed="0.000820"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:13:11.555203" elapsed="0.000226"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:13:11.553565" elapsed="0.001905"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:13:11.556032" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:13:11.555711" elapsed="0.000347"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:13:11.556818" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:13:11.556598" elapsed="0.000246"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:13:11.556894" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:13:11.557066" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:13:11.556243" elapsed="0.000848"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:13:11.557241" elapsed="0.000523"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:13:11.555582" elapsed="0.002227"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:13:11.558385" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:13:11.558078" elapsed="0.000333"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:13:11.559147" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:13:11.558911" elapsed="0.000262"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:13:11.559224" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:13:11.559374" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:13:11.558596" elapsed="0.000803"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:13:11.559548" elapsed="0.000222"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:13:11.557925" elapsed="0.001885"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:13:11.542621" elapsed="0.017224"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:13:11.559888" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:13:11.560072" 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-04-17T03:13:11.541309" elapsed="0.018827"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:11.540954" elapsed="0.019218"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:11.560351" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:11.560200" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:11.540912" elapsed="0.019520"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:13:11.561310" 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-04-17T03:13:11.560578" elapsed="0.000761"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:13:11.561390" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:13:11.536719" elapsed="0.024800"/>
</kw>
<msg time="2026-04-17T03:13:11.561619" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:13:11.523216" elapsed="0.038460"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:13:11.575501" elapsed="0.000045"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:11.590648" 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/${file_name} exists. 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-04-17T03:13:11.603687" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:11.603904" 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-04-17T03:13:11.604106" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:11.604513" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:11.604365" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:11.604347" 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-04-17T03:13:11.604737" 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-04-17T03:13:11.604904" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:11.605087" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:13:11.604301" elapsed="0.000841"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:13:11.604187" elapsed="0.000982"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:11.605313" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:11.605391" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:13:11.605620" 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-04-17T03:13:11.518454" elapsed="0.087195"/>
</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-04-17T03:13:11.635671" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:11.635235" elapsed="0.000470"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:11.636602" 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-04-17T03:13:11.636291" elapsed="0.000393">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-04-17T03:13:11.636788" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:11.635893" elapsed="0.000922"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:11.637441" 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-04-17T03:13:11.637021" elapsed="0.000449"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:13:11.637805" 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-04-17T03:13:11.638242" 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-04-17T03:13:11.637650" elapsed="0.000625"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:11.638731" 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-04-17T03:13:11.638461" 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-04-17T03:13:11.639276" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:11.638876" elapsed="0.000465"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:13:11.639859" level="INFO">${mapping_to_use} = {'IP': '2607:f0d0:1002:11::2', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANC...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:11.639536" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:11.639370" elapsed="0.000575"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:11.638851" elapsed="0.001120"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:13:11.641001" 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-04-17T03:13:11.640138" elapsed="0.000897"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:13:11.641091" 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/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-04-17T03:13:11.634514" elapsed="0.006727"/>
</kw>
<msg time="2026-04-17T03:13:11.641366" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:13:11.619133" elapsed="0.022289"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:13:11.654262" 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/bgp_peer.vanadium/${file_name} exists. 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-04-17T03:13:11.667512" 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/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-04-17T03:13:11.680360" elapsed="0.000032"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:11.680660" 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-04-17T03:13:11.680850" elapsed="0.000019"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:11.681281" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:11.681133" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:11.681116" 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-04-17T03:13:11.681506" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:11.681673" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:11.681847" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:13:11.681077" elapsed="0.000825"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:13:11.680956" elapsed="0.000990"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:11.682099" elapsed="0.000024"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:11.682217" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:13:11.682388" 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-04-17T03:13:11.616131" elapsed="0.066292"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:11.683861" 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-04-17T03:13:11.683542" elapsed="0.000417">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-04-17T03:13:11.684057" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:11.683142" elapsed="0.000939"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:11.684492" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:11.684224" elapsed="0.000324"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:13:11.685069" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:11.684754" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:11.684573" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:11.684205" elapsed="0.000946"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:11.687836" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:13:11.685299" elapsed="0.002564"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:13:11.687916" elapsed="0.000050"/>
</return>
<msg time="2026-04-17T03:13:11.688100" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:13:11.682765" elapsed="0.005360"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:11.689540" 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-04-17T03:13:11.689283" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:11.689997" 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-04-17T03:13:11.689737" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:11.690482" 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-04-17T03:13:11.690232" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:11.690914" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:11.690673" elapsed="0.000301"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:13:11.691778" 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-04-17T03:13:11.691577" elapsed="0.000227"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:13:11.692147" 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-04-17T03:13:11.691971" elapsed="0.000202"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:13:11.692321" elapsed="0.000215"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:11.692996" 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-04-17T03:13:11.692720" elapsed="0.000320"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:13:11.693083" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:13:11.693239" 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-04-17T03:13:11.691175" 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-04-17T03:13:11.698659" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:13:11.900513" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:13:12.303292" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:13:12.305771" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:13:11.695481" elapsed="0.613621">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:13:11.693333" elapsed="0.615933">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:12.309692" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:12.309342" elapsed="0.000451"/>
</branch>
<status status="FAIL" start="2026-04-17T03:13:11.693316" elapsed="0.616511">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:12.310471" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:12.310667" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:12.310611" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:12.310585" 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-04-17T03:13:12.310986" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:13:12.311083" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:13:11.688464" elapsed="0.622778">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:12.311353" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:13:11.505210" elapsed="0.806279">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:12.312018" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:12.311643" elapsed="0.000503"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:12.311620" elapsed="0.000562"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:12.312231" elapsed="0.000020"/>
</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="FAIL" start="2026-04-17T03:13:11.499155" elapsed="0.813221">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Configure BGP peer modules with initiate-connection set to false with full text ipv6 address.</doc>
<status status="FAIL" start="2026-04-17T03:13:11.372341" elapsed="0.940361">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:13:12.317359" elapsed="0.000293"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:13:12.317085" elapsed="0.000626"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:13:12.318784" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:12.318653" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:12.318633" elapsed="0.000220"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:13:12.324007" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:12.323883" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:12.323865" elapsed="0.000210"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:12.325101" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:13:12.324682" elapsed="0.000448"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:13:12.325766" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:13:12.325290" elapsed="0.000503"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:13:12.325839" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:13:12.326020" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:13:12.324303" elapsed="0.001742"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:13:12.331687" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:12.331577" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:12.331558" 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-04-17T03:13:12.332967" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:12.332832" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:12.332815" elapsed="0.000222"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:13:12.333515" level="INFO">${karaf_connection_index} = 25</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:13:12.333182" elapsed="0.000365"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:13:12.333997" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:13:12.333743" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:13:12.334963" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:13:12.334518" elapsed="0.001133">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:13:12.335846" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:13:12.335893" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:12.334183" elapsed="0.001733"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:13:12.336694" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:13:12.336449" elapsed="0.000951">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:13:12.337648" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:13:12.337704" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:12.336105" elapsed="0.001627"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:13:12.338678" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Filled_3"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:13:12.338061" elapsed="0.000680">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Filled_3"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:13:12.337816" elapsed="0.000995">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Filled_3"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:13:12.337795" elapsed="0.001109">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Filled_3"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:12.339089" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:12.339317" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:12.339176" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:12.339160" elapsed="0.000233"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:13:12.339427" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:13:12.342010" elapsed="0.000152"/>
</kw>
<msg time="2026-04-17T03:13:12.342230" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:13:12.340909" elapsed="0.001455"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:12.342639" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:12.343129" 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-04-17T03:13:12.340280" 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-04-17T03:13:12.339715" elapsed="0.003691"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:13:12.332530" elapsed="0.010962">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Filled_3"</status>
</kw>
<msg time="2026-04-17T03:13:12.343599" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:13:12.343643" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Filled_3"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:12.331906" elapsed="0.011760"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:13:12.343852" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:12.343743" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:12.343725" elapsed="0.000193"/>
</if>
<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-04-17T03:13:12.344760" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:12.344655" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:12.344637" elapsed="0.000188"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:13:12.345134" level="INFO">index=15
host=10.30.170.120
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-04-17T03:13:12.345239" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
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-04-17T03:13:12.345002" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:12.345759" level="INFO">{1: 25}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:12.345418" elapsed="0.000389"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:12.346247" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:12.345995" elapsed="0.000296"/>
</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-04-17T03:13:12.346821" elapsed="0.000290"/>
</kw>
<msg time="2026-04-17T03:13:12.347212" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:13:12.347258" level="INFO">${old_connection_index} = 25</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:12.346448" elapsed="0.000832"/>
</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-04-17T03:13:12.348100" elapsed="0.000195"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:13:12.349835" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:13:12.349320" elapsed="0.001669">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:12.348602" elapsed="0.002490"/>
</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-04-17T03:13:12.351741" elapsed="0.000354"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:12.351265" elapsed="0.000919"/>
</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-04-17T03:13:12.347573" elapsed="0.004711"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:12.347354" elapsed="0.004981"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:12.347337" elapsed="0.005023"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:13:12.353284" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:13:12.352906" elapsed="0.000407"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:13:12.353362" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:13:12.353519" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:13:12.352577" 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-04-17T03:13:12.353782" elapsed="0.000460"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:13:12.354520" level="INFO">index=26
host=10.30.170.120
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-04-17T03:13:12.354620" level="INFO">${karaf_connection_object} = index=26
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:13:12.354411" elapsed="0.000235"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:13:12.354794" elapsed="0.002295"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:13:12.357513" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:13:12.358773" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:13:12.357251" elapsed="0.001932">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:13:12.375021" elapsed="0.000399"/>
</kw>
<msg time="2026-04-17T03:13:12.375516" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:13:12.373148" 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-04-17T03:13:12.375841" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:12.376025" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:13:12.360017" elapsed="0.016092"/>
</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-04-17T03:13:12.359479" elapsed="0.016676"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:13:12.344358" elapsed="0.031886">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:12.376611" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:13:12.376686" 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="FAIL" start="2026-04-17T03:13:12.331238" elapsed="0.045558">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:13:12.376907" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:13:12.377165" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:12.326432" elapsed="0.050759"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:12.377607" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:12.377276" elapsed="0.000426"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:12.377255" elapsed="0.000480"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:13:12.326288" elapsed="0.051476"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:13:12.326105" elapsed="0.051700"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:13:12.323381" elapsed="0.054502"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:13:12.318343" elapsed="0.059712"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:12.317868" elapsed="0.060253"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:13:12.314464" elapsed="0.063730"/>
</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-04-17T03:13:12.434262" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:12.433714" elapsed="0.000584"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:12.435134" 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-04-17T03:13:12.434828" elapsed="0.000401">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-04-17T03:13:12.435329" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:12.434480" elapsed="0.000874"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:12.435923" 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-04-17T03:13:12.435530" elapsed="0.000439"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:13:12.436281" 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-04-17T03:13:12.436457" 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-04-17T03:13:12.436132" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:12.436891" 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-04-17T03:13:12.436641" 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-04-17T03:13:12.438238" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:12.437836" elapsed="0.000449"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:13:12.438790" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:13:12.438446" elapsed="0.000374"/>
</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-04-17T03:13:12.439191" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:12.439401" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:12.439576" elapsed="0.000027"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:13:12.439056" elapsed="0.000591"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:13:12.438875" elapsed="0.000806"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:13:12.439731" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:13:12.439905" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:13:12.437466" elapsed="0.002484"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:12.437039" elapsed="0.002946"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:12.440157" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:12.440012" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:12.437013" elapsed="0.003219"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:13:12.440836" 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-04-17T03:13:12.440373" elapsed="0.000490"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:13:12.440912" 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/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-04-17T03:13:12.432929" elapsed="0.008131"/>
</kw>
<msg time="2026-04-17T03:13:12.441184" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:13:12.418845" elapsed="0.022415"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:13:12.459930" elapsed="0.000073"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:13:12.475006" 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/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-04-17T03:13:12.488715" elapsed="0.000048"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:12.489010" 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-04-17T03:13:12.489200" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:12.489631" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:12.489478" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:12.489460" 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-04-17T03:13:12.489860" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:12.490045" 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-04-17T03:13:12.490482" elapsed="0.000056"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:13:12.489420" elapsed="0.001162"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:13:12.489283" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:12.490785" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:12.490868" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:13:12.491094" 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-04-17T03:13:12.414046" elapsed="0.077079"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:12.492741" 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-04-17T03:13:12.492422" elapsed="0.000400">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-04-17T03:13:12.492920" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:12.491903" elapsed="0.001059"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:12.493394" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:12.493121" elapsed="0.000334"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:13:12.493985" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:12.493663" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:12.493482" elapsed="0.000566"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:12.493101" elapsed="0.000968"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:12.496530" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:13:12.494241" elapsed="0.002316"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:13:12.496611" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:13:12.496774" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:13:12.491518" elapsed="0.005281"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:12.498085" 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-04-17T03:13:12.497814" elapsed="0.000337">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-04-17T03:13:12.498356" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:12.497467" elapsed="0.000922"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:13:12.498609" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-17T03:13:12.498469" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:12.498449" elapsed="0.000245"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:12.498843" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:12.499035" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:13:12.499103" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:13:12.501281" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:13:12.497134" elapsed="0.004173"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:12.502843" 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-04-17T03:13:12.502572" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:12.503313" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:12.503062" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:13:12.508441" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:12.710307" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:13.113622" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:13.116126" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:13:12.505579" elapsed="0.614049">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:13:12.503425" elapsed="0.616376">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:13.120235" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:13.119874" elapsed="0.000563"/>
</branch>
<status status="FAIL" start="2026-04-17T03:13:12.503407" elapsed="0.617068">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:13.121181" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:13.121445" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:13.121366" elapsed="0.000149"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:13.121323" elapsed="0.000223"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:13.121757" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:13:13.121858" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:13:12.501631" elapsed="0.620423">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:13.122195" elapsed="0.000044"/>
</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-04-17T03:13:12.390299" elapsed="0.732096">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:13.122803" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:13.122537" elapsed="0.000371"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:13.122511" elapsed="0.000459"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:13.123020" elapsed="0.000022"/>
</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-04-17T03:13:12.383877" elapsed="0.739289">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:15.185048" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:15.184600" elapsed="0.000487"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:15.186084" 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-04-17T03:13:15.185757" elapsed="0.000414">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-04-17T03:13:15.186290" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:15.185319" elapsed="0.001002"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:15.186978" 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-04-17T03:13:15.186524" elapsed="0.000484"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:13:15.187326" 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-04-17T03:13:15.187583" 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-04-17T03:13:15.187175" elapsed="0.000435"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:15.188092" 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-04-17T03:13:15.187771" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:15.189381" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:15.188966" elapsed="0.000462"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:13:15.189874" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:13:15.189593" elapsed="0.000307"/>
</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-04-17T03:13:15.190338" elapsed="0.000034"/>
</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-04-17T03:13:15.190573" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:15.190751" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:13:15.190141" elapsed="0.000669"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:13:15.189985" elapsed="0.000857"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:13:15.190891" elapsed="0.000059"/>
</return>
<msg time="2026-04-17T03:13:15.191093" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:13:15.188563" elapsed="0.002556"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:15.188227" elapsed="0.002925"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:15.191326" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:15.191178" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:15.188201" elapsed="0.003204"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:13:15.192025" 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-04-17T03:13:15.191549" elapsed="0.000505"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:13:15.192103" 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-04-17T03:13:15.183945" elapsed="0.008285"/>
</kw>
<msg time="2026-04-17T03:13:15.192286" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:13:15.170287" elapsed="0.022048"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:13:15.206104" 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-04-17T03:13:15.219120" elapsed="0.000033"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:15.232412" elapsed="0.000032"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:15.232744" 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-04-17T03:13:15.232948" 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-04-17T03:13:15.233440" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:15.233221" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:15.233203" 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-04-17T03:13:15.233702" 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-04-17T03:13:15.233883" 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-04-17T03:13:15.234159" elapsed="0.000031"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:13:15.233165" elapsed="0.001070"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:13:15.233032" elapsed="0.001238"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:15.234465" elapsed="0.000028"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:15.234574" elapsed="0.000023"/>
</return>
<msg time="2026-04-17T03:13:15.234764" 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-04-17T03:13:15.165720" elapsed="0.069080"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:15.236299" 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-04-17T03:13:15.235993" elapsed="0.000387">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-04-17T03:13:15.236492" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:15.235539" 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-04-17T03:13:15.236916" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:15.236615" elapsed="0.000379"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:13:15.237534" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:15.237203" elapsed="0.000360"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:15.237019" elapsed="0.000580"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:15.236593" elapsed="0.001027"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:15.240090" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:13:15.237773" elapsed="0.002344"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:13:15.240169" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:13:15.240329" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:13:15.235183" elapsed="0.005171"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:15.241687" 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-04-17T03:13:15.241410" elapsed="0.000342">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-04-17T03:13:15.241847" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:15.241007" elapsed="0.000865"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:13:15.242106" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:13:15.241958" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:15.241924" elapsed="0.000296"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:15.242411" elapsed="0.000024"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:15.242585" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:13:15.242650" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:13:15.244825" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:13:15.240663" elapsed="0.004189"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:15.246363" 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-04-17T03:13:15.246079" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:15.246805" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:15.246560" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:13:15.251838" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:15.453428" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:15.856168" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:15.858514" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:13:15.249047" elapsed="0.613003">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:13:15.246914" elapsed="0.615289">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:15.862615" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:15.862276" elapsed="0.000448"/>
</branch>
<status status="FAIL" start="2026-04-17T03:13:15.246896" elapsed="0.615866">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:15.863543" elapsed="0.000043"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:15.863772" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:15.863705" elapsed="0.000140"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:15.863673" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:15.864130" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:13:15.864236" elapsed="0.000024"/>
</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-04-17T03:13:15.245189" elapsed="0.619225">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:15.864535" elapsed="0.000026"/>
</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-04-17T03:13:15.141262" elapsed="0.723432">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:15.865235" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:15.864921" elapsed="0.000431"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:15.864893" elapsed="0.000499"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:15.865450" 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="FAIL" start="2026-04-17T03:13:15.133905" elapsed="0.731714">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:17.924243" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:17.923604" elapsed="0.000675"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:17.925100" 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-04-17T03:13:17.924805" elapsed="0.000375">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-04-17T03:13:17.925313" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:17.924459" elapsed="0.000891"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:17.925971" 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-04-17T03:13:17.925557" elapsed="0.000442"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:13:17.926305" 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-04-17T03:13:17.926493" 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-04-17T03:13:17.926161" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:17.926955" 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-04-17T03:13:17.926685" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:17.928241" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:17.927769" elapsed="0.000517"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:13:17.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-04-17T03:13:17.928446" elapsed="0.000301"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:17.929113" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:17.929373" elapsed="0.000026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:17.929551" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:13:17.928976" elapsed="0.000631"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:13:17.928802" elapsed="0.000848"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:13:17.929722" elapsed="0.000048"/>
</return>
<msg time="2026-04-17T03:13:17.929989" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:13:17.927438" elapsed="0.002590"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:17.927089" elapsed="0.002984"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:17.930310" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:17.930107" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:17.927063" elapsed="0.003442"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:13:17.931456" 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-04-17T03:13:17.930721" elapsed="0.000774"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:13:17.931564" 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/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-04-17T03:13:17.922837" elapsed="0.008908"/>
</kw>
<msg time="2026-04-17T03:13:17.931822" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:13:17.909128" elapsed="0.022763"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:13:17.946847" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:17.959603" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_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-04-17T03:13:17.972914" elapsed="0.000080"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:17.973245" 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-04-17T03:13:17.973496" 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-04-17T03:13:17.973968" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:17.973793" elapsed="0.000233"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:17.973776" 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-04-17T03:13:17.974195" 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-04-17T03:13:17.974378" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:17.974540" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:13:17.973736" elapsed="0.000864"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:13:17.973591" elapsed="0.001043"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:17.974784" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:17.974865" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:13:17.975043" 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-04-17T03:13:17.904231" elapsed="0.070842"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:17.976681" 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-04-17T03:13:17.976364" elapsed="0.000401">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-04-17T03:13:17.976864" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:17.975907" 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-04-17T03:13:17.977250" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:17.976977" elapsed="0.000331"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:13:17.978024" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:17.977549" elapsed="0.000515"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:17.977334" elapsed="0.000783"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:17.976958" elapsed="0.001191"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:17.981816" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:13:17.978391" elapsed="0.003453"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:13:17.981899" elapsed="0.000052"/>
</return>
<msg time="2026-04-17T03:13:17.982086" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:13:17.975526" elapsed="0.006585"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:17.983437" 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-04-17T03:13:17.983162" elapsed="0.000350">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-04-17T03:13:17.983614" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:17.982792" elapsed="0.000861"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:13:17.983902" elapsed="0.000048"/>
</return>
<status status="PASS" start="2026-04-17T03:13:17.983736" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:17.983715" elapsed="0.000296"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:17.984160" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:17.984363" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:13:17.984428" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:13:17.986755" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:13:17.982439" elapsed="0.004347"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:17.988444" 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-04-17T03:13:17.988121" elapsed="0.000376"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:17.988892" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:17.988648" 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-04-17T03:13:17.994449" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:18.213109" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:18.616130" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:18.618633" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:13:17.991319" elapsed="0.632765">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:13:17.989032" elapsed="0.635364">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:18.625129" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:18.624484" elapsed="0.000795"/>
</branch>
<status status="FAIL" start="2026-04-17T03:13:17.989009" elapsed="0.636323">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:18.626238" elapsed="0.000056"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:18.626537" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:18.626453" elapsed="0.000179"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:18.626414" elapsed="0.000264"/>
</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-04-17T03:13:18.627076" elapsed="0.000050"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:13:18.627234" elapsed="0.000032"/>
</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-04-17T03:13:17.987201" elapsed="0.640271">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:18.627626" 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-04-17T03:13:17.879810" elapsed="0.747914">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:18.628017" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:18.627819" elapsed="0.000271"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:18.627802" elapsed="0.000312"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:18.628146" 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-04-17T03:13:17.872741" elapsed="0.755505">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:20.687962" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:20.687420" elapsed="0.000581"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:20.688949" 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-04-17T03:13:20.688621" elapsed="0.000408">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-04-17T03:13:20.689129" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:20.688224" elapsed="0.001012"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:20.689840" 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-04-17T03:13:20.689410" elapsed="0.000459"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:13:20.690217" 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-04-17T03:13:20.690382" 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-04-17T03:13:20.690054" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:20.690874" 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-04-17T03:13:20.690607" 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-04-17T03:13:20.692168" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:20.691798" elapsed="0.000419"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:13:20.692729" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:13:20.692382" elapsed="0.000375"/>
</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-04-17T03:13:20.693164" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:20.693399" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:20.693576" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:13:20.693018" elapsed="0.000616"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:13:20.692814" elapsed="0.000851"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:13:20.693712" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:13:20.693889" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:13:20.691441" elapsed="0.002474"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:20.691024" elapsed="0.002943"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:20.694143" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:20.693993" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:20.690998" elapsed="0.003223"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:13:20.694848" 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-04-17T03:13:20.694363" elapsed="0.000515"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:13:20.694958" 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/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-04-17T03:13:20.686522" elapsed="0.008588"/>
</kw>
<msg time="2026-04-17T03:13:20.695175" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:13:20.672877" elapsed="0.022369"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:13:20.708699" elapsed="0.000063"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:13:20.723575" elapsed="0.000097"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:13:20.742342" elapsed="0.000080"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:20.742760" 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-04-17T03:13:20.743045" 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-04-17T03:13:20.743761" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:20.743440" elapsed="0.000402"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:20.743415" elapsed="0.000463"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:20.744105" elapsed="0.000030"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:20.744342" 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-04-17T03:13:20.744569" elapsed="0.000027"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:13:20.743359" elapsed="0.001278"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:13:20.743168" elapsed="0.001506"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:20.744876" elapsed="0.000030"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:20.745007" elapsed="0.000027"/>
</return>
<msg time="2026-04-17T03:13:20.745252" 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-04-17T03:13:20.668151" elapsed="0.077140"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:20.747350" 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-04-17T03:13:20.746923" elapsed="0.000527">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-04-17T03:13:20.747618" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:20.746346" elapsed="0.001309"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:20.748150" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:20.747762" elapsed="0.000468"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:13:20.748945" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:20.748525" elapsed="0.000460"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:20.748268" elapsed="0.000768"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:20.747734" elapsed="0.001333"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:20.752507" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:13:20.749297" elapsed="0.003245"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:13:20.752615" elapsed="0.000047"/>
</return>
<msg time="2026-04-17T03:13:20.752827" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:13:20.745813" elapsed="0.007045"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:20.754652" 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-04-17T03:13:20.754302" elapsed="0.000453">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-04-17T03:13:20.755001" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:20.753802" elapsed="0.001236"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:13:20.755340" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-04-17T03:13:20.755142" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:20.755114" elapsed="0.000353"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:20.755707" 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-04-17T03:13:20.755970" elapsed="0.000031"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:13:20.756065" elapsed="0.000022"/>
</return>
<msg time="2026-04-17T03:13:20.759069" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:13:20.753318" elapsed="0.005788"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:20.761258" 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-04-17T03:13:20.760829" elapsed="0.000496"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:20.761857" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:20.761525" 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-04-17T03:13:20.768868" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:20.970448" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:21.373070" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:21.375460" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:13:20.765124" elapsed="0.614776">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:13:20.762030" elapsed="0.618052">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:21.380452" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:21.380147" elapsed="0.000413"/>
</branch>
<status status="FAIL" start="2026-04-17T03:13:20.761999" elapsed="0.618596">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:21.381534" elapsed="0.000043"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:21.381815" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:21.381733" elapsed="0.000163"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:21.381689" elapsed="0.000237"/>
</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-04-17T03:13:21.382224" elapsed="0.000048"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:13:21.382357" elapsed="0.000024"/>
</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-04-17T03:13:20.759629" elapsed="0.622899">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:21.382776" 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-04-17T03:13:20.644298" elapsed="0.738654">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:21.383425" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:21.383100" elapsed="0.000467"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:21.383076" elapsed="0.000535"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:21.383660" elapsed="0.000023"/>
</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-04-17T03:13:20.637254" elapsed="0.746557">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:23.443295" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_filled.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:23.442804" elapsed="0.000537"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:23.444285" 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-04-17T03:13:23.443954" elapsed="0.000444">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-04-17T03:13:23.444507" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:23.443558" elapsed="0.000976"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:23.445217" 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-04-17T03:13:23.444703" elapsed="0.000553"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:13:23.445610" 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-04-17T03:13:23.445780" 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-04-17T03:13:23.445455" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:23.446242" 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-04-17T03:13:23.445983" 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-04-17T03:13:23.447630" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:23.447304" elapsed="0.000395"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:13:23.448366" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:13:23.447909" 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-04-17T03:13:23.448856" elapsed="0.000030"/>
</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-04-17T03:13:23.449118" elapsed="0.000026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:23.449296" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:13:23.448664" elapsed="0.000691"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:13:23.448472" elapsed="0.000987"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:13:23.449513" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:13:23.449699" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:13:23.446880" elapsed="0.002851"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:23.446401" elapsed="0.003374"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:23.450062" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:23.449813" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:23.446370" elapsed="0.003798"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:13:23.451032" 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-04-17T03:13:23.450369" elapsed="0.000703"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:13:23.451138" 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_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-04-17T03:13:23.442070" elapsed="0.009249"/>
</kw>
<msg time="2026-04-17T03:13:23.451398" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:13:23.428294" elapsed="0.023177"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:13:23.469594" 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/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-04-17T03:13:23.485685" 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/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-04-17T03:13:23.499000" elapsed="0.000035"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:23.499242" 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-04-17T03:13:23.499427" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:23.499836" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:23.499685" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:23.499668" 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-04-17T03:13:23.500078" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:23.500331" 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-04-17T03:13:23.500511" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:13:23.499631" elapsed="0.000935"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:13:23.499510" elapsed="0.001084"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:23.500742" elapsed="0.000122"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:23.500942" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:13:23.501106" 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-04-17T03:13:23.423732" elapsed="0.077401"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:23.502647" 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-04-17T03:13:23.502352" elapsed="0.000390">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-04-17T03:13:23.502842" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:23.501940" elapsed="0.000936"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:23.503236" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:23.502971" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:13:23.503817" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:23.503493" elapsed="0.000352"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:23.503317" elapsed="0.000565"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:23.502952" elapsed="0.000951"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:23.507177" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:13:23.504073" elapsed="0.003141"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:13:23.507286" elapsed="0.000045"/>
</return>
<msg time="2026-04-17T03:13:23.507507" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:13:23.501521" elapsed="0.006020"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:23.509371" 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-04-17T03:13:23.509032" elapsed="0.000430">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-04-17T03:13:23.509596" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:23.508502" elapsed="0.001130"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:13:23.509943" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-04-17T03:13:23.509730" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:23.509705" elapsed="0.000364"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:23.510271" 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-04-17T03:13:23.510505" elapsed="0.000029"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:13:23.510597" elapsed="0.000021"/>
</return>
<msg time="2026-04-17T03:13:23.513710" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:13:23.507986" elapsed="0.005751"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:23.515469" 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-04-17T03:13:23.515146" elapsed="0.000371"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:23.516011" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:23.515698" elapsed="0.000360"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:13:23.521746" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:23.723409" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:24.126021" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:24.128370" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:13:23.518444" elapsed="0.615827">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:13:23.516125" elapsed="0.618378">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:24.135088" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:24.134599" elapsed="0.000656"/>
</branch>
<status status="FAIL" start="2026-04-17T03:13:23.516106" elapsed="0.619207">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:24.136421" elapsed="0.000070"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:24.136772" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:24.136674" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:24.136628" elapsed="0.000342"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:24.137441" elapsed="0.000057"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:13:24.137653" elapsed="0.000040"/>
</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-04-17T03:13:23.514235" elapsed="0.623641">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:24.137969" 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-04-17T03:13:23.399775" elapsed="0.738299">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:24.138361" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:24.138172" elapsed="0.000264"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:24.138153" elapsed="0.000307"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:24.138496" 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-04-17T03:13:23.393041" elapsed="0.745565">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:13:24.138724" level="FAIL">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 5 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-17T03:13:12.378676" elapsed="11.760210">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 5 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verifies that example-ipv6-topology is filled with ipv6 route</doc>
<status status="FAIL" start="2026-04-17T03:13:12.378378" elapsed="11.760649">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 5 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verifies that example-ipv6-topology is filled after configuring the peer for the third time.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:13:12.313055" elapsed="11.826151">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 5 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:13:24.143868" elapsed="0.000351"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:13:24.143518" elapsed="0.000775"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:13:24.145618" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:24.145485" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:24.145463" 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-04-17T03:13:24.151120" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:24.150999" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:24.150979" elapsed="0.000217"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:24.152378" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:13:24.151904" elapsed="0.000505"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:13:24.152985" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:13:24.152621" elapsed="0.000393"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:13:24.153062" elapsed="0.000080"/>
</return>
<msg time="2026-04-17T03:13:24.153288" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:13:24.151481" elapsed="0.001837"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:13:24.159283" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:24.159167" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:24.159146" elapsed="0.000208"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:13:24.160631" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:24.160521" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:24.160503" elapsed="0.000199"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:13:24.161242" level="INFO">${karaf_connection_index} = 26</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:13:24.160852" elapsed="0.000418"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:13:24.161697" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:13:24.161435" elapsed="0.000296"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:13:24.162736" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:13:24.162317" elapsed="0.001170">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:13:24.163684" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:13:24.163741" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:24.161968" elapsed="0.001803"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:13:24.164627" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:13:24.164371" elapsed="0.001005">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:13:24.165631" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:13:24.165681" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:24.163970" elapsed="0.001734"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:13:24.166688" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Bgp_Peer_Configuration_3"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:13:24.166043" elapsed="0.000711">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Bgp_Peer_Configuration_3"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:13:24.165783" elapsed="0.001043">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Bgp_Peer_Configuration_3"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:13:24.165763" elapsed="0.001098">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Bgp_Peer_Configuration_3"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:24.167044" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:24.167307" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:24.167135" elapsed="0.000242"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:24.167118" elapsed="0.000288"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:13:24.167441" elapsed="0.000019"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:13:24.170712" elapsed="0.000160"/>
</kw>
<msg time="2026-04-17T03:13:24.170979" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:13:24.169312" elapsed="0.001840"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:24.171491" elapsed="0.000082"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:24.171951" 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-04-17T03:13:24.168457" elapsed="0.003709"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:13:24.167738" elapsed="0.004531"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:13:24.160200" elapsed="0.012163">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Bgp_Peer_Configuration_3"</status>
</kw>
<msg time="2026-04-17T03:13:24.172476" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:13:24.172524" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Bgp_Peer_Configuration_3"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:24.159514" elapsed="0.013034"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:13:24.172745" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:24.172630" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:24.172610" elapsed="0.000204"/>
</if>
<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-04-17T03:13:24.173765" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:24.173644" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:24.173626" elapsed="0.000223"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:13:24.174236" level="INFO">index=15
host=10.30.170.120
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-04-17T03:13:24.174371" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
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-04-17T03:13:24.174094" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:24.174965" level="INFO">{1: 26}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:24.174610" elapsed="0.000409"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:24.175514" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:24.175201" elapsed="0.000368"/>
</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-04-17T03:13:24.176191" elapsed="0.000283"/>
</kw>
<msg time="2026-04-17T03:13:24.176579" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:13:24.176628" level="INFO">${old_connection_index} = 26</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:24.175760" elapsed="0.000891"/>
</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-04-17T03:13:24.177644" elapsed="0.000222"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:13:24.179180" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:13:24.178563" elapsed="0.001533">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:24.178075" elapsed="0.002129"/>
</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-04-17T03:13:24.180912" elapsed="0.000438"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:24.180411" elapsed="0.001046"/>
</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-04-17T03:13:24.177074" elapsed="0.004445"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:24.176728" elapsed="0.004855"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:24.176708" elapsed="0.004907"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:13:24.182553" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:13:24.182233" elapsed="0.000349"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:13:24.182633" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:13:24.182797" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:13:24.181872" elapsed="0.000955"/>
</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-04-17T03:13:24.183006" elapsed="0.000467"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:13:24.183778" level="INFO">index=27
host=10.30.170.120
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-04-17T03:13:24.183885" level="INFO">${karaf_connection_object} = index=27
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:13:24.183656" elapsed="0.000256"/>
</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-04-17T03:13:24.184109" elapsed="0.002474"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:13:24.187120" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:13:24.188454" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:13:24.186785" elapsed="0.002122">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:13:24.205740" elapsed="0.000638"/>
</kw>
<msg time="2026-04-17T03:13:24.206495" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:13:24.203475" elapsed="0.003213"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:24.206917" elapsed="0.000051"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:24.207157" elapsed="0.000028"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:13:24.190041" elapsed="0.017243"/>
</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-04-17T03:13:24.189412" elapsed="0.017939"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:13:24.173322" elapsed="0.034133">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:24.207885" elapsed="0.000030"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:13:24.207989" 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="FAIL" start="2026-04-17T03:13:24.158787" elapsed="0.049329">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:13:24.208265" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:13:24.208324" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:24.153805" elapsed="0.054650"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:24.208851" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:24.208554" elapsed="0.000354"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:24.208530" elapsed="0.000712"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:13:24.153613" elapsed="0.055664"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:13:24.153386" elapsed="0.055930"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:13:24.150574" elapsed="0.058812"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:13:24.145122" elapsed="0.064327"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:24.144483" elapsed="0.065016"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:13:24.140215" elapsed="0.069342"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:13:24.210666" 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-04-17T03:13:24.209798" elapsed="0.000905"/>
</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-04-17T03:13:24.260833" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:24.260363" elapsed="0.000507"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:24.261823" 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-04-17T03:13:24.261501" elapsed="0.000421">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-04-17T03:13:24.262050" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:24.261071" elapsed="0.001007"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:24.262689" 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-04-17T03:13:24.262263" elapsed="0.000456"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:13:24.263070" 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-04-17T03:13:24.263247" 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-04-17T03:13:24.262898" elapsed="0.000378"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:24.263737" 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-04-17T03:13:24.263466" elapsed="0.000321"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:24.264979" 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-04-17T03:13:24.264668" elapsed="0.000362"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:13:24.265536" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:13:24.265208" elapsed="0.000356"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:13:24.266322" 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-04-17T03:13:24.265995" elapsed="0.000355"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:13:24.267181" 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-04-17T03:13:24.266914" elapsed="0.000369"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:13:24.267343" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:13:24.267526" 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-04-17T03:13:24.266557" elapsed="0.000996"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:13:24.267725" elapsed="0.000281"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">2607:f0d0:1002:11::2</var>
<status status="PASS" start="2026-04-17T03:13:24.265825" elapsed="0.002226"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:13:24.268642" 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-04-17T03:13:24.268322" elapsed="0.000347"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:13:24.269494" 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-04-17T03:13:24.269241" elapsed="0.000280"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:13:24.269574" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:13:24.269976" 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-04-17T03:13:24.268878" elapsed="0.001126"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:13:24.270175" elapsed="0.000243"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:13:24.268176" elapsed="0.002286"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:13:24.271070" 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-04-17T03:13:24.270729" elapsed="0.000368"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:13:24.271907" 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-04-17T03:13:24.271652" elapsed="0.000306"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:13:24.272012" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:13:24.272175" 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-04-17T03:13:24.271302" 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-04-17T03:13:24.272367" elapsed="0.000238"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:13:24.270584" elapsed="0.002064"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:13:24.273249" 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-04-17T03:13:24.272916" elapsed="0.000389"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:13:24.274100" 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-04-17T03:13:24.273856" elapsed="0.000271"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:13:24.274180" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:13:24.274341" 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-04-17T03:13:24.273511" 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-04-17T03:13:24.274531" elapsed="0.000239"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:13:24.272767" elapsed="0.002046"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:13:24.275417" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:13:24.275098" elapsed="0.000346"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:13:24.276230" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:13:24.276000" elapsed="0.000257"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:13:24.276310" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:13:24.276472" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:13:24.275645" 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-04-17T03:13:24.276664" elapsed="0.000238"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:13:24.274952" elapsed="0.002007"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:13:24.277570" 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-04-17T03:13:24.277223" elapsed="0.000374"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:13:24.278401" 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-04-17T03:13:24.278172" elapsed="0.000257"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:13:24.278528" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:13:24.278694" 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-04-17T03:13:24.277803" 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-04-17T03:13:24.278887" elapsed="0.000260"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:13:24.277079" elapsed="0.002113"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:13:24.279785" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:13:24.279460" elapsed="0.000353"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:13:24.280648" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:13:24.280416" elapsed="0.000260"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:13:24.280732" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:13:24.280899" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:13:24.280048" 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-04-17T03:13:24.281146" elapsed="0.000280"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:13:24.279314" elapsed="0.002156"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:13:24.282323" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:13:24.281738" elapsed="0.000612"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:13:24.283143" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:13:24.282900" elapsed="0.000270"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:13:24.283222" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:13:24.283382" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:13:24.282553" 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-04-17T03:13:24.283571" elapsed="0.000237"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:13:24.281593" elapsed="0.002259"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:13:24.265622" elapsed="0.018268"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:13:24.283954" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:13:24.284132" 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-04-17T03:13:24.264292" elapsed="0.019869"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:24.263876" elapsed="0.020320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:24.284399" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:24.284228" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:24.263848" elapsed="0.020632"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:13:24.285483" 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-04-17T03:13:24.284639" elapsed="0.000875"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:13:24.285565" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:13:24.259522" elapsed="0.026179"/>
</kw>
<msg time="2026-04-17T03:13:24.285762" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:13:24.246033" elapsed="0.039788"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:13:24.299767" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:24.313429" elapsed="0.000039"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. 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-04-17T03:13:24.326141" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:24.326345" 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-04-17T03:13:24.326521" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:24.326905" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:24.326759" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:24.326743" 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-04-17T03:13:24.327142" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:24.327308" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:24.327471" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:13:24.326710" elapsed="0.000812"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:13:24.326602" elapsed="0.000946"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:24.327691" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:24.327764" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:13:24.327900" 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-04-17T03:13:24.240554" elapsed="0.087388"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:24.329092" 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-04-17T03:13:24.328807" elapsed="0.000333"/>
</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-04-17T03:13:24.334501" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:13:24.536308" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:13:24.939136" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:13:24.941845" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:24.331337" elapsed="0.617021">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:13:24.329206" elapsed="0.619379">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:24.949236" elapsed="0.000078"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:24.948681" elapsed="0.000768"/>
</branch>
<status status="FAIL" start="2026-04-17T03:13:24.329189" elapsed="0.620328">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:13:24.951131" elapsed="0.000031"/>
</kw>
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:24.951216" elapsed="0.000021"/>
</return>
<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-04-17T03:13:24.328210" elapsed="0.623126">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:24.951403" elapsed="0.000016"/>
</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="FAIL" start="2026-04-17T03:13:24.210990" elapsed="0.740511">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="FAIL" start="2026-04-17T03:13:24.139446" elapsed="0.812263">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:13:24.955579" elapsed="0.000269"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:13:24.955284" elapsed="0.000623"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:13:24.957009" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:24.956865" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:24.956841" elapsed="0.000272"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:13:24.963483" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:24.963375" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:24.963357" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:24.964588" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:13:24.964176" elapsed="0.000441"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:13:24.965101" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:13:24.964778" elapsed="0.000349"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:13:24.965227" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:13:24.965413" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:13:24.963779" elapsed="0.001679"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:13:24.971543" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:24.971432" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:24.971413" 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-04-17T03:13:24.972811" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:24.972704" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:24.972687" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:13:24.973375" level="INFO">${karaf_connection_index} = 27</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:13:24.973051" elapsed="0.000351"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:13:24.973788" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:13:24.973564" elapsed="0.000250"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:13:24.974639" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:13:24.974366" elapsed="0.000948">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:13:24.975508" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:13:24.975555" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:24.973992" elapsed="0.001587"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:13:24.976366" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:13:24.976104" elapsed="0.000955">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:13:24.977285" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:13:24.977344" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:24.975745" elapsed="0.001628"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:13:24.978595" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Empty_3"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:13:24.977717" elapsed="0.000959">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Empty_3"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:13:24.977460" elapsed="0.001305">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Empty_3"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:13:24.977438" elapsed="0.001369">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Empty_3"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:24.979042" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:24.979343" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:24.979155" elapsed="0.000259"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:24.979133" elapsed="0.000313"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:13:24.979489" elapsed="0.000021"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:13:24.982326" elapsed="0.000152"/>
</kw>
<msg time="2026-04-17T03:13:24.982548" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:13:24.981127" 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-04-17T03:13:24.982977" elapsed="0.000080"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:24.983335" 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-04-17T03:13:24.980476" 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-04-17T03:13:24.979856" elapsed="0.003737"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:13:24.972399" elapsed="0.011326">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Empty_3"</status>
</kw>
<msg time="2026-04-17T03:13:24.983831" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:13:24.983874" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Empty_3"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:24.971765" elapsed="0.012132"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:13:24.984104" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:24.983991" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:24.983973" elapsed="0.000200"/>
</if>
<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-04-17T03:13:24.985184" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:24.985079" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:24.985061" elapsed="0.000191"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:13:24.985547" level="INFO">index=15
host=10.30.170.120
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-04-17T03:13:24.985653" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
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-04-17T03:13:24.985420" elapsed="0.000259"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:24.986181" level="INFO">{1: 27}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:24.985829" elapsed="0.000432"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:24.986676" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:24.986427" elapsed="0.000293"/>
</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-04-17T03:13:24.987255" elapsed="0.000275"/>
</kw>
<msg time="2026-04-17T03:13:24.987630" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:13:24.987676" level="INFO">${old_connection_index} = 27</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:24.986876" elapsed="0.000822"/>
</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-04-17T03:13:24.988530" elapsed="0.000198"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:13:24.990147" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:13:24.989629" elapsed="0.001460">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:24.988896" elapsed="0.002293"/>
</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-04-17T03:13:24.991866" elapsed="0.000324"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:24.991384" elapsed="0.000902"/>
</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-04-17T03:13:24.988008" elapsed="0.004348"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:24.987773" elapsed="0.004635"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:24.987755" elapsed="0.004678"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:13:24.993334" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:13:24.992994" elapsed="0.000368"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:13:24.993411" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:13:24.993569" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:13:24.992644" elapsed="0.000957"/>
</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-04-17T03:13:24.993772" elapsed="0.000450"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:13:24.994578" level="INFO">index=28
host=10.30.170.120
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-04-17T03:13:24.994679" level="INFO">${karaf_connection_object} = index=28
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:13:24.994462" elapsed="0.000242"/>
</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-04-17T03:13:24.994854" elapsed="0.002582"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:13:24.997951" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:13:24.999325" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:13:24.997666" elapsed="0.002093">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:13:25.015867" elapsed="0.001109"/>
</kw>
<msg time="2026-04-17T03:13:25.017116" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:13:25.013880" elapsed="0.003488"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:25.017659" elapsed="0.000041"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:25.017999" elapsed="0.000036"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:13:25.000727" elapsed="0.017402"/>
</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-04-17T03:13:25.000144" elapsed="0.018054"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:13:24.984755" elapsed="0.033622">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:25.018909" elapsed="0.000044"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:13:25.019007" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:13:24.971061" elapsed="0.048066">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:13:25.019245" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:13:25.019292" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:24.965893" elapsed="0.053423"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:25.019677" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:25.019400" elapsed="0.000345"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:25.019380" elapsed="0.000393"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:13:24.965745" elapsed="0.054054"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:13:24.965530" elapsed="0.054305"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:13:24.962992" elapsed="0.056905"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:13:24.956552" elapsed="0.063601"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:24.956083" elapsed="0.064130"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:13:24.952683" elapsed="0.067589"/>
</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-04-17T03:13:25.080312" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:25.079865" elapsed="0.000482"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:25.081153" 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-04-17T03:13:25.080869" elapsed="0.000381">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-04-17T03:13:25.081356" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:25.080525" elapsed="0.000857"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:25.082120" 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-04-17T03:13:25.081630" elapsed="0.000519"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:13:25.082539" 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-04-17T03:13:25.082702" 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-04-17T03:13:25.082340" elapsed="0.000387"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:25.083151" 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-04-17T03:13:25.082884" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:25.084395" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:25.084035" elapsed="0.000417"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:13:25.084896" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:13:25.084615" elapsed="0.000307"/>
</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-04-17T03:13:25.085323" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:25.085544" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:25.085744" elapsed="0.000023"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:13:25.085169" elapsed="0.000640"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:13:25.085007" elapsed="0.000843"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:13:25.085916" elapsed="0.000072"/>
</return>
<msg time="2026-04-17T03:13:25.086174" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:13:25.083642" elapsed="0.002568"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:25.083279" elapsed="0.002976"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:25.086518" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:25.086291" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:25.083254" elapsed="0.003349"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:13:25.087283" 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-04-17T03:13:25.086750" elapsed="0.000569"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:13:25.087378" 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_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-04-17T03:13:25.079112" elapsed="0.008411"/>
</kw>
<msg time="2026-04-17T03:13:25.087581" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:13:25.063814" elapsed="0.023824"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:13:25.101780" elapsed="0.000061"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:13:25.115108" elapsed="0.000067"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:13:25.129001" elapsed="0.000105"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:25.129727" elapsed="0.000070"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:25.130284" elapsed="0.000056"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:25.131177" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:25.131001" elapsed="0.000244"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:25.130974" elapsed="0.000305"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:25.131475" 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-04-17T03:13:25.131656" 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-04-17T03:13:25.131822" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:13:25.130900" elapsed="0.000978"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:13:25.130599" elapsed="0.001309"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:25.132088" elapsed="0.000031"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:25.132189" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:13:25.132412" 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-04-17T03:13:25.059152" elapsed="0.073291"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:25.134039" 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-04-17T03:13:25.133695" elapsed="0.000422">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-04-17T03:13:25.134219" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:25.133258" 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-04-17T03:13:25.134626" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:25.134326" elapsed="0.000363"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:13:25.135250" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:25.134910" elapsed="0.000367"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:25.134716" elapsed="0.000598"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:25.134306" elapsed="0.001030"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:25.138147" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:13:25.135490" elapsed="0.002689"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:13:25.138243" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:13:25.138467" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:13:25.132850" elapsed="0.005645"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:25.140109" 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-04-17T03:13:25.139681" elapsed="0.000506">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-04-17T03:13:25.140373" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:25.139283" elapsed="0.001115"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:13:25.140629" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:13:25.140476" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:25.140456" elapsed="0.000259"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:25.140865" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:25.141068" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:13:25.141135" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:13:25.143445" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:13:25.138887" elapsed="0.004597"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:25.145125" 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-04-17T03:13:25.144789" elapsed="0.000386"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:25.145635" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:25.145347" elapsed="0.000333"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:13:25.151300" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:25.352790" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:25.755060" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:25.757672" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:13:25.148263" elapsed="0.614816">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:13:25.145761" elapsed="0.617606">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:25.763859" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:25.763457" elapsed="0.000515"/>
</branch>
<status status="FAIL" start="2026-04-17T03:13:25.145737" elapsed="0.618270">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:25.764817" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:25.765251" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:25.765186" elapsed="0.000137"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:25.764972" elapsed="0.000383"/>
</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-04-17T03:13:25.765561" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:13:25.765661" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:13:25.143921" elapsed="0.621905">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:25.766044" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:13:25.032004" elapsed="0.734174">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:25.766549" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:25.766303" elapsed="0.000337"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:25.766282" elapsed="0.000388"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:25.766711" elapsed="0.000020"/>
</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="FAIL" start="2026-04-17T03:13:25.025306" elapsed="0.741540">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:27.831672" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:27.831225" elapsed="0.000481"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:27.832570" 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-04-17T03:13:27.832284" elapsed="0.000365">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-04-17T03:13:27.832746" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:27.831886" elapsed="0.000885"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:27.833379" 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-04-17T03:13:27.832961" elapsed="0.000446"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:13:27.833767" 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-04-17T03:13:27.833954" 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-04-17T03:13:27.833572" elapsed="0.000409"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:27.834406" 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-04-17T03:13:27.834140" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:27.835575" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:27.835250" elapsed="0.000372"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:13:27.836108" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:13:27.835794" elapsed="0.000342"/>
</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-04-17T03:13:27.836480" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:27.836695" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:27.836869" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:13:27.836343" elapsed="0.000602"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:13:27.836189" elapsed="0.000847"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:13:27.837090" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:13:27.837281" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:13:27.834887" elapsed="0.002421"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:27.834536" elapsed="0.002806"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:27.837519" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:27.837368" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:27.834510" elapsed="0.003106"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:13:27.838234" 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-04-17T03:13:27.837762" elapsed="0.000500"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:13:27.838311" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:13:27.830475" elapsed="0.007962"/>
</kw>
<msg time="2026-04-17T03:13:27.838493" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:13:27.816491" elapsed="0.022051"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:13:27.851664" 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/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-04-17T03:13:27.865188" 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/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-04-17T03:13:27.879203" elapsed="0.000066"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:27.879526" 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-04-17T03:13:27.879721" elapsed="0.000056"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:27.880344" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:27.880141" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:27.880121" 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-04-17T03:13:27.880601" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:27.880789" 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-04-17T03:13:27.880980" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:13:27.880069" elapsed="0.000968"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:13:27.879865" elapsed="0.001201"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:27.881242" elapsed="0.000028"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:27.881416" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:13:27.881598" 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-04-17T03:13:27.811716" elapsed="0.069911"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:27.883228" 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-04-17T03:13:27.882917" elapsed="0.000387">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-04-17T03:13:27.883401" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:27.882509" elapsed="0.000916"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:27.883812" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:27.883499" elapsed="0.000391"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:13:27.884445" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:27.884138" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:27.883917" elapsed="0.000591"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:27.883479" elapsed="0.001051"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:27.887046" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:13:27.884680" elapsed="0.002394"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:13:27.887134" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:13:27.887307" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:13:27.882137" elapsed="0.005196"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:27.888676" 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-04-17T03:13:27.888405" elapsed="0.000344">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-04-17T03:13:27.888846" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:27.888045" elapsed="0.000826"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:13:27.889110" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:13:27.888962" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:27.888941" 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-04-17T03:13:27.889358" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:27.889529" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:13:27.889595" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:13:27.892993" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:13:27.887676" elapsed="0.005366"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:27.895587" 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-04-17T03:13:27.895129" elapsed="0.000535"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:27.896287" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:27.895895" elapsed="0.000458"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:13:27.902233" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:28.103797" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:28.506651" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:28.509314" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:13:27.899297" elapsed="0.615781">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:13:27.896461" elapsed="0.618846">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:28.515851" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:28.515403" elapsed="0.000660"/>
</branch>
<status status="FAIL" start="2026-04-17T03:13:27.896430" elapsed="0.619700">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:28.517163" elapsed="0.000065"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:28.517488" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:28.517399" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:28.517355" elapsed="0.000282"/>
</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-04-17T03:13:28.517997" elapsed="0.000052"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:13:28.518420" elapsed="0.000040"/>
</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-04-17T03:13:27.893705" elapsed="0.624984">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:28.518863" elapsed="0.000037"/>
</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-04-17T03:13:27.783911" elapsed="0.735162">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:28.519376" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:28.519184" elapsed="0.000267"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:28.519165" elapsed="0.000311"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:28.519509" elapsed="0.000015"/>
</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="FAIL" start="2026-04-17T03:13:27.775760" elapsed="0.743852">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:30.589203" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:30.588727" elapsed="0.000512"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:30.590044" 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-04-17T03:13:30.589773" elapsed="0.000347">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-04-17T03:13:30.590217" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:30.589420" elapsed="0.000822"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:30.590799" 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-04-17T03:13:30.590407" elapsed="0.000419"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:13:30.591155" 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-04-17T03:13:30.591315" 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-04-17T03:13:30.591010" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:30.591891" 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-04-17T03:13:30.591572" 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-04-17T03:13:30.593149" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:30.592791" elapsed="0.000405"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:13:30.593653" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:13:30.593366" elapsed="0.000323"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:30.594144" elapsed="0.000033"/>
</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-04-17T03:13:30.594429" 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-04-17T03:13:30.594633" elapsed="0.000023"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:13:30.593950" elapsed="0.000744"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:13:30.593763" elapsed="0.000962"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:13:30.594773" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:13:30.594968" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:13:30.592452" elapsed="0.002543"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:30.592046" elapsed="0.002986"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:30.595204" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:30.595059" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:30.592019" elapsed="0.003260"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:13:30.595902" 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-04-17T03:13:30.595419" elapsed="0.000527"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:13:30.595997" elapsed="0.000033"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:13:30.587747" elapsed="0.008384"/>
</kw>
<msg time="2026-04-17T03:13:30.596198" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:13:30.573575" elapsed="0.022878"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:13:30.611940" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:13:30.627427" 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-04-17T03:13:30.640702" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:30.640950" 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-04-17T03:13:30.641138" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:30.641551" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:30.641401" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:30.641383" 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-04-17T03:13:30.641778" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:30.641959" 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-04-17T03:13:30.642133" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:13:30.641343" elapsed="0.000844"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:13:30.641222" elapsed="0.000994"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:30.642362" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:30.642444" elapsed="0.000023"/>
</return>
<msg time="2026-04-17T03:13:30.642625" 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-04-17T03:13:30.568169" elapsed="0.074486"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:30.644143" 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-04-17T03:13:30.643820" elapsed="0.000418">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-04-17T03:13:30.644339" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:30.643375" elapsed="0.000990"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:30.644703" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:30.644437" elapsed="0.000326"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:13:30.645295" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:30.644987" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:30.644787" elapsed="0.000624"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:30.644417" elapsed="0.001019"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:30.648438" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:13:30.645588" elapsed="0.002886"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:13:30.648546" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:13:30.648765" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:13:30.643014" elapsed="0.005787"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:30.650526" 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-04-17T03:13:30.650194" elapsed="0.000423">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-04-17T03:13:30.650743" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:30.649704" elapsed="0.001073"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:13:30.651079" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-17T03:13:30.650873" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:30.650848" elapsed="0.000347"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:30.651395" elapsed="0.000030"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:30.651633" elapsed="0.000054"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:13:30.651752" elapsed="0.000022"/>
</return>
<msg time="2026-04-17T03:13:30.654546" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:13:30.649249" elapsed="0.005332"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:30.656175" 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-04-17T03:13:30.655847" elapsed="0.000381"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:30.656683" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:30.656380" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:13:30.662673" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:30.864451" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:31.267057" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:31.269208" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:13:30.659471" elapsed="0.613089">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:13:30.656817" elapsed="0.615904">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:31.273129" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:31.272787" elapsed="0.000443"/>
</branch>
<status status="FAIL" start="2026-04-17T03:13:30.656799" elapsed="0.616657">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:31.274101" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:31.274405" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:31.274347" elapsed="0.000125"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:31.274317" elapsed="0.000187"/>
</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-04-17T03:13:31.274720" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:13:31.274821" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:13:30.654979" elapsed="0.620032">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:31.275121" 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-04-17T03:13:30.538135" elapsed="0.737134">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:31.275670" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:31.275408" elapsed="0.000365"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:31.275383" elapsed="0.000426"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:31.275858" elapsed="0.000022"/>
</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="FAIL" start="2026-04-17T03:13:30.527958" elapsed="0.748099">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:33.337258" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:33.336694" elapsed="0.000600"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:33.338221" 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-04-17T03:13:33.337866" elapsed="0.000441">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-04-17T03:13:33.338408" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:33.337473" elapsed="0.000959"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:33.339113" 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-04-17T03:13:33.338624" elapsed="0.000519"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:13:33.339463" 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-04-17T03:13:33.339686" 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-04-17T03:13:33.339307" elapsed="0.000417"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:33.340249" 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-04-17T03:13:33.339954" elapsed="0.000347"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:33.341592" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:33.341264" elapsed="0.000374"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:13:33.342120" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:13:33.341802" elapsed="0.000347"/>
</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-04-17T03:13:33.342583" elapsed="0.000027"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:33.342805" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:33.343017" elapsed="0.000031"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:13:33.342391" elapsed="0.000707"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:13:33.342204" elapsed="0.000937"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:13:33.343225" elapsed="0.000063"/>
</return>
<msg time="2026-04-17T03:13:33.343469" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:13:33.340868" elapsed="0.002637"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:33.340499" elapsed="0.003052"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:33.343739" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:33.343585" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:33.340463" elapsed="0.003360"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:13:33.344597" 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-04-17T03:13:33.344052" elapsed="0.000582"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:13:33.344687" elapsed="0.000033"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:13:33.335851" elapsed="0.008972"/>
</kw>
<msg time="2026-04-17T03:13:33.344884" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:13:33.321014" elapsed="0.023951"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:13:33.360424" 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/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-04-17T03:13:33.374695" elapsed="0.000043"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:13:33.388810" elapsed="0.000077"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:33.389253" 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-04-17T03:13:33.389459" 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-04-17T03:13:33.390222" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:33.390033" elapsed="0.000267"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:33.390012" elapsed="0.000337"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:33.390549" 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-04-17T03:13:33.390729" 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-04-17T03:13:33.390993" elapsed="0.000033"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:13:33.389950" elapsed="0.001123"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:13:33.389728" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:33.391258" elapsed="0.000038"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:33.391365" elapsed="0.000021"/>
</return>
<msg time="2026-04-17T03:13:33.391603" 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-04-17T03:13:33.316319" elapsed="0.075320"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:33.393444" 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-04-17T03:13:33.393028" elapsed="0.000497">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-04-17T03:13:33.393624" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:33.392527" elapsed="0.001125"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:33.394072" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:33.393753" elapsed="0.000382"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:13:33.394692" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:33.394371" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:33.394182" elapsed="0.000578"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:33.393726" elapsed="0.001055"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:33.397363" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:13:33.394949" elapsed="0.002441"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:13:33.397443" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:13:33.397605" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:13:33.392116" elapsed="0.005514"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:33.398921" 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-04-17T03:13:33.398680" elapsed="0.000324">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-04-17T03:13:33.399143" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:33.398338" elapsed="0.000832"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:13:33.399383" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-04-17T03:13:33.399245" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:33.399226" elapsed="0.000248"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:33.399618" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:33.399786" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:13:33.399900" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:13:33.402213" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:13:33.397971" elapsed="0.004271"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:33.403758" 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-04-17T03:13:33.403488" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:33.404222" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:33.403974" 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-04-17T03:13:33.409475" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:33.611116" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:34.013641" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:34.016028" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:13:33.406521" elapsed="0.615201">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:13:33.404354" elapsed="0.617627">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:34.022382" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:34.022077" elapsed="0.000403"/>
</branch>
<status status="FAIL" start="2026-04-17T03:13:33.404328" elapsed="0.618186">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:34.023128" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:34.023326" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:34.023270" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:34.023243" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:34.023619" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:13:34.023717" 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-04-17T03:13:33.402567" elapsed="0.621305">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:34.024000" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:13:33.292418" elapsed="0.731722">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:34.024528" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:34.024273" elapsed="0.000423"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:34.024249" elapsed="0.000482"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:34.024776" elapsed="0.000020"/>
</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="FAIL" start="2026-04-17T03:13:33.285135" elapsed="0.739783">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:36.099765" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:36.099312" elapsed="0.000487"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:36.100670" 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-04-17T03:13:36.100359" elapsed="0.000389">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-04-17T03:13:36.100849" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:36.099997" elapsed="0.000878"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:36.101463" 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-04-17T03:13:36.101061" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:13:36.101828" 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-04-17T03:13:36.102048" 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-04-17T03:13:36.101661" elapsed="0.000414"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:36.102620" 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-04-17T03:13:36.102239" elapsed="0.000451"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:36.103899" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:36.103573" elapsed="0.000400"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:13:36.104421" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:13:36.104141" elapsed="0.000307"/>
</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-04-17T03:13:36.104783" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:36.105021" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:36.105209" elapsed="0.000029"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:13:36.104648" elapsed="0.000635"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:13:36.104501" elapsed="0.000821"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:13:36.105388" elapsed="0.000052"/>
</return>
<msg time="2026-04-17T03:13:36.105637" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:13:36.103224" elapsed="0.002447"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:36.102804" elapsed="0.002907"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:36.105957" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:36.105745" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:36.102768" elapsed="0.003272"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:13:36.106714" 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-04-17T03:13:36.106191" elapsed="0.000552"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:13:36.106961" 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_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-04-17T03:13:36.098437" elapsed="0.008700"/>
</kw>
<msg time="2026-04-17T03:13:36.107213" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:13:36.084616" elapsed="0.022669"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:13:36.121688" elapsed="0.000067"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:13:36.134596" 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/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-04-17T03:13:36.147905" elapsed="0.000077"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:36.148234" 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-04-17T03:13:36.148420" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:36.148852" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:36.148700" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:36.148683" 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-04-17T03:13:36.149098" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:36.149291" 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-04-17T03:13:36.149465" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:13:36.148646" elapsed="0.000872"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:13:36.148504" elapsed="0.001040"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:36.149687" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:36.149766" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:13:36.149939" 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-04-17T03:13:36.079454" elapsed="0.070515"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:36.151567" 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-04-17T03:13:36.151260" elapsed="0.000390">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-04-17T03:13:36.151747" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:36.150829" elapsed="0.000943"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:36.152134" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:36.151843" elapsed="0.000349"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:13:36.152710" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:36.152409" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:36.152217" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:36.151825" elapsed="0.000968"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:36.155275" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:13:36.152958" elapsed="0.002346"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:13:36.155363" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:13:36.155536" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:13:36.150339" elapsed="0.005223"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:36.156906" 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-04-17T03:13:36.156630" elapsed="0.000369">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-04-17T03:13:36.157098" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:36.156277" elapsed="0.000846"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:13:36.157344" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:13:36.157197" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:36.157178" elapsed="0.000252"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:36.157577" 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-04-17T03:13:36.157746" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:13:36.157812" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:13:36.160065" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:13:36.155905" elapsed="0.004187"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:36.161566" 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-04-17T03:13:36.161296" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:36.162032" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:36.161769" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:13:36.167339" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:36.368688" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:36.771087" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:36.773460" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:13:36.164414" elapsed="0.614363">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:13:36.162145" elapsed="0.617028">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:36.779569" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:36.779270" elapsed="0.000376"/>
</branch>
<status status="FAIL" start="2026-04-17T03:13:36.162127" elapsed="0.617543">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:36.780182" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:36.780335" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:36.780292" elapsed="0.000105"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:36.780271" 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-04-17T03:13:36.780633" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:13:36.780734" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:13:36.160428" elapsed="0.620464">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:36.781020" 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-04-17T03:13:36.047273" elapsed="0.733887">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:36.781564" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:36.781319" elapsed="0.000323"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:36.781291" elapsed="0.000374"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:36.781698" elapsed="0.000015"/>
</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="FAIL" start="2026-04-17T03:13:36.037190" elapsed="0.744611">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:13:36.781915" level="FAIL">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 5 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-17T03:13:25.020714" elapsed="11.761329">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 5 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verifies that example-ipv6-topology is empty</doc>
<status status="FAIL" start="2026-04-17T03:13:25.020425" elapsed="11.761734">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 5 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verifies that example-ipv6-topology is empty after final deconfiguration.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:13:24.951966" elapsed="11.830469">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 5 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:13:36.786545" elapsed="0.000266"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:13:36.786259" 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-04-17T03:13:36.788009" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:36.787858" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:36.787836" 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-04-17T03:13:36.793168" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:36.793056" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:36.793037" elapsed="0.000205"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:36.794290" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:13:36.793860" elapsed="0.000458"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:13:36.794780" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:13:36.794479" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:13:36.794850" elapsed="0.000049"/>
</return>
<msg time="2026-04-17T03:13:36.795044" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:13:36.793480" elapsed="0.001589"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:13:36.800850" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:36.800732" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:36.800712" elapsed="0.000210"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:13:36.802154" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:36.802047" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:36.802029" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:13:36.802868" level="INFO">${karaf_connection_index} = 28</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:13:36.802367" elapsed="0.000543"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:13:36.803311" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:13:36.803088" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:13:36.804270" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:13:36.803826" elapsed="0.001296">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:13:36.805316" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:13:36.805363" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:36.803493" elapsed="0.001894"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:13:36.806161" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:13:36.805899" elapsed="0.000905">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:13:36.807048" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:13:36.807094" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:36.805558" elapsed="0.001560"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:13:36.808085" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Stop_All_Exabgps"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:13:36.807452" elapsed="0.000696">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Stop_All_Exabgps"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:13:36.807196" elapsed="0.001022">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Stop_All_Exabgps"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:13:36.807175" elapsed="0.001139">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Stop_All_Exabgps"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:36.808481" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:36.808710" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:36.808568" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:36.808552" elapsed="0.000234"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:13:36.808820" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:13:36.811727" elapsed="0.000153"/>
</kw>
<msg time="2026-04-17T03:13:36.811963" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:13:36.810511" elapsed="0.001589"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:36.812376" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:36.812713" 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-04-17T03:13:36.809867" elapsed="0.003033"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:13:36.809126" elapsed="0.003856"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:13:36.801715" elapsed="0.011354">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Stop_All_Exabgps"</status>
</kw>
<msg time="2026-04-17T03:13:36.813173" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:13:36.813218" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Stop_All_Exabgps"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:36.801098" elapsed="0.012144"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:13:36.813435" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:36.813326" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:36.813306" elapsed="0.000195"/>
</if>
<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-04-17T03:13:36.814336" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:36.814231" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:36.814213" elapsed="0.000189"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:13:36.814683" level="INFO">index=15
host=10.30.170.120
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-04-17T03:13:36.814787" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
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-04-17T03:13:36.814550" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:36.815380" level="INFO">{1: 28}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:36.815072" elapsed="0.000357"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:36.815821" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:36.815579" elapsed="0.000285"/>
</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-04-17T03:13:36.816420" elapsed="0.000267"/>
</kw>
<msg time="2026-04-17T03:13:36.816785" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:13:36.816830" level="INFO">${old_connection_index} = 28</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:36.816043" elapsed="0.000810"/>
</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-04-17T03:13:36.817697" elapsed="0.000196"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:13:36.819348" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:13:36.818554" elapsed="0.001725">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:36.818078" elapsed="0.002305"/>
</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-04-17T03:13:36.821042" elapsed="0.000286"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:36.820558" elapsed="0.000855"/>
</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-04-17T03:13:36.817183" elapsed="0.004277"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:36.816944" elapsed="0.004628"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:36.816909" elapsed="0.004694"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:13:36.822516" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:13:36.822196" elapsed="0.000350"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:13:36.822597" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:13:36.822760" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:13:36.821831" elapsed="0.000953"/>
</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-04-17T03:13:36.823037" elapsed="0.000444"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:13:36.823767" level="INFO">index=29
host=10.30.170.120
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-04-17T03:13:36.823867" level="INFO">${karaf_connection_object} = index=29
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:13:36.823649" elapsed="0.000244"/>
</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-04-17T03:13:36.824057" elapsed="0.002296"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:13:36.826785" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:13:36.828108" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:13:36.826520" elapsed="0.002011">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:13:36.843184" elapsed="0.000440"/>
</kw>
<msg time="2026-04-17T03:13:36.843730" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:13:36.841756" elapsed="0.002138"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:36.844177" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:36.844373" elapsed="0.000026"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:13:36.829517" elapsed="0.014958"/>
</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-04-17T03:13:36.828852" elapsed="0.015673"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:13:36.813913" elapsed="0.030707">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:36.845063" elapsed="0.000037"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:13:36.845161" 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="FAIL" start="2026-04-17T03:13:36.800362" elapsed="0.044945">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:13:36.845454" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:13:36.845503" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:36.795495" elapsed="0.050035"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:36.846664" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:36.845634" elapsed="0.001097"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:36.845609" elapsed="0.001152"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:13:36.795335" elapsed="0.051455"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:13:36.795129" elapsed="0.051712"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:13:36.792669" elapsed="0.054295"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:13:36.787551" elapsed="0.059561"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:36.787058" elapsed="0.060104"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:13:36.783320" elapsed="0.063901"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:13:36.857448" level="INFO">Executing command 'cat exaipv6.log'.</msg>
<msg time="2026-04-17T03:13:36.871323" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:13:36.871640" level="INFO">${output_log} = 03:12:13 | 3370   | welcome         | Thank you for using ExaBGP
03:12:13 | 3370   | version         | 4.2.4
03:12:13 | 3370   | interpreter     | 3.10.12 (main, Jan 26 2026, 14:55:28) [GCC 11.4.0]
03...</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-04-17T03:13:36.857282" elapsed="0.014428"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:36.872995" level="INFO">03:12:13 | 3370   | welcome         | Thank you for using ExaBGP
03:12:13 | 3370   | version         | 4.2.4
03:12:13 | 3370   | interpreter     | 3.10.12 (main, Jan 26 2026, 14:55:28) [GCC 11.4.0]
03:12:13 | 3370   | os              | Linux releng-26932-188-0-builder-0 5.15.0-171-generic #181-Ubuntu SMP Fri Feb 6 22:44:50 UTC 2026 x86_64
03:12:13 | 3370   | installation    | /tmp/defaultvenv
03:12:13 | 3370   | advice          | environment file missing
03:12:13 | 3370   | advice          | generate it using "exabgp --fi &gt; /tmp/defaultvenv/etc/exabgp/exabgp.env"
03:12:13 | 3370   | cli             | could not find the named pipes (exabgp.in and exabgp.out) required for the cli
03:12:13 | 3370   | cli             | we scanned the following folders (the number is your PID):
03:12:13 | 3370   | cli control     |  - /run/exabgp/
03:12:13 | 3370   | cli control     |  - /run/1001/
03:12:13 | 3370   | cli control     |  - /run/
03:12:13 | 3370   | cli control     |  - /var/run/exabgp/
03:12:13 | 3370   | cli control     |  - /var/run/1001/
03:12:13 | 3370   | cli control     |  - /var/run/
03:12:13 | 3370   | cli control     |  - /tmp/defaultvenv/run/exabgp/
03:12:13 | 3370   | cli control     |  - /tmp/defaultvenv/run/1001/
03:12:13 | 3370   | cli control     |  - /tmp/defaultvenv/run/
03:12:13 | 3370   | cli control     |  - /tmp/defaultvenv/var/run/exabgp/
03:12:13 | 3370   | cli control     |  - /tmp/defaultvenv/var/run/1001/
03:12:13 | 3370   | cli control     |  - /tmp/defaultvenv/var/run/
03:12:13 | 3370   | cli control     | please make them in one of the folder with the following commands:
03:12:13 | 3370   | cli control     | &gt; mkfifo /home/jenkins/run/exabgp.{in,out}
03:12:13 | 3370   | cli control     | &gt; chmod 600 /home/jenkins/run/exabgp.{in,out}
03:12:13 | 3370   | cli control     | &gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}
03:12:13 | 3370   | configuration   | performing reload of exabgp 4.2.4
03:12:13 | 3370   | configuration   | &gt; neighbor         | '::1'
03:12:13 | 3370   | configuration   | . router-id        | '1.2.3.4'
03:12:13 | 3370   | configuration   | . local-address    | '2607:f0d0:1002:0011:0000:0000:0000:0002'
03:12:13 | 3370   | configuration   | . local-as         | '64496'
03:12:13 | 3370   | configuration   | . peer-as          | '64496'
03:12:13 | 3370   | configuration   | &gt; capability       | 
03:12:13 | 3370   | configuration   | . route-refresh    | 'disable'
03:12:13 | 3370   | configuration   | . add-path         | 'disable'
03:12:13 | 3370   | configuration   | &lt; capability       | 
03:12:13 | 3370   | configuration   | &gt; family           | 
03:12:13 | 3370   | configuration   | . ipv6             | 'unicast'
03:12:13 | 3370   | configuration   | &lt; family           | 
03:12:13 | 3370   | configuration   | &gt; static           | 
03:12:13 | 3370   | configuration   | . route            | '2a04:6d80::1/128' 'next-hop' 'self'
03:12:13 | 3370   | configuration   | &lt; static           | 
03:12:13 | 3370   | configuration   | &lt; neighbor         | 
03:12:13 | 3370   | 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
03:12:13 | 3370   | reactor         | loaded new configuration successfully
03:12:13 | 3370   | reactor         | initialising connection to peer-1
03:12:13 | 3370   | outgoing-1      | attempting connection to ::1:1790
03:12:13 | 3370   | 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
03:12:13 | 3370   | outgoing-1      | outgoing-1 2607:f0d0:1002:0011:0000:0000:0000:0002-::1, closing connection
03:12:13 | 3370   | outgoing-1      | peer reset, message [closing connection] error[Broken TCP connection]
03:12:13 | 3370   | outgoing-1      | outgoing-1 2607:f0d0:1002:0011:0000:0000:0000:0002-::1, closing connection
03:12:13 | 3370   | reactor         | initialising connection to peer-1
03:12:13 | 3370   | outgoing-2      | attempting connection to ::1:1790
03:12:13 | 3370   | 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
03:12:13 | 3370   | outgoing-2      | outgoing-2 2607:f0d0:1002:0011:0000:0000:0000:0002-::1, closing connection
03:12:13 | 3370   | outgoing-2      | peer reset, message [closing connection] error[Broken TCP connection]
03:12:13 | 3370   | outgoing-2      | outgoing-2 2607:f0d0:1002:0011:0000:0000:0000:0002-::1, closing connection
03:12:14 | 3370   | reactor         | initialising connection to peer-1
03:12:14 | 3370   | outgoing-3      | attempting connection to ::1:1790
03:12:14 | 3370   | 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
03:12:14 | 3370   | outgoing-3      | outgoing-3 2607:f0d0:1002:0011:0000:0000:0000:0002-::1, closing connection
03:12:14 | 3370   | outgoing-3      | peer reset, message [closing connection] error[Broken TCP connection]
03:12:14 | 3370   | outgoing-3      | outgoing-3 2607:f0d0:1002:0011:0000:0000:0000:0002-::1, closing connection
03:12:16 | 3370   | reactor         | initialising connection to peer-1
03:12:16 | 3370   | outgoing-4      | attempting connection to ::1:1790
03:12:16 | 3370   | 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
03:12:16 | 3370   | outgoing-4      | outgoing-4 2607:f0d0:1002:0011:0000:0000:0000:0002-::1, closing connection
03:12:16 | 3370   | outgoing-4      | peer reset, message [closing connection] error[Broken TCP connection]
03:12:16 | 3370   | outgoing-4      | outgoing-4 2607:f0d0:1002:0011:0000:0000:0000:0002-::1, closing connection
03:12:19 | 3370   | reactor         | initialising connection to peer-1
03:12:19 | 3370   | outgoing-5      | attempting connection to ::1:1790
03:12:19 | 3370   | outgoing-5      | 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
03:12:19 | 3370   | outgoing-5      | outgoing-5 2607:f0d0:1002:0011:0000:0000:0000:0002-::1, closing connection
03:12:19 | 3370   | outgoing-5      | peer reset, message [closing connection] error[Broken TCP connection]
03:12:19 | 3370   | outgoing-5      | outgoing-5 2607:f0d0:1002:0011:0000:0000:0000:0002-::1, closing connection
03:12:21 | 3370   | reactor         | ^C received
03:12:21 | 3370   | reactor         | performing shutdown</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:36.872236" elapsed="0.001097"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-04-17T03:13:36.875063" 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-04-17T03:13:36.874043" elapsed="0.001168"/>
</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-04-17T03:13:36.856797" elapsed="0.018518"/>
</kw>
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-04-17T03:13:36.876388" level="INFO">${output} =  </msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-04-17T03:13:36.876151" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:36.877042" level="INFO"> </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:36.876637" elapsed="0.000468"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:13:36.878367" 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-04-17T03:13:36.877855" elapsed="0.000550"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-04-17T03:13:36.878621" elapsed="0.000393"/>
</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-04-17T03:13:36.877387" elapsed="0.001716"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:13:36.910030" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:13:36.910251" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-188-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-04-17T03:13:36.879313" elapsed="0.030968"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:36.910915" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:36.910553" elapsed="0.000452"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:13:36.913290" 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-04-17T03:13:36.911714" elapsed="0.001640"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:13:37.734180" level="INFO">[?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:13:37.734535" level="INFO">${output} = [?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-188-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-04-17T03:13:36.913524" elapsed="0.821048"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:37.735566" level="INFO">[?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:37.735167" elapsed="0.000451"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:37.734734" elapsed="0.000919"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:37.734690" elapsed="0.000991"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-04-17T03:13:36.911304" elapsed="0.824436"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-04-17T03:13:36.875662" elapsed="0.860137"/>
</kw>
<doc>Save exabgp logs as exaipv6.log, and stop exabgp with ctrl-c bash signal</doc>
<status status="PASS" start="2026-04-17T03:13:36.782688" elapsed="0.953262"/>
</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-04-17T03:13:37.740058" elapsed="0.000227"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:13:37.739755" elapsed="0.000588"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:13:37.741438" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:37.741298" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:37.741277" elapsed="0.000257"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:13:37.747091" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:37.746975" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:37.746955" elapsed="0.000208"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:37.748265" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:13:37.747829" elapsed="0.000468"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:13:37.748756" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:13:37.748458" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:13:37.748826" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:13:37.749018" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:13:37.747427" elapsed="0.001616"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:13:37.755107" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:37.754983" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:37.754960" elapsed="0.000223"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:13:37.756476" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:37.756367" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:37.756350" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:13:37.757027" level="INFO">${karaf_connection_index} = 29</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:13:37.756689" elapsed="0.000367"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:13:37.757434" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:13:37.757215" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:13:37.758254" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:13:37.757965" elapsed="0.001004">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:13:37.759160" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:13:37.759207" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:37.757616" elapsed="0.001615"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:13:37.760036" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:13:37.759777" elapsed="0.000903">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:13:37.760863" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:13:37.760910" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:37.759435" elapsed="0.001520"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:13:37.761885" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Configure_App_Peer"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:13:37.761267" elapsed="0.000890">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Configure_App_Peer"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:13:37.761036" elapsed="0.001193">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Configure_App_Peer"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:13:37.761014" elapsed="0.001250">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Configure_App_Peer"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:37.762431" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:37.762657" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:37.762517" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:37.762500" elapsed="0.000233"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:13:37.762767" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:13:37.765489" elapsed="0.000151"/>
</kw>
<msg time="2026-04-17T03:13:37.765707" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:13:37.764289" elapsed="0.001549"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:37.766133" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:37.766463" 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-04-17T03:13:37.763644" elapsed="0.003000"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:13:37.763071" 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="FAIL" start="2026-04-17T03:13:37.756061" elapsed="0.010733">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Configure_App_Peer"</status>
</kw>
<msg time="2026-04-17T03:13:37.766898" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:13:37.767039" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Configure_App_Peer"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:37.755362" elapsed="0.011703"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:13:37.767311" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:37.767198" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:37.767177" elapsed="0.000215"/>
</if>
<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-04-17T03:13:37.768302" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:37.768192" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:37.768174" elapsed="0.000194"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:13:37.768648" level="INFO">index=15
host=10.30.170.120
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-04-17T03:13:37.768753" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
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-04-17T03:13:37.768518" elapsed="0.000262"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:37.769213" level="INFO">{1: 29}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:37.768944" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:37.769656" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:37.769408" elapsed="0.000292"/>
</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-04-17T03:13:37.770246" elapsed="0.000267"/>
</kw>
<msg time="2026-04-17T03:13:37.770612" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:13:37.770659" level="INFO">${old_connection_index} = 29</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:37.769858" elapsed="0.000824"/>
</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-04-17T03:13:37.771537" elapsed="0.000192"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:13:37.772820" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:13:37.772410" elapsed="0.001315">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:37.771894" elapsed="0.001930"/>
</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-04-17T03:13:37.774470" elapsed="0.000275"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:37.774009" elapsed="0.000819"/>
</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-04-17T03:13:37.770989" elapsed="0.003884"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:37.770756" elapsed="0.004166"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:37.770738" elapsed="0.004224"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:13:37.775846" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:13:37.775529" elapsed="0.000343"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:13:37.775920" elapsed="0.000050"/>
</return>
<msg time="2026-04-17T03:13:37.776094" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:13:37.775173" elapsed="0.000946"/>
</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-04-17T03:13:37.776270" elapsed="0.000449"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:13:37.777034" level="INFO">index=30
host=10.30.170.120
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-04-17T03:13:37.777135" level="INFO">${karaf_connection_object} = index=30
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:13:37.776891" elapsed="0.000271"/>
</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-04-17T03:13:37.777310" elapsed="0.002539"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:13:37.780298" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:13:37.781598" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:13:37.780031" elapsed="0.002016">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:13:37.796785" elapsed="0.000745"/>
</kw>
<msg time="2026-04-17T03:13:37.797701" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:13:37.795238" elapsed="0.002627"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:37.798048" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:37.798212" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:13:37.782973" elapsed="0.015328"/>
</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-04-17T03:13:37.782378" elapsed="0.015971"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:13:37.767804" elapsed="0.030635">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:37.798825" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:13:37.798901" elapsed="0.000036"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:13:37.754466" elapsed="0.044568">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:13:37.799148" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:13:37.799192" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:37.749423" elapsed="0.049793"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:37.799610" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:37.799298" elapsed="0.000399"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:37.799279" elapsed="0.000445"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:13:37.749282" elapsed="0.050467"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:13:37.749103" elapsed="0.050680"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:13:37.746576" elapsed="0.053268"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:13:37.740986" elapsed="0.058916"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:37.740501" elapsed="0.059693"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:13:37.737016" elapsed="0.063242"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:13:37.801217" 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-04-17T03:13:37.800527" elapsed="0.000720"/>
</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-04-17T03:13:37.837298" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:37.836775" elapsed="0.000563"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:37.838323" 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-04-17T03:13:37.837872" elapsed="0.000713">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-04-17T03:13:37.838710" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:37.837520" elapsed="0.001216"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:37.839325" 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-04-17T03:13:37.838902" elapsed="0.000591"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:13:37.839817" 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-04-17T03:13:37.840008" 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-04-17T03:13:37.839666" elapsed="0.000370"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:37.840499" 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-04-17T03:13:37.840195" elapsed="0.000363"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:37.841911" 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-04-17T03:13:37.841642" elapsed="0.000339"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:13:37.842462" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:13:37.842146" elapsed="0.000351"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:13:37.843258" 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-04-17T03:13:37.842885" elapsed="0.000406"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:13:37.844118" 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-04-17T03:13:37.843870" elapsed="0.000275"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:13:37.844198" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:13:37.844376" 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-04-17T03:13:37.843516" 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-04-17T03:13:37.844553" elapsed="0.000318"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.12</var>
<status status="PASS" start="2026-04-17T03:13:37.842748" elapsed="0.002167"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:13:37.845490" 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-04-17T03:13:37.845185" elapsed="0.000331"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:13:37.846251" 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-04-17T03:13:37.846035" elapsed="0.000257"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:13:37.846363" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:13:37.846531" 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-04-17T03:13:37.845701" 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-04-17T03:13:37.846728" elapsed="0.000252"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:13:37.845052" elapsed="0.001969"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:13:37.847581" 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-04-17T03:13:37.847259" elapsed="0.000348"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:13:37.848444" 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-04-17T03:13:37.848196" elapsed="0.000276"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:13:37.848523" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:13:37.848674" 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-04-17T03:13:37.847833" 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-04-17T03:13:37.848879" elapsed="0.000491"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:13:37.847131" elapsed="0.002283"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:13:37.850001" 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-04-17T03:13:37.849682" elapsed="0.000345"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:13:37.850792" 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-04-17T03:13:37.850568" elapsed="0.000250"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:13:37.850868" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:13:37.851151" 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-04-17T03:13:37.850209" 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-04-17T03:13:37.851371" elapsed="0.000289"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:13:37.849547" elapsed="0.002166"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:13:37.852352" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:13:37.852014" elapsed="0.000373"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:13:37.853164" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:13:37.852919" elapsed="0.000272"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:13:37.853242" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:13:37.853393" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:13:37.852579" 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-04-17T03:13:37.853566" elapsed="0.000224"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:13:37.851843" elapsed="0.001987"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:13:37.854394" 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-04-17T03:13:37.854088" elapsed="0.000333"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:13:37.855214" 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-04-17T03:13:37.854989" elapsed="0.000251"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:13:37.855290" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:13:37.855468" 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-04-17T03:13:37.854609" 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-04-17T03:13:37.855644" elapsed="0.000223"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:13:37.853956" elapsed="0.001951"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:13:37.856465" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:13:37.856164" elapsed="0.000326"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:13:37.857263" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:13:37.857000" elapsed="0.000289"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:13:37.857339" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:13:37.857489" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:13:37.856671" elapsed="0.000841"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:13:37.857669" elapsed="0.000291"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:13:37.856035" elapsed="0.001968"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:13:37.858588" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:13:37.858248" elapsed="0.000367"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:13:37.859362" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:13:37.859142" elapsed="0.000247"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:13:37.859457" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:13:37.859613" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:13:37.858800" elapsed="0.000837"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:13:37.859785" elapsed="0.000246"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:13:37.858116" elapsed="0.001957"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:13:37.842555" elapsed="0.017554"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:13:37.860161" elapsed="0.000027"/>
</return>
<msg time="2026-04-17T03:13:37.860327" 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-04-17T03:13:37.841085" elapsed="0.019268"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:37.840654" elapsed="0.019801"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:37.860647" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:37.860490" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:37.840625" elapsed="0.020102"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:13:37.861696" 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-04-17T03:13:37.860875" elapsed="0.000852"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:13:37.861778" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:13:37.835884" elapsed="0.026024"/>
</kw>
<msg time="2026-04-17T03:13:37.861987" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:13:37.822016" elapsed="0.040027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:13:37.879689" elapsed="0.000082"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:13:37.898738" elapsed="0.000074"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:13:37.915837" elapsed="0.000061"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:37.916224" 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-04-17T03:13:37.916427" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:37.916864" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:37.916710" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:37.916692" elapsed="0.000276"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:37.917125" 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-04-17T03:13:37.917325" 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-04-17T03:13:37.917497" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:13:37.916654" elapsed="0.000910"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:13:37.916513" elapsed="0.001090"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:37.917784" elapsed="0.000031"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:37.917900" elapsed="0.000047"/>
</return>
<msg time="2026-04-17T03:13:37.918256" 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-04-17T03:13:37.817334" elapsed="0.100966"/>
</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-04-17T03:13:37.952087" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:37.951435" elapsed="0.000699"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:37.953188" 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-04-17T03:13:37.952853" elapsed="0.000416">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-04-17T03:13:37.953370" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:37.952372" elapsed="0.001025"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:37.953993" 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-04-17T03:13:37.953565" elapsed="0.000466"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:13:37.954432" 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-04-17T03:13:37.954622" 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-04-17T03:13:37.954257" elapsed="0.000395"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:37.955086" 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-04-17T03:13:37.954811" elapsed="0.000330"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-17T03:13:37.955687" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:37.955243" elapsed="0.000506"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:13:37.956292" level="INFO">${mapping_to_use} = {'IP': '127.0.0.12', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': '...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:37.955922" elapsed="0.000405"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:37.955776" elapsed="0.000596"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:37.955210" elapsed="0.001194"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:13:37.957372" 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-04-17T03:13:37.956612" elapsed="0.000792"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:13:37.957457" 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/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-04-17T03:13:37.950331" elapsed="0.007278"/>
</kw>
<msg time="2026-04-17T03:13:37.957690" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:13:37.933566" elapsed="0.024194"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:13:37.971532" elapsed="0.000034"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/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-04-17T03:13:37.985137" elapsed="0.000042"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:13:37.997963" elapsed="0.000046"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:37.998236" 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-04-17T03:13:37.998422" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:37.998850" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:37.998697" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:37.998678" elapsed="0.000273"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:37.999098" 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-04-17T03:13:37.999265" 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-04-17T03:13:37.999431" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:13:37.998640" elapsed="0.000845"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:13:37.998508" elapsed="0.001037"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:37.999695" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:37.999778" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:13:37.999963" 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-04-17T03:13:37.930509" elapsed="0.069486"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:38.001460" 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-04-17T03:13:38.001142" elapsed="0.000395">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-04-17T03:13:38.001633" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:38.000728" elapsed="0.000930"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:38.002016" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:38.001729" elapsed="0.000412"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:13:38.002667" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:38.002360" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:38.002168" elapsed="0.000562"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:38.001711" elapsed="0.001041"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:38.005264" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:13:38.002905" elapsed="0.002386"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:13:38.005344" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:13:38.005508" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:13:38.000363" elapsed="0.005170"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:38.006969" 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-04-17T03:13:38.006695" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:38.007408" 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-04-17T03:13:38.007168" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:38.007892" 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-04-17T03:13:38.007643" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:38.008425" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:38.008104" elapsed="0.000364"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:13:38.009305" 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-04-17T03:13:38.009097" elapsed="0.000234"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:13:38.009686" 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-04-17T03:13:38.009509" elapsed="0.000202"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:13:38.009859" elapsed="0.000229"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:38.010494" 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-04-17T03:13:38.010245" elapsed="0.000292"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:13:38.010579" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:13:38.010737" 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-04-17T03:13:38.008673" 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-04-17T03:13:38.016358" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:13:38.218265" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:13:38.621831" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:13:38.625145" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:13:38.013254" elapsed="0.619570">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:13:38.010829" elapsed="0.622577">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:38.634266" elapsed="0.000069"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:38.633696" elapsed="0.000774"/>
</branch>
<status status="FAIL" start="2026-04-17T03:13:38.010812" elapsed="0.623733">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:38.635677" elapsed="0.000083"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:38.636189" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:38.636099" elapsed="0.000182"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:38.636048" elapsed="0.000255"/>
</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-04-17T03:13:38.636457" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:13:38.636527" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:13:38.005874" elapsed="0.630787">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:38.636754" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:13:37.806238" elapsed="0.830621">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:38.637248" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:38.637001" elapsed="0.000346"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:38.636978" elapsed="0.000404"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:38.637429" elapsed="0.000020"/>
</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="FAIL" start="2026-04-17T03:13:37.801522" elapsed="0.836030">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Configures bgp application peer.</doc>
<status status="FAIL" start="2026-04-17T03:13:37.736418" elapsed="0.901351">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:13:38.641794" elapsed="0.000338"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:13:38.641510" 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-04-17T03:13:38.643318" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:38.643187" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:38.643168" elapsed="0.000220"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:13:38.648991" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:38.648863" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:38.648845" elapsed="0.000216"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:38.650119" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:13:38.649685" elapsed="0.000465"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:13:38.650624" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:13:38.650314" elapsed="0.000336"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:13:38.650698" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:13:38.650910" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:13:38.649295" elapsed="0.001664"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:13:38.657252" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:38.657127" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:38.657104" elapsed="0.000226"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:13:38.658641" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:38.658530" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:38.658513" elapsed="0.000201"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:13:38.659242" level="INFO">${karaf_connection_index} = 30</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:13:38.658876" elapsed="0.000394"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:13:38.659754" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:13:38.659482" elapsed="0.000300"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:13:38.660703" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:13:38.660392" elapsed="0.001196">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:13:38.661831" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:13:38.661890" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:38.660018" elapsed="0.001902"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:13:38.662993" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:13:38.662636" elapsed="0.001102">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:13:38.664002" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:13:38.664049" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:38.662177" elapsed="0.001895"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:13:38.665273" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Reconfigure_ODL_To_Accept_Connections_4"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:13:38.664378" elapsed="0.000960">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Reconfigure_ODL_To_Accept_Connections_4"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:13:38.664148" elapsed="0.001264">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Reconfigure_ODL_To_Accept_Connections_4"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:13:38.664129" elapsed="0.001317">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Reconfigure_ODL_To_Accept_Connections_4"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:38.665618" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:38.665844" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:38.665705" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:38.665689" elapsed="0.000231"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:13:38.665983" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:13:38.668676" elapsed="0.000149"/>
</kw>
<msg time="2026-04-17T03:13:38.668895" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:13:38.667515" elapsed="0.001530"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:38.669319" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:38.669649" elapsed="0.000099"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:13:38.666818" 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-04-17T03:13:38.666268" elapsed="0.003702"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:13:38.658219" elapsed="0.011843">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Reconfigure_ODL_To_Accept_Connections_4"</status>
</kw>
<msg time="2026-04-17T03:13:38.670168" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:13:38.670211" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Reconfigure_ODL_To_Accept_Connections_4"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:38.657555" elapsed="0.012680"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:13:38.670425" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:38.670316" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:38.670296" elapsed="0.000196"/>
</if>
<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-04-17T03:13:38.671315" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:38.671207" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:38.671190" elapsed="0.000191"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:13:38.671673" level="INFO">index=15
host=10.30.170.120
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-04-17T03:13:38.671781" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
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-04-17T03:13:38.671537" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:38.672321" level="INFO">{1: 30}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:38.672007" elapsed="0.000367"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:38.672794" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:38.672529" elapsed="0.000309"/>
</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-04-17T03:13:38.673450" elapsed="0.000274"/>
</kw>
<msg time="2026-04-17T03:13:38.673825" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:13:38.673871" level="INFO">${old_connection_index} = 30</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:38.673015" elapsed="0.000878"/>
</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-04-17T03:13:38.674848" elapsed="0.000222"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:13:38.676299" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:13:38.675803" elapsed="0.001387">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:38.675281" elapsed="0.002009"/>
</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-04-17T03:13:38.678155" elapsed="0.000359"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:38.677466" elapsed="0.001147"/>
</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-04-17T03:13:38.674304" elapsed="0.004368"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:38.674058" elapsed="0.004675"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:38.674031" elapsed="0.004733"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:13:38.679846" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:13:38.679460" elapsed="0.000462"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:13:38.679989" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:13:38.680196" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:13:38.679063" elapsed="0.001158"/>
</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-04-17T03:13:38.680379" elapsed="0.000442"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:13:38.681375" level="INFO">index=31
host=10.30.170.120
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-04-17T03:13:38.681485" level="INFO">${karaf_connection_object} = index=31
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:13:38.681044" elapsed="0.000467"/>
</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-04-17T03:13:38.681685" elapsed="0.002553"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:13:38.684705" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:13:38.686050" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:13:38.684416" elapsed="0.002026">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:13:38.700657" elapsed="0.000645"/>
</kw>
<msg time="2026-04-17T03:13:38.701411" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:13:38.699215" elapsed="0.002367"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:38.701790" elapsed="0.000032"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:38.702010" elapsed="0.000024"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:13:38.687276" elapsed="0.014825"/>
</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-04-17T03:13:38.686733" elapsed="0.015417"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:13:38.670891" elapsed="0.031357">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:38.702636" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:13:38.702722" 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="FAIL" start="2026-04-17T03:13:38.656692" elapsed="0.046167">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:13:38.703019" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:13:38.703080" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:38.651391" elapsed="0.051722"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:38.703510" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:38.703225" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:38.703199" elapsed="0.000393"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:13:38.651218" elapsed="0.052399"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:13:38.651028" elapsed="0.052626"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:13:38.648488" elapsed="0.055233"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:13:38.642820" elapsed="0.060974"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:38.642359" elapsed="0.061491"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:13:38.638922" elapsed="0.065052"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:13:38.705239" 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-04-17T03:13:38.704209" elapsed="0.001116"/>
</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-04-17T03:13:38.741904" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:38.741476" elapsed="0.000486"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:38.742827" 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-04-17T03:13:38.742514" elapsed="0.000402">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-04-17T03:13:38.743041" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:38.742161" elapsed="0.000910"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:38.743647" 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-04-17T03:13:38.743241" elapsed="0.000438"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:13:38.744077" 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-04-17T03:13:38.744266" 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-04-17T03:13:38.743853" elapsed="0.000440"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:38.744711" 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-04-17T03:13:38.744449" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:38.745809" 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-04-17T03:13:38.745514" elapsed="0.000341"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:13:38.746307" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:13:38.746031" elapsed="0.000302"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:13:38.747072" 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-04-17T03:13:38.746750" elapsed="0.000348"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:13:38.747857" 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-04-17T03:13:38.747614" elapsed="0.000269"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:13:38.747978" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:13:38.748153" 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-04-17T03:13:38.747287" 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-04-17T03:13:38.748333" elapsed="0.000247"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-04-17T03:13:38.746590" elapsed="0.002031"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:13:38.749202" 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-04-17T03:13:38.748883" elapsed="0.000344"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:13:38.749957" 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-04-17T03:13:38.749729" elapsed="0.000255"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:13:38.750035" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:13:38.750185" 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-04-17T03:13:38.749414" elapsed="0.000795"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:13:38.750358" elapsed="0.000230"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:13:38.748750" elapsed="0.001929"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:13:38.751248" 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-04-17T03:13:38.750939" elapsed="0.000334"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:13:38.752283" 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-04-17T03:13:38.752058" elapsed="0.000251"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:13:38.752359" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:13:38.752511" 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-04-17T03:13:38.751629" 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-04-17T03:13:38.752685" elapsed="0.000221"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:13:38.750793" elapsed="0.002169"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:13:38.753511" 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-04-17T03:13:38.753212" elapsed="0.000325"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:13:38.754252" 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-04-17T03:13:38.754045" elapsed="0.000232"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:13:38.754326" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:13:38.754474" 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-04-17T03:13:38.753720" 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-04-17T03:13:38.754645" elapsed="0.000219"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:13:38.753076" elapsed="0.001827"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:13:38.755449" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:13:38.755156" elapsed="0.000319"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:13:38.756248" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:13:38.756023" elapsed="0.000250"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:13:38.756322" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:13:38.756472" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:13:38.755653" 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-04-17T03:13:38.756648" elapsed="0.000221"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:13:38.755028" elapsed="0.001880"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:13:38.757462" 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-04-17T03:13:38.757168" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:13:38.758209" 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-04-17T03:13:38.758001" elapsed="0.000233"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:13:38.758282" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:13:38.758429" 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-04-17T03:13:38.757668" 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-04-17T03:13:38.758605" elapsed="0.000226"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:13:38.757033" elapsed="0.001838"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:13:38.759431" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:13:38.759136" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:13:38.760271" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:13:38.760035" elapsed="0.000262"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:13:38.760346" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:13:38.760496" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:13:38.759638" 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-04-17T03:13:38.760668" elapsed="0.000220"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:13:38.758999" elapsed="0.001985"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:13:38.761653" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:13:38.761234" elapsed="0.000454"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:13:38.763047" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:13:38.762495" elapsed="0.000589"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:13:38.763153" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:13:38.763362" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:13:38.761962" elapsed="0.001434"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:13:38.763758" elapsed="0.000424"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:13:38.761101" elapsed="0.003139"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:13:38.746393" elapsed="0.017895"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:13:38.764349" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:13:38.764575" 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-04-17T03:13:38.745189" elapsed="0.019422"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:38.744840" elapsed="0.019815"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:38.764900" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:38.764691" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:38.744814" elapsed="0.020215"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:13:38.766228" 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-04-17T03:13:38.765230" elapsed="0.001039"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:13:38.766337" elapsed="0.000039"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/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-04-17T03:13:38.740798" elapsed="0.025771"/>
</kw>
<msg time="2026-04-17T03:13:38.766649" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:13:38.726939" elapsed="0.039783"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:13:38.781074" 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/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-04-17T03:13:38.796111" elapsed="0.000050"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:13:38.811100" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:38.811333" elapsed="0.000080"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:38.811582" 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-04-17T03:13:38.812072" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:38.811852" elapsed="0.000285"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:38.811834" elapsed="0.000332"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:38.812330" 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-04-17T03:13:38.812500" 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-04-17T03:13:38.812668" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:13:38.811793" elapsed="0.000929"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:13:38.811675" elapsed="0.001074"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:38.812895" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:38.812991" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:13:38.813153" 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-04-17T03:13:38.721519" elapsed="0.091663"/>
</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-04-17T03:13:38.848003" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:38.847539" elapsed="0.000499"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:38.848817" 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-04-17T03:13:38.848545" elapsed="0.000355">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-04-17T03:13:38.849046" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:38.848206" elapsed="0.000867"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:38.849644" 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-04-17T03:13:38.849254" elapsed="0.000416"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:13:38.849986" 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-04-17T03:13:38.850166" 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-04-17T03:13:38.849828" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:38.850609" 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-04-17T03:13:38.850359" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-17T03:13:38.851109" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:38.850737" elapsed="0.000431"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:13:38.851638" level="INFO">${mapping_to_use} = {'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'e...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:38.851336" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:38.851194" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:38.850716" elapsed="0.001005"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:13:38.852939" 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-04-17T03:13:38.851865" elapsed="0.001107"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:13:38.853025" elapsed="0.000036"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:13:38.846877" elapsed="0.006284"/>
</kw>
<msg time="2026-04-17T03:13:38.853218" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:13:38.827749" elapsed="0.025516"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:13:38.897450" elapsed="0.000081"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:13:38.912661" 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/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-04-17T03:13:38.942104" elapsed="0.000080"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:38.942536" elapsed="0.000036"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:38.942813" 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-04-17T03:13:38.943594" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:38.943288" elapsed="0.000401"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:38.943262" elapsed="0.000472"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:38.944070" 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-04-17T03:13:38.944433" 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-04-17T03:13:38.944787" elapsed="0.000044"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:13:38.943203" elapsed="0.001713"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:13:38.942989" elapsed="0.002020"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:38.945393" elapsed="0.000047"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:38.945559" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:13:38.945855" 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-04-17T03:13:38.824987" elapsed="0.120919"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:13:38.948419" 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-04-17T03:13:38.947851" elapsed="0.000687">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-04-17T03:13:38.948686" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:13:38.947174" elapsed="0.001549"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:38.949266" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:38.948831" elapsed="0.000527"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:13:38.950158" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:38.949667" elapsed="0.000530"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:38.949401" elapsed="0.000849"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:38.948803" elapsed="0.001480"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:38.953435" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:13:38.950522" elapsed="0.002940"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:13:38.953518" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:13:38.953686" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:13:38.946550" elapsed="0.007161"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:38.955298" 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-04-17T03:13:38.955028" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:38.955747" 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-04-17T03:13:38.955504" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:38.956388" 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-04-17T03:13:38.955970" elapsed="0.000465"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:38.956847" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:38.956601" elapsed="0.000291"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:13:38.957850" 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-04-17T03:13:38.957636" elapsed="0.000240"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:13:38.958272" 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-04-17T03:13:38.958060" elapsed="0.000238"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:13:38.958451" elapsed="0.000219"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:38.959192" 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-04-17T03:13:38.958920" elapsed="0.000317"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:13:38.959280" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:13:38.959439" 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-04-17T03:13:38.957219" elapsed="0.002246"/>
</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-04-17T03:13:38.965088" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:13:39.166783" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:13:39.571023" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:13:39.573998" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:13:38.961984" elapsed="0.617731">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:13:38.959536" elapsed="0.620437">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:39.580592" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:39.580069" elapsed="0.000691"/>
</branch>
<status status="FAIL" start="2026-04-17T03:13:38.959519" elapsed="0.621299">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:39.581564" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:39.581713" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:39.581669" elapsed="0.000092"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:39.581649" elapsed="0.000135"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:39.581962" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:13:39.582036" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:13:38.954134" elapsed="0.628023">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:39.582242" elapsed="0.000017"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:13:38.710237" elapsed="0.872118">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:39.582734" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:39.582531" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:39.582511" elapsed="0.000324"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:13:39.582872" elapsed="0.000016"/>
</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="FAIL" start="2026-04-17T03:13:38.705615" elapsed="0.877383">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<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="NOT RUN" start="2026-04-17T03:13:39.583211" elapsed="0.000024"/>
</kw>
<doc>Configure BGP peer modules with initiate-connection set to false with short ipv6 address.</doc>
<status status="FAIL" start="2026-04-17T03:13:38.638218" elapsed="0.945194">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:13:39.587058" elapsed="0.000289"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:13:39.586748" elapsed="0.000661"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:13:39.588499" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:39.588374" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:39.588352" 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-04-17T03:13:39.593777" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:39.593671" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:39.593653" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:39.594853" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:13:39.594462" elapsed="0.000418"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:13:39.595355" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:13:39.595056" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:13:39.595424" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:13:39.595580" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:13:39.594082" elapsed="0.001522"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:13:39.601185" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:39.601078" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:39.601059" 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-04-17T03:13:39.602408" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:39.602302" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:39.602285" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:13:39.602916" level="INFO">${karaf_connection_index} = 31</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:13:39.602616" elapsed="0.000343"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:13:39.603341" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:13:39.603118" elapsed="0.000282"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:13:39.604173" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:13:39.603899" elapsed="0.000929">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:13:39.605036" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:13:39.605082" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:39.603561" elapsed="0.001544"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:13:39.605848" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:13:39.605609" elapsed="0.000894">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:13:39.606687" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:13:39.606732" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:39.605270" elapsed="0.001485"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:13:39.609163" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Start_Exabgp_2"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:13:39.607068" elapsed="0.002159">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Start_Exabgp_2"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:13:39.606829" elapsed="0.002466">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Start_Exabgp_2"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:13:39.606810" elapsed="0.002518">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Start_Exabgp_2"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:39.609488" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:39.609718" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:39.609574" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:13:39.609558" elapsed="0.000236"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:13:39.609827" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:13:39.612399" elapsed="0.000146"/>
</kw>
<msg time="2026-04-17T03:13:39.612611" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:13:39.611356" 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-04-17T03:13:39.613032" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:39.613365" 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-04-17T03:13:39.610711" 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-04-17T03:13:39.610113" 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="FAIL" start="2026-04-17T03:13:39.602004" elapsed="0.011835">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Start_Exabgp_2"</status>
</kw>
<msg time="2026-04-17T03:13:39.613956" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:13:39.614002" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Start_Exabgp_2"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:39.601399" elapsed="0.012626"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:13:39.614205" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:39.614100" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:39.614082" elapsed="0.000188"/>
</if>
<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-04-17T03:13:39.615101" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:39.614994" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:39.614975" elapsed="0.000192"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:13:39.615438" level="INFO">index=15
host=10.30.170.120
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-04-17T03:13:39.615543" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
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-04-17T03:13:39.615316" elapsed="0.000253"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:39.616063" level="INFO">{1: 31}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:39.615753" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:39.616543" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:39.616257" elapsed="0.000328"/>
</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-04-17T03:13:39.617118" elapsed="0.000260"/>
</kw>
<msg time="2026-04-17T03:13:39.617477" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:13:39.617521" level="INFO">${old_connection_index} = 31</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:39.616742" elapsed="0.000801"/>
</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-04-17T03:13:39.618362" elapsed="0.000194"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:13:39.619818" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:13:39.619271" elapsed="0.001526">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:39.618722" elapsed="0.002178"/>
</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-04-17T03:13:39.621563" elapsed="0.000276"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:39.621093" elapsed="0.000831"/>
</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-04-17T03:13:39.617835" elapsed="0.004153"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:39.617617" elapsed="0.004421"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:39.617599" elapsed="0.004464"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:13:39.622894" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:13:39.622584" elapsed="0.000338"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:13:39.623040" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:13:39.623195" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:13:39.622263" elapsed="0.000957"/>
</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-04-17T03:13:39.623371" elapsed="0.000421"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:13:39.624083" level="INFO">index=32
host=10.30.170.120
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-04-17T03:13:39.624401" level="INFO">${karaf_connection_object} = index=32
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:13:39.623974" elapsed="0.000460"/>
</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-04-17T03:13:39.624589" elapsed="0.002842"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:13:39.628042" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:13:39.629338" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:13:39.627657" elapsed="0.002083">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:13:39.644627" elapsed="0.000573"/>
</kw>
<msg time="2026-04-17T03:13:39.645289" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:13:39.643330" elapsed="0.002106"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:39.645596" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:39.645757" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:13:39.630542" elapsed="0.015297"/>
</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-04-17T03:13:39.630032" elapsed="0.015853"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:13:39.614657" elapsed="0.031361">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:39.646352" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:13:39.646425" 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="FAIL" start="2026-04-17T03:13:39.600726" elapsed="0.045804">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:13:39.646634" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:13:39.646676" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:39.595990" elapsed="0.050709"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:39.647041" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:13:39.646775" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:39.646757" elapsed="0.000362"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:13:39.595833" elapsed="0.051309"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:13:39.595661" elapsed="0.051512"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:13:39.593305" elapsed="0.053922"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:13:39.588043" elapsed="0.059238"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:39.587565" elapsed="0.059763"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:13:39.584173" elapsed="0.063206"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:13:39.647864" level="INFO">${cmd} = exaipv4.cfg &gt; exaipv4.log</msg>
<var>${cmd}</var>
<arg>${EXABGP2_CFG} &gt; ${EXABGP2_LOG}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:39.647537" elapsed="0.000353"/>
</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-04-17T03:13:39.651322" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exaipv4.cfg &gt; exaipv4.log</msg>
<var>${start_cmd}</var>
<arg>${CMD} ${cfg_file}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:39.650996" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:39.651772" 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-04-17T03:13:39.651504" elapsed="0.000314"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:13:39.654545" 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-04-17T03:13:39.652575" elapsed="0.002026"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:13:39.658491" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:13:39.658582" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:13:39.654758" elapsed="0.003850"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:39.659183" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:39.658919" elapsed="0.000310"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:39.658675" elapsed="0.000587"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:39.658657" elapsed="0.000629"/>
</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-04-17T03:13:39.652079" elapsed="0.007250"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:13:39.661040" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exaipv4.cfg &gt; exaipv4.log</msg>
<msg time="2026-04-17T03:13:39.661130" 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-04-17T03:13:39.659477" elapsed="0.001679"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:39.661556" 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-04-17T03:13:39.661311" elapsed="0.000290"/>
</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-04-17T03:13:39.650663" elapsed="0.010991"/>
</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-04-17T03:13:39.663715" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:39.663364" elapsed="0.000526"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:39.666083" 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-04-17T03:13:39.664078" elapsed="0.002032"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:13:39.669050" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:39.870222" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:40.272062" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:40.278312" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:13:39.666272" elapsed="0.614374">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:40.280974" elapsed="0.000031"/>
</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="NOT RUN" start="2026-04-17T03:13:40.281161" elapsed="0.000021"/>
</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-04-17T03:13:39.662680" elapsed="0.618618">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:13:43.284822" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:43.283807" elapsed="0.001091"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:43.289392" 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-04-17T03:13:43.285475" elapsed="0.003960"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:13:43.293600" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:43.496209" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:43.898835" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:43.901292" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:13:43.289698" elapsed="0.616803">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:43.907225" elapsed="0.000072"/>
</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="NOT RUN" start="2026-04-17T03:13:43.907550" elapsed="0.000021"/>
</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-04-17T03:13:43.282459" elapsed="0.625235">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:13:46.911786" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:46.910109" elapsed="0.001753"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:46.916865" 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-04-17T03:13:46.912323" elapsed="0.004572"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:13:46.920032" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:47.121701" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:47.524060" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:47.526452" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:13:46.917084" elapsed="0.613738">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:47.531220" elapsed="0.000048"/>
</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="NOT RUN" start="2026-04-17T03:13:47.531482" elapsed="0.000030"/>
</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-04-17T03:13:46.908713" elapsed="0.622961">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:13:47.531828" level="FAIL">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:39.662208" elapsed="7.869781">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:13:47.532191" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:13:47.532256" level="INFO">${value} = Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/...</msg>
<var>${status}</var>
<var>${value}</var>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:39.661808" elapsed="7.870482"/>
</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-04-17T03:13:47.533526" level="INFO">[?2004l</msg>
<msg time="2026-04-17T03:13:47.533644" level="INFO">${output} = [?2004l</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-04-17T03:13:47.533351" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:47.534305" level="INFO">[?2004l</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:47.533892" elapsed="0.000478"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:13:47.535502" 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-04-17T03:13:47.535050" elapsed="0.000491"/>
</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-04-17T03:13:47.535753" elapsed="0.000351"/>
</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-04-17T03:13:47.534648" elapsed="0.001548"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:13:47.657659" level="INFO">^C[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:13:47.657857" level="INFO">${output} = ^C[?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:13:47.536404" elapsed="0.121483"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:47.658592" level="INFO">^C[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:47.658239" elapsed="0.000405"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:13:47.660616" 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-04-17T03:13:47.659371" elapsed="0.001320"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:13:47.661567" level="INFO">[?2004l[?2004h[jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:13:47.661665" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-188-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-04-17T03:13:47.660854" elapsed="0.000837"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:47.662338" level="INFO">[?2004l[?2004h[jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:47.662072" elapsed="0.000313"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:47.661770" elapsed="0.000651"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:47.661746" elapsed="0.000703"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-04-17T03:13:47.658950" elapsed="0.003549"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-04-17T03:13:47.532908" elapsed="0.129642"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:47.532437" elapsed="0.130141"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:47.532401" elapsed="0.130199"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="NOT RUN" start="2026-04-17T03:13:47.662777" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:47.662658" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:47.662642" elapsed="0.000201"/>
</if>
<var name="${idx}">0</var>
<status status="PASS" start="2026-04-17T03:13:39.650489" elapsed="8.012376"/>
</iter>
<iter>
<kw name="Start_ExaBgp" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:13:47.663959" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exaipv4.cfg &gt; exaipv4.log</msg>
<var>${start_cmd}</var>
<arg>${CMD} ${cfg_file}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:47.663607" elapsed="0.000381"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:47.664426" 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-04-17T03:13:47.664151" elapsed="0.000339"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:13:47.666852" 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-04-17T03:13:47.665465" elapsed="0.001445"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:13:47.671431" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:13:47.671525" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:13:47.667090" elapsed="0.004463"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:47.672148" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:47.671871" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:47.671622" elapsed="0.000607"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:47.671603" elapsed="0.000651"/>
</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-04-17T03:13:47.665093" elapsed="0.007207"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:13:47.674109" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exaipv4.cfg &gt; exaipv4.log</msg>
<msg time="2026-04-17T03:13:47.674201" 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-04-17T03:13:47.672449" elapsed="0.001777"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:47.674744" 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-04-17T03:13:47.674406" 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-04-17T03:13:47.663273" elapsed="0.011575"/>
</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-04-17T03:13:47.676837" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:47.676408" elapsed="0.000458"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:47.679079" 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-04-17T03:13:47.677048" elapsed="0.002058"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:13:47.681731" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:47.883290" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:48.285550" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:48.287687" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:13:47.679267" elapsed="0.611645">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:48.291360" elapsed="0.000054"/>
</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="NOT RUN" start="2026-04-17T03:13:48.291665" elapsed="0.000032"/>
</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-04-17T03:13:47.675944" elapsed="0.615938">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:13:51.295176" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:51.294067" elapsed="0.001224"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:51.301827" 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-04-17T03:13:51.295744" elapsed="0.006155"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:13:51.305747" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:51.507374" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:51.910466" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:51.912905" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:13:51.302543" elapsed="0.615073">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:51.918046" elapsed="0.000049"/>
</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="NOT RUN" start="2026-04-17T03:13:51.918314" elapsed="0.000030"/>
</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-04-17T03:13:51.292773" elapsed="0.625733">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:13:54.921417" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:54.920774" elapsed="0.000690"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:54.924620" 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-04-17T03:13:54.921713" elapsed="0.002947"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:13:54.928574" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:55.130188" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:55.533051" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:55.536029" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:13:54.924891" elapsed="0.615215">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:55.540489" elapsed="0.000046"/>
</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="NOT RUN" start="2026-04-17T03:13:55.540784" elapsed="0.000033"/>
</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-04-17T03:13:54.919421" elapsed="0.621588">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:13:55.541169" level="FAIL">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:47.675431" elapsed="7.865879">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:13:55.541515" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:13:55.541580" level="INFO">${value} = Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/...</msg>
<var>${status}</var>
<var>${value}</var>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:47.675031" elapsed="7.866585"/>
</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-04-17T03:13:55.543302" level="INFO">[?2004l</msg>
<msg time="2026-04-17T03:13:55.543464" level="INFO">${output} = [?2004l</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-04-17T03:13:55.543085" elapsed="0.000430"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:55.544254" level="INFO">[?2004l</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:55.543791" elapsed="0.000535"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:13:55.545554" 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-04-17T03:13:55.545094" elapsed="0.000499"/>
</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-04-17T03:13:55.545807" elapsed="0.000386"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-04-17T03:13:55.544615" elapsed="0.001671"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:13:55.671426" level="INFO">^C[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:13:55.671636" level="INFO">${output} = ^C[?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:13:55.546583" elapsed="0.125084"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:55.672290" level="INFO">^C[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:55.671918" elapsed="0.000422"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:13:55.674062" 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-04-17T03:13:55.673112" elapsed="0.001006"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:13:55.674996" level="INFO">[?2004l[?2004h[jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:13:55.675087" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-188-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-04-17T03:13:55.674292" elapsed="0.000822"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:55.675752" level="INFO">[?2004l[?2004h[jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:55.675485" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:55.675190" elapsed="0.000643"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:55.675168" elapsed="0.000692"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-04-17T03:13:55.672633" elapsed="0.003275"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-04-17T03:13:55.542265" elapsed="0.133714"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:55.541780" elapsed="0.134226"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:55.541735" elapsed="0.134362"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="NOT RUN" start="2026-04-17T03:13:55.676279" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:13:55.676159" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:55.676142" elapsed="0.000204"/>
</if>
<var name="${idx}">1</var>
<status status="PASS" start="2026-04-17T03:13:47.663066" elapsed="8.013304"/>
</iter>
<iter>
<kw name="Start_ExaBgp" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:13:55.677535" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exaipv4.cfg &gt; exaipv4.log</msg>
<var>${start_cmd}</var>
<arg>${CMD} ${cfg_file}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:55.677197" elapsed="0.000367"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:55.677984" 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-04-17T03:13:55.677719" elapsed="0.000312"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:13:55.679990" 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-04-17T03:13:55.678639" elapsed="0.001409"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:13:55.684683" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:13:55.684837" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:13:55.680207" elapsed="0.004657"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:55.685529" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:13:55.685246" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-04-17T03:13:55.684967" elapsed="0.000642"/>
</branch>
<status status="PASS" start="2026-04-17T03:13:55.684924" elapsed="0.000713"/>
</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-04-17T03:13:55.678276" elapsed="0.007409"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:13:55.687581" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exaipv4.cfg &gt; exaipv4.log</msg>
<msg time="2026-04-17T03:13:55.687668" 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-04-17T03:13:55.685836" elapsed="0.001857"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:13:55.688119" 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-04-17T03:13:55.687847" elapsed="0.000318"/>
</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-04-17T03:13:55.676825" elapsed="0.011396"/>
</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-04-17T03:13:55.690184" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:55.689801" elapsed="0.000409"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:55.692591" 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-04-17T03:13:55.690369" elapsed="0.002250"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:13:55.695460" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:55.897047" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:56.299153" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:56.301819" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:13:55.692816" elapsed="0.614148">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:56.307340" elapsed="0.000043"/>
</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="NOT RUN" start="2026-04-17T03:13:56.307617" elapsed="0.000032"/>
</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-04-17T03:13:55.689327" elapsed="0.618486">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:13:59.310900" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:13:59.309991" elapsed="0.001007"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:13:59.315644" 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-04-17T03:13:59.311380" elapsed="0.004308"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:13:59.319770" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:59.521590" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:59.924337" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:59.927578" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:13:59.316016" elapsed="0.616006">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:13:59.932388" elapsed="0.000042"/>
</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="NOT RUN" start="2026-04-17T03:13:59.932642" elapsed="0.000030"/>
</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-04-17T03:13:59.308729" elapsed="0.624112">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:14:02.937500" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:02.936037" elapsed="0.001568"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:02.942962" 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-04-17T03:14:02.938232" elapsed="0.004767"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:14:02.946715" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:14:03.150708" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:14:03.554166" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:14:03.557077" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:14:02.943209" elapsed="0.618501">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:03.562153" elapsed="0.000045"/>
</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="NOT RUN" start="2026-04-17T03:14:03.562357" elapsed="0.000021"/>
</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-04-17T03:14:02.933688" elapsed="0.628829">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:14:03.562742" level="FAIL">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:13:55.688793" elapsed="7.874060">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:14:03.563055" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:14:03.563106" level="INFO">${value} = Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/...</msg>
<var>${status}</var>
<var>${value}</var>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:13:55.688384" elapsed="7.874749"/>
</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-04-17T03:14:03.564399" level="INFO">[?2004l</msg>
<msg time="2026-04-17T03:14:03.564504" level="INFO">${output} = [?2004l</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-04-17T03:14:03.564159" elapsed="0.000371"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:03.565065" level="INFO">[?2004l</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:03.564680" elapsed="0.000434"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:14:03.565990" 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-04-17T03:14:03.565594" elapsed="0.000435"/>
</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-04-17T03:14:03.566192" elapsed="0.000353"/>
</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-04-17T03:14:03.565317" elapsed="0.001303"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:14:03.700486" level="INFO">^C[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:14:03.700866" level="INFO">${output} = ^C[?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:14:03.566770" elapsed="0.134129"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:03.701754" level="INFO">^C[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:03.701314" elapsed="0.000494"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:14:03.703998" 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-04-17T03:14:03.702654" elapsed="0.001410"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:14:03.705013" level="INFO">[?2004l[?2004h[jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:14:03.705109" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-188-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-04-17T03:14:03.704264" elapsed="0.000872"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:03.705789" level="INFO">[?2004l[?2004h[jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:03.705506" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:03.705221" elapsed="0.000653"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:03.705192" elapsed="0.000713"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-04-17T03:14:03.702161" elapsed="0.003809"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-04-17T03:14:03.563701" elapsed="0.142325"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:03.563272" elapsed="0.142784"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:03.563234" elapsed="0.142847"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="NOT RUN" start="2026-04-17T03:14:03.706278" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:03.706152" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:03.706134" elapsed="0.000215"/>
</if>
<var name="${idx}">2</var>
<status status="PASS" start="2026-04-17T03:13:55.676553" elapsed="8.029821"/>
</iter>
<var>${idx}</var>
<value>${connection_retries}</value>
<status status="PASS" start="2026-04-17T03:13:39.650239" elapsed="24.056174"/>
</for>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:14:03.706894" level="FAIL">Unable to connect ExaBgp to ODL</msg>
<arg>Unable to connect ExaBgp to ODL</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:14:03.706577" elapsed="0.000509">Unable to connect ExaBgp to ODL</status>
</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="FAIL" start="2026-04-17T03:13:39.648209" elapsed="24.059002">Unable to connect ExaBgp to ODL</status>
</kw>
<doc>Start exabgp and Verify BGP connection</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:13:39.583645" elapsed="24.123749">Unable to connect ExaBgp to ODL</status>
</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-04-17T03:14:03.711256" elapsed="0.000239"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:14:03.710977" 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-04-17T03:14:03.712957" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:03.712804" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:03.712781" elapsed="0.000253"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:03.718107" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:03.717998" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:03.717980" elapsed="0.000199"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:03.719200" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:14:03.718787" elapsed="0.000441"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:14:03.719687" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:14:03.719387" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:14:03.719756" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:14:03.719917" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:14:03.718411" elapsed="0.001545"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:03.725705" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:03.725595" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:03.725576" 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-04-17T03:14:03.726980" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:03.726845" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:03.726827" elapsed="0.000222"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:14:03.727503" level="INFO">${karaf_connection_index} = 32</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:14:03.727194" elapsed="0.000336"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:03.727919" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:14:03.727695" elapsed="0.000267"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:14:03.728866" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:14:03.728454" elapsed="0.001285">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:14:03.729962" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:14:03.730013" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:03.728121" elapsed="0.001917"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:14:03.730813" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:14:03.730560" elapsed="0.000945">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:14:03.731695" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:14:03.731743" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:03.730211" elapsed="0.001556"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:14:03.732724" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Inject_Ipv6_Route_1"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:14:03.732090" elapsed="0.000698">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Inject_Ipv6_Route_1"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:14:03.731842" elapsed="0.001017">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Inject_Ipv6_Route_1"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:14:03.731823" elapsed="0.001070">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Inject_Ipv6_Route_1"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:03.733118" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:03.733351" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:03.733211" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:03.733193" elapsed="0.000233"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:14:03.733459" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:14:03.736130" elapsed="0.000156"/>
</kw>
<msg time="2026-04-17T03:14:03.736355" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:03.735033" elapsed="0.001455"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:03.736769" elapsed="0.000080"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:03.737167" 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-04-17T03:14:03.734375" 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-04-17T03:14:03.733741" elapsed="0.003690"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:14:03.726544" elapsed="0.010974">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Inject_Ipv6_Route_1"</status>
</kw>
<msg time="2026-04-17T03:14:03.737625" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:14:03.737670" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Inject_Ipv6_Route_1"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:03.725939" elapsed="0.011755"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:14:03.737888" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:03.737772" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:03.737754" elapsed="0.000258"/>
</if>
<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-04-17T03:14:03.738832" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:03.738724" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:03.738707" elapsed="0.000193"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:03.739238" level="INFO">index=15
host=10.30.170.120
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-04-17T03:14:03.739346" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
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-04-17T03:14:03.739103" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:03.739793" level="INFO">{1: 32}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:03.739526" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:03.740271" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:03.740019" elapsed="0.000298"/>
</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-04-17T03:14:03.740842" elapsed="0.000370"/>
</kw>
<msg time="2026-04-17T03:14:03.741314" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:14:03.741360" level="INFO">${old_connection_index} = 32</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:03.740473" elapsed="0.000909"/>
</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-04-17T03:14:03.742293" elapsed="0.000201"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:14:03.743771" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:14:03.743152" elapsed="0.001562">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:03.742661" elapsed="0.002158"/>
</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-04-17T03:14:03.745556" elapsed="0.000290"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:03.745060" elapsed="0.000892"/>
</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-04-17T03:14:03.741678" elapsed="0.004326"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:03.741457" elapsed="0.004608"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:03.741439" elapsed="0.004653"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:14:03.747019" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:14:03.746676" elapsed="0.000373"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:14:03.747101" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:14:03.747311" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:14:03.746324" 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-04-17T03:14:03.747508" elapsed="0.000485"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:03.748297" level="INFO">index=33
host=10.30.170.120
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-04-17T03:14:03.748404" level="INFO">${karaf_connection_object} = index=33
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:14:03.748179" elapsed="0.000253"/>
</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-04-17T03:14:03.748596" elapsed="0.002620"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:14:03.751864" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:14:03.753321" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:14:03.751454" elapsed="0.002403">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:14:03.768593" elapsed="0.000671"/>
</kw>
<msg time="2026-04-17T03:14:03.769354" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:03.767327" elapsed="0.002177"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:03.769663" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:03.769825" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:14:03.755023" elapsed="0.014883"/>
</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-04-17T03:14:03.754279" elapsed="0.015690"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:14:03.738425" elapsed="0.031626">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:03.770399" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:14:03.770471" 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="FAIL" start="2026-04-17T03:14:03.725249" elapsed="0.045329">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:14:03.770690" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:14:03.770733" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:03.720339" elapsed="0.050417"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:03.771109" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:03.770838" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:03.770819" elapsed="0.000368"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:14:03.720197" elapsed="0.051015"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:14:03.720018" elapsed="0.051228"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:14:03.717618" elapsed="0.053686"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:14:03.712487" elapsed="0.058873"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:03.711811" elapsed="0.059595"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:14:03.708149" elapsed="0.063313"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:14:03.772355" 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-04-17T03:14:03.771668" elapsed="0.000753"/>
</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-04-17T03:14:03.809611" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:03.809172" elapsed="0.000469"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:03.810503" 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-04-17T03:14:03.810230" elapsed="0.000345">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-04-17T03:14:03.810671" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:03.809868" elapsed="0.000827"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:03.811263" 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-04-17T03:14:03.810858" elapsed="0.000432"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:14:03.811598" 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-04-17T03:14:03.811780" 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-04-17T03:14:03.811449" elapsed="0.000357"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:03.812225" 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-04-17T03:14:03.811977" 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-04-17T03:14:03.813263" 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-04-17T03:14:03.812976" elapsed="0.000333"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:14:03.813727" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:14:03.813465" elapsed="0.000287"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:03.814606" 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-04-17T03:14:03.814139" elapsed="0.000492"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:03.815370" 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-04-17T03:14:03.815149" elapsed="0.000247"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:03.815447" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:14:03.815629" 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-04-17T03:14:03.814817" 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-04-17T03:14:03.815806" elapsed="0.000260"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.12</var>
<status status="PASS" start="2026-04-17T03:14:03.814006" elapsed="0.002101"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:03.816781" 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-04-17T03:14:03.816485" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:03.868139" 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-04-17T03:14:03.867818" elapsed="0.000355"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:03.868240" elapsed="0.000045"/>
</return>
<msg time="2026-04-17T03:14:03.868417" 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-04-17T03:14:03.817018" elapsed="0.051424"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:03.868598" elapsed="0.000249"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:14:03.816220" elapsed="0.052668"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:03.869657" 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-04-17T03:14:03.869310" elapsed="0.000372"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:03.870465" 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-04-17T03:14:03.870251" elapsed="0.000240"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:03.870540" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:14:03.870690" 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-04-17T03:14:03.869898" elapsed="0.000817"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:03.870863" elapsed="0.000239"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:14:03.869171" elapsed="0.001971"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:03.871682" 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-04-17T03:14:03.871384" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:03.872432" 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-04-17T03:14:03.872221" elapsed="0.000236"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:03.872506" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:14:03.872657" 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-04-17T03:14:03.871890" elapsed="0.000790"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:03.872828" elapsed="0.000251"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:14:03.871254" elapsed="0.001865"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:03.873657" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:03.873361" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:03.874402" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:03.874192" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:03.874476" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:14:03.874626" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:03.873864" elapsed="0.000786"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:03.874796" elapsed="0.000237"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:03.873230" elapsed="0.001844"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:03.875607" 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-04-17T03:14:03.875312" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:03.876354" 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-04-17T03:14:03.876143" elapsed="0.000236"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:03.876428" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:14:03.876578" 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-04-17T03:14:03.875812" elapsed="0.000790"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:03.876748" elapsed="0.000237"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:14:03.875184" elapsed="0.001868"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:03.877752" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:03.877296" elapsed="0.000481"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:03.878504" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:03.878295" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:03.878578" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:14:03.878729" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:03.877979" 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-04-17T03:14:03.878900" elapsed="0.000249"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:03.877167" elapsed="0.002022"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:03.879772" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:03.879473" elapsed="0.000325"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:03.880525" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:03.880316" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:03.880600" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:14:03.880750" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:03.880000" 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-04-17T03:14:03.880938" elapsed="0.000241"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:03.879341" elapsed="0.001878"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:14:03.813806" elapsed="0.067448"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:14:03.881297" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:14:03.881461" 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-04-17T03:14:03.812642" elapsed="0.068845"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:03.812338" elapsed="0.069181"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:03.881698" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:03.881547" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:03.812318" elapsed="0.069454"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:14:03.882643" 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-04-17T03:14:03.881913" elapsed="0.000759"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:14:03.882720" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:14:03.808376" elapsed="0.074471"/>
</kw>
<msg time="2026-04-17T03:14:03.882901" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:03.795411" elapsed="0.087558"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:14:03.895728" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:03.911361" elapsed="0.000121"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:14:03.928837" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:03.929145" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:03.929506" 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-04-17T03:14:03.930147" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:03.929899" elapsed="0.000349"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:03.929870" elapsed="0.000412"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:03.930435" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:03.930606" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:03.930771" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:14:03.929813" elapsed="0.001013"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:14:03.929632" elapsed="0.001224"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:03.931023" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:03.931106" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:14:03.931278" 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-04-17T03:14:03.791055" elapsed="0.140253"/>
</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-04-17T03:14:03.958085" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:03.957630" elapsed="0.000498"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:03.959236" 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-04-17T03:14:03.958859" elapsed="0.000484">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-04-17T03:14:03.959474" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:03.958364" elapsed="0.001145"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:03.960135" 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-04-17T03:14:03.959713" elapsed="0.000450"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:14:03.960473" 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-04-17T03:14:03.960702" 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-04-17T03:14:03.960326" elapsed="0.000416"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:03.961344" 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-04-17T03:14:03.960978" elapsed="0.000455"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-17T03:14:03.962056" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:03.961548" elapsed="0.000671"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:14:03.962969" level="INFO">${mapping_to_use} = {'IP': '127.0.0.12', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': '...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:03.962475" elapsed="0.000540"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:03.962259" elapsed="0.000812"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:03.961512" elapsed="0.001596"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:14:03.964149" 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-04-17T03:14:03.963344" elapsed="0.000854"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:14:03.964280" elapsed="0.000060"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:14:03.956889" elapsed="0.007616"/>
</kw>
<msg time="2026-04-17T03:14:03.964602" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:03.943400" elapsed="0.021285"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:14:03.984282" 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/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-04-17T03:14:04.001667" 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_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-04-17T03:14:04.015431" elapsed="0.000042"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:04.015686" 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-04-17T03:14:04.015874" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:04.016373" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:04.016211" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:04.016192" 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-04-17T03:14:04.016603" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:04.016770" 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-04-17T03:14:04.016952" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:14:04.016150" elapsed="0.000857"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:14:04.015999" elapsed="0.001037"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:04.017233" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:04.017503" elapsed="0.000022"/>
</return>
<msg time="2026-04-17T03:14:04.017710" 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-04-17T03:14:03.942326" elapsed="0.075430"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:04.019756" 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-04-17T03:14:04.019341" elapsed="0.000521">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-04-17T03:14:04.020012" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:04.018748" elapsed="0.001300"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:04.020509" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:04.020148" elapsed="0.000441"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:14:04.021305" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:04.020827" elapsed="0.000513"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:04.020624" elapsed="0.000763"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:04.020122" elapsed="0.001296"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:04.024889" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:14:04.021628" elapsed="0.003322"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:14:04.025032" elapsed="0.000120"/>
</return>
<msg time="2026-04-17T03:14:04.025333" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:14:04.018253" elapsed="0.007106"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:04.027247" 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-04-17T03:14:04.026925" elapsed="0.000387"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:04.027809" 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-04-17T03:14:04.027519" elapsed="0.000349"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:04.028444" 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-04-17T03:14:04.028106" elapsed="0.000398"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:04.028984" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:04.028709" elapsed="0.000322"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:14:04.029895" 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-04-17T03:14:04.029686" elapsed="0.000235"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:14:04.030268" 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-04-17T03:14:04.030091" elapsed="0.000202"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:04.030441" elapsed="0.000218"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:04.031080" 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-04-17T03:14:04.030814" elapsed="0.000391"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:14:04.031249" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:14:04.031408" 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-04-17T03:14:04.029272" elapsed="0.002161"/>
</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-04-17T03:14:04.037015" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:14:04.238508" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:14:04.641353" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:14:04.644034" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:14:04.033900" elapsed="0.615725">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:14:04.031511" elapsed="0.618342">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:14:04.650419" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:04.649981" elapsed="0.000596"/>
</branch>
<status status="FAIL" start="2026-04-17T03:14:04.031491" elapsed="0.619141">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:14:04.651657" elapsed="0.000063"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:04.652020" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:04.651896" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:04.651855" 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-04-17T03:14:04.652499" elapsed="0.000048"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:14:04.652649" elapsed="0.000034"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>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="FAIL" start="2026-04-17T03:14:04.025839" elapsed="0.627062">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:04.653116" elapsed="0.000037"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>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="FAIL" start="2026-04-17T03:14:03.779307" elapsed="0.874028">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:04.654169" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:04.653761" elapsed="0.000479"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:04.653720" elapsed="0.000545"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:04.654299" elapsed="0.000016"/>
</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="FAIL" start="2026-04-17T03:14:03.772696" elapsed="0.881708">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Inject the Ipv6 route from controller</doc>
<status status="FAIL" start="2026-04-17T03:14:03.707651" elapsed="0.946948">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:14:04.658358" elapsed="0.000276"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:14:04.658079" 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-04-17T03:14:04.659813" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:04.659684" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:04.659663" elapsed="0.000222"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:04.665211" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:04.665088" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:04.665063" elapsed="0.000220"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:04.666498" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:14:04.666038" elapsed="0.000491"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:14:04.667038" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:14:04.666698" elapsed="0.000368"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:14:04.667113" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:14:04.667285" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:14:04.665569" elapsed="0.001742"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:04.673109" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:04.672982" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:04.672920" 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-04-17T03:14:04.674515" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:04.674405" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:04.674387" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:14:04.675064" level="INFO">${karaf_connection_index} = 33</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:14:04.674732" elapsed="0.000359"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:04.675482" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:14:04.675255" elapsed="0.000253"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:14:04.676474" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:14:04.676179" elapsed="0.001003">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:14:04.677379" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:14:04.677434" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:04.675668" elapsed="0.001820"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:14:04.678353" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:14:04.678101" elapsed="0.000939">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:14:04.679231" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:14:04.679278" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:04.677731" elapsed="0.001571"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:14:04.680305" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Check_Ipv6_Prefix_In_Bgp_Rib_1"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:14:04.679612" elapsed="0.000757">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Check_Ipv6_Prefix_In_Bgp_Rib_1"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:14:04.679379" elapsed="0.001069">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Check_Ipv6_Prefix_In_Bgp_Rib_1"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:14:04.679359" elapsed="0.001125">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Check_Ipv6_Prefix_In_Bgp_Rib_1"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:04.680649" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:04.680879" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:04.680738" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:04.680720" elapsed="0.000253"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:14:04.681007" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:14:04.683620" elapsed="0.000148"/>
</kw>
<msg time="2026-04-17T03:14:04.683838" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:04.682551" elapsed="0.001444"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:04.684277" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:04.684627" 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-04-17T03:14:04.681886" 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-04-17T03:14:04.681287" elapsed="0.003595"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:14:04.674097" elapsed="0.010888">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Check_Ipv6_Prefix_In_Bgp_Rib_1"</status>
</kw>
<msg time="2026-04-17T03:14:04.685092" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:14:04.685135" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Check_Ipv6_Prefix_In_Bgp_Rib_1"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:04.673343" elapsed="0.011816"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:14:04.685343" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:04.685235" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:04.685218" elapsed="0.000191"/>
</if>
<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-04-17T03:14:04.686247" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:04.686142" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:04.686125" elapsed="0.000190"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:04.686639" level="INFO">index=15
host=10.30.170.120
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-04-17T03:14:04.686747" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
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-04-17T03:14:04.686494" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:04.687275" level="INFO">{1: 33}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:04.687005" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:04.687746" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:04.687496" elapsed="0.000295"/>
</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-04-17T03:14:04.688333" elapsed="0.000274"/>
</kw>
<msg time="2026-04-17T03:14:04.688751" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:14:04.688798" level="INFO">${old_connection_index} = 33</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:04.687965" elapsed="0.000856"/>
</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-04-17T03:14:04.689713" elapsed="0.000386"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:14:04.691365" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:14:04.690831" elapsed="0.001430">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:04.690313" elapsed="0.002051"/>
</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-04-17T03:14:04.693027" elapsed="0.000280"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:04.692538" elapsed="0.000855"/>
</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-04-17T03:14:04.689138" elapsed="0.004326"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:04.688897" elapsed="0.004632"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:04.688879" elapsed="0.004679"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:14:04.694445" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:14:04.694119" elapsed="0.000357"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:14:04.694525" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:14:04.694680" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:14:04.693769" elapsed="0.000936"/>
</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-04-17T03:14:04.694861" elapsed="0.000440"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:04.695594" level="INFO">index=34
host=10.30.170.120
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-04-17T03:14:04.695695" level="INFO">${karaf_connection_object} = index=34
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:14:04.695484" elapsed="0.000238"/>
</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-04-17T03:14:04.695871" elapsed="0.002373"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:14:04.698683" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:14:04.700042" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:14:04.698417" elapsed="0.002057">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:14:04.715365" elapsed="0.000392"/>
</kw>
<msg time="2026-04-17T03:14:04.715859" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:04.714070" elapsed="0.001963"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:04.716201" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:04.716363" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:14:04.701432" elapsed="0.015015"/>
</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-04-17T03:14:04.700762" elapsed="0.015732"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:14:04.685828" elapsed="0.030754">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:04.717003" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:14:04.717081" elapsed="0.000076"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:14:04.672523" elapsed="0.044731">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:14:04.717366" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:14:04.717411" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:04.667719" elapsed="0.049715"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:04.717797" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:04.717538" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:04.717517" elapsed="0.000360"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:14:04.667570" elapsed="0.050331"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:14:04.667373" elapsed="0.050577"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:14:04.664589" elapsed="0.053421"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:14:04.659335" elapsed="0.058733"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:04.658850" elapsed="0.059264"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:14:04.655388" elapsed="0.062782"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:14:04.719112" level="INFO">&amp;{mapping} = { IP=10.30.170.120 | 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-04-17T03:14:04.718381" elapsed="0.000761"/>
</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-04-17T03:14:04.771279" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:04.770871" elapsed="0.000439"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:04.772088" 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-04-17T03:14:04.771805" elapsed="0.000358">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-04-17T03:14:04.772256" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:04.771476" elapsed="0.000805"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:04.772831" 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-04-17T03:14:04.772443" elapsed="0.000415"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:14:04.773176" 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-04-17T03:14:04.773345" 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-04-17T03:14:04.773034" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:04.773802" 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-04-17T03:14:04.773555" 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-04-17T03:14:04.774829" level="INFO">mapping: {'IP': '10.30.170.120', '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-04-17T03:14:04.774567" elapsed="0.000309"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:14:04.775321" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:14:04.775051" elapsed="0.000303"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:04.776139" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:04.775774" elapsed="0.000442"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:04.777125" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:04.776751" elapsed="0.000401"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:04.777206" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:14:04.777367" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:04.776409" 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-04-17T03:14:04.777624" elapsed="0.000322"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:14:04.775638" elapsed="0.002354"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:04.778729" 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-04-17T03:14:04.778242" elapsed="0.000513"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:04.779633" 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-04-17T03:14:04.779302" elapsed="0.000357"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:04.779709" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:14:04.779864" 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-04-17T03:14:04.778961" 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-04-17T03:14:04.780056" elapsed="0.000270"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:14:04.778109" elapsed="0.002260"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:04.780940" 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-04-17T03:14:04.780610" elapsed="0.000357"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:04.781833" 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-04-17T03:14:04.781484" elapsed="0.000374"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:04.781908" elapsed="0.000054"/>
</return>
<msg time="2026-04-17T03:14:04.782087" 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-04-17T03:14:04.781151" elapsed="0.000960"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:04.782265" elapsed="0.000267"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:14:04.780481" elapsed="0.002094"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:04.783152" 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-04-17T03:14:04.782816" elapsed="0.000362"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:04.784041" 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-04-17T03:14:04.783695" elapsed="0.000371"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:04.784116" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:14:04.784266" 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-04-17T03:14:04.783361" 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-04-17T03:14:04.784437" elapsed="0.000266"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:14:04.782687" elapsed="0.002058"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:04.785321" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:04.785001" elapsed="0.000346"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:04.786290" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:04.785900" elapsed="0.000416"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:04.786366" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:14:04.786518" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:04.785562" elapsed="0.000981"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:04.786693" elapsed="0.000285"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:04.784855" elapsed="0.002166"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:04.787580" 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-04-17T03:14:04.787264" elapsed="0.000342"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:04.788514" 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-04-17T03:14:04.788184" elapsed="0.000356"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:04.788590" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:14:04.788743" 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-04-17T03:14:04.787830" 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-04-17T03:14:04.788914" elapsed="0.000291"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:14:04.787134" elapsed="0.002112"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:04.789817" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:04.789487" elapsed="0.000356"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:04.790900" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:04.790571" elapsed="0.000370"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:04.790993" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:14:04.791147" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:04.790065" elapsed="0.001107"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:04.791320" elapsed="0.000268"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:04.789357" elapsed="0.002272"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:04.792206" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:04.791869" elapsed="0.000363"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:04.793094" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:04.792747" elapsed="0.000373"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:04.793170" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:14:04.793320" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:04.792414" 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-04-17T03:14:04.793493" elapsed="0.000324"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:04.791740" elapsed="0.002119"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:14:04.775437" elapsed="0.018456"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:14:04.793975" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:14:04.794140" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', '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-04-17T03:14:04.774239" elapsed="0.019927"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:04.773922" elapsed="0.020276"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:04.794369" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:04.794223" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:04.773901" elapsed="0.020544"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:14:04.795278" 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-04-17T03:14:04.794585" elapsed="0.000721"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:14:04.795354" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:14:04.770257" elapsed="0.025221"/>
</kw>
<msg time="2026-04-17T03:14:04.795531" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:04.757270" elapsed="0.038310"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:14:04.808328" elapsed="0.000190"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:14:04.821363" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/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-04-17T03:14:04.834194" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:04.834410" 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-04-17T03:14:04.834591" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:04.835004" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:04.834839" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:04.834822" 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-04-17T03:14:04.835228" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:04.835394" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:04.835560" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:14:04.834787" elapsed="0.000826"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:14:04.834671" elapsed="0.000968"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:04.835783" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:04.835860" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:14:04.836016" 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-04-17T03:14:04.752895" elapsed="0.083149"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:04.837445" 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-04-17T03:14:04.837122" elapsed="0.000416">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-04-17T03:14:04.837634" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:04.836723" elapsed="0.000936"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:04.838003" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:04.837728" elapsed="0.000332"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:14:04.838557" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:04.838261" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:04.838084" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:04.837711" elapsed="0.000978"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:04.841366" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:14:04.838845" elapsed="0.002548"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:14:04.841445" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:14:04.841692" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:14:04.836377" elapsed="0.005342"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:04.843025" 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-04-17T03:14:04.842756" elapsed="0.000334">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-04-17T03:14:04.843202" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:04.842418" elapsed="0.000814"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:14:04.843453" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-17T03:14:04.843317" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:04.843296" elapsed="0.000240"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:04.843681" 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-04-17T03:14:04.843860" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:14:04.843942" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:14:04.845943" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:14:04.842053" elapsed="0.003918"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:04.847389" 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-04-17T03:14:04.847128" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:04.847827" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:04.847585" 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-04-17T03:14:04.853048" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:05.054567" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:05.457279" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:05.460843" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:14:04.850116" elapsed="0.616893">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:14:04.847950" elapsed="0.619342">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:05.467966" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:05.467402" elapsed="0.000731"/>
</branch>
<status status="FAIL" start="2026-04-17T03:14:04.847917" elapsed="0.620282">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:05.469286" elapsed="0.000064"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:05.469784" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:05.469532" elapsed="0.000597"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:05.469487" elapsed="0.000691"/>
</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-04-17T03:14:05.470347" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:14:05.470422" 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-04-17T03:14:04.846284" elapsed="0.624268">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:05.470637" 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-04-17T03:14:04.729997" elapsed="0.740744">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:05.471066" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:05.470840" elapsed="0.000301"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:05.470822" elapsed="0.000343"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:05.471227" elapsed="0.000021"/>
</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="FAIL" start="2026-04-17T03:14:04.725476" elapsed="0.745871">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:07.529869" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:07.529415" elapsed="0.000499"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:07.530888" 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-04-17T03:14:07.530577" elapsed="0.000445">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-04-17T03:14:07.531128" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:07.530165" elapsed="0.000988"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:07.531732" 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-04-17T03:14:07.531325" elapsed="0.000435"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:14:07.532090" 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-04-17T03:14:07.532268" 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-04-17T03:14:07.531939" elapsed="0.000356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:07.532724" 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-04-17T03:14:07.532457" 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-04-17T03:14:07.533854" level="INFO">mapping: {'IP': '10.30.170.120', '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-04-17T03:14:07.533578" elapsed="0.000324"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:14:07.534481" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:14:07.534193" elapsed="0.000323"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:07.535369" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:07.534904" elapsed="0.000506"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:07.536384" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:07.536030" elapsed="0.000381"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:07.536467" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:14:07.536639" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:07.535648" elapsed="0.001016"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:07.536818" elapsed="0.000314"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:14:07.534767" elapsed="0.002408"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:07.537747" 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-04-17T03:14:07.537422" elapsed="0.000351"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:07.538857" 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-04-17T03:14:07.538521" elapsed="0.000363"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:07.538969" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:14:07.539129" 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-04-17T03:14:07.538169" elapsed="0.000985"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:07.539305" elapsed="0.000270"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:14:07.537291" elapsed="0.002326"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:07.540202" 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-04-17T03:14:07.539859" elapsed="0.000371"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:07.541119" 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-04-17T03:14:07.540759" elapsed="0.000386"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:07.541197" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:14:07.541349" 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-04-17T03:14:07.540416" 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-04-17T03:14:07.541524" elapsed="0.000268"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:14:07.539728" elapsed="0.002106"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:07.542419" 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-04-17T03:14:07.542095" elapsed="0.000351"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:07.543382" 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-04-17T03:14:07.543040" elapsed="0.000368"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:07.543459" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:14:07.543613" 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-04-17T03:14:07.542633" 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-04-17T03:14:07.543788" elapsed="0.000287"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:14:07.541963" elapsed="0.002154"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:07.544684" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:07.544362" elapsed="0.000349"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:07.545689" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:07.545330" elapsed="0.000385"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:07.545765" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:14:07.545916" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:07.544971" 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-04-17T03:14:07.546110" elapsed="0.000270"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:07.544227" elapsed="0.002249"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:07.547083" 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-04-17T03:14:07.546724" elapsed="0.000386"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:07.547993" 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-04-17T03:14:07.547639" elapsed="0.000381"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:07.548071" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:14:07.548223" 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-04-17T03:14:07.547301" 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-04-17T03:14:07.548537" elapsed="0.000275"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:14:07.546592" elapsed="0.002261"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:07.549464" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:07.549139" elapsed="0.000351"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:07.550369" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:07.550031" elapsed="0.000363"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:07.550444" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:14:07.550595" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:07.549676" 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-04-17T03:14:07.550768" elapsed="0.000508"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:07.549006" elapsed="0.002313"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:07.552013" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:07.551663" elapsed="0.000377"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:07.552901" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:07.552567" elapsed="0.000394"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:07.553014" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:14:07.553167" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:07.552227" elapsed="0.000965"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:07.553339" elapsed="0.000272"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:07.551431" elapsed="0.002222"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:14:07.534575" elapsed="0.019113"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:14:07.553732" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:14:07.553897" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', '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-04-17T03:14:07.533213" elapsed="0.020710"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:07.532862" elapsed="0.021110"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:07.554150" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:07.553999" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:07.532830" elapsed="0.021395"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:14:07.555131" 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-04-17T03:14:07.554372" elapsed="0.000788"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:14:07.555210" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:14:07.528759" elapsed="0.026577"/>
</kw>
<msg time="2026-04-17T03:14:07.555390" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:07.515388" elapsed="0.040053"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:14:07.568825" elapsed="0.000034"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/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-04-17T03:14:07.582403" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/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-04-17T03:14:07.595711" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:07.595955" 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-04-17T03:14:07.596145" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:07.596561" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:07.596403" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:07.596387" 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-04-17T03:14:07.596823" 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-04-17T03:14:07.597061" 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-04-17T03:14:07.597283" elapsed="0.000026"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:14:07.596349" elapsed="0.000995"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:14:07.596229" elapsed="0.001148"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:07.597570" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:07.597666" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:14:07.597825" 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-04-17T03:14:07.510666" elapsed="0.087185"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:07.599268" 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-04-17T03:14:07.598956" elapsed="0.000389">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-04-17T03:14:07.599441" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:07.598552" elapsed="0.000913"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:07.599793" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:07.599535" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:14:07.600457" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:07.600152" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:07.599874" elapsed="0.000647"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:07.599517" elapsed="0.001025"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:07.603405" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:14:07.600694" elapsed="0.002739"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:14:07.603491" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:14:07.603686" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:14:07.598201" elapsed="0.005519"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:07.605339" 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-04-17T03:14:07.605031" elapsed="0.000388">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-04-17T03:14:07.605538" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:07.604567" elapsed="0.001003"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:14:07.605834" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-04-17T03:14:07.605661" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:07.605638" elapsed="0.000321"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:07.606154" 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-04-17T03:14:07.606375" elapsed="0.000025"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:14:07.606456" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:14:07.608855" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:14:07.604140" elapsed="0.004749"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:07.610504" 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-04-17T03:14:07.610204" elapsed="0.000348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:07.611077" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:07.610752" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:14:07.616459" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:07.818249" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:08.220914" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:08.223334" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:14:07.613438" elapsed="0.615210">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:14:07.611218" elapsed="0.617580">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:08.229197" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:08.228859" elapsed="0.000440"/>
</branch>
<status status="FAIL" start="2026-04-17T03:14:07.611192" elapsed="0.618141">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:08.229967" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:08.230257" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:08.230199" elapsed="0.000126"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:08.230171" elapsed="0.000186"/>
</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-04-17T03:14:08.230565" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:14:08.230663" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:14:07.609299" elapsed="0.621522">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:08.230947" 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-04-17T03:14:07.486656" elapsed="0.744433">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:08.231495" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:08.231219" elapsed="0.000377"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:08.231197" elapsed="0.000432"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:08.231675" elapsed="0.000020"/>
</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="FAIL" start="2026-04-17T03:14:07.481951" elapsed="0.749860">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:10.296577" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:10.295985" elapsed="0.000638"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:10.297523" 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-04-17T03:14:10.297252" elapsed="0.000351">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-04-17T03:14:10.297703" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:10.296840" elapsed="0.000889"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:10.298324" 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-04-17T03:14:10.297901" elapsed="0.000451"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:14:10.298667" 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-04-17T03:14:10.298837" 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-04-17T03:14:10.298517" elapsed="0.000346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:10.299333" 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-04-17T03:14:10.299039" elapsed="0.000344"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:10.300686" level="INFO">mapping: {'IP': '10.30.170.120', '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-04-17T03:14:10.300299" elapsed="0.000437"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:14:10.301200" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:14:10.300900" elapsed="0.000326"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:10.302069" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:10.301626" elapsed="0.000472"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:10.303154" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:10.302726" elapsed="0.000460"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:10.303259" elapsed="0.000047"/>
</return>
<msg time="2026-04-17T03:14:10.303449" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:10.302328" elapsed="0.001147"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:10.303632" elapsed="0.000326"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:14:10.301484" elapsed="0.002518"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:10.304996" 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-04-17T03:14:10.304289" elapsed="0.000735"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:10.306019" 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-04-17T03:14:10.305624" elapsed="0.000423"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:10.306099" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:14:10.306284" 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-04-17T03:14:10.305230" elapsed="0.001080"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:10.306488" elapsed="0.000313"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:14:10.304147" elapsed="0.002709"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:10.307498" 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-04-17T03:14:10.307152" elapsed="0.000374"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:10.308543" 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-04-17T03:14:10.308140" elapsed="0.000430"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:10.308637" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:14:10.308835" 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-04-17T03:14:10.307726" elapsed="0.001136"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:10.309081" elapsed="0.000292"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:14:10.307013" elapsed="0.002416"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:10.310137" 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-04-17T03:14:10.309698" elapsed="0.000479"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:10.311348" 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-04-17T03:14:10.310903" elapsed="0.000479"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:10.311448" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:14:10.311644" 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-04-17T03:14:10.310449" elapsed="0.001225"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:10.311872" elapsed="0.000388"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:14:10.309554" elapsed="0.002752"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:10.313088" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:10.312647" elapsed="0.000469"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:10.314135" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:10.313761" elapsed="0.000402"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:10.314223" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:14:10.314394" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:10.313345" elapsed="0.001158"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:10.314664" elapsed="0.000364"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:10.312501" elapsed="0.002574"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:10.315775" 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-04-17T03:14:10.315362" elapsed="0.000453"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:10.316901" 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-04-17T03:14:10.316501" elapsed="0.000460"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:10.317017" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:14:10.317190" 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-04-17T03:14:10.316064" elapsed="0.001153"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:10.317376" elapsed="0.000328"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:14:10.315202" elapsed="0.002547"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:10.318365" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:10.318028" elapsed="0.000363"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:10.319583" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:10.319003" elapsed="0.000608"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:10.319682" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:14:10.319860" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:10.318629" 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-04-17T03:14:10.320058" elapsed="0.000283"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:10.317868" elapsed="0.002573"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:10.321113" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:10.320728" elapsed="0.000413"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:10.322096" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:10.321713" elapsed="0.000414"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:10.322181" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:14:10.322345" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:10.321339" elapsed="0.001032"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:10.322541" elapsed="0.000338"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:10.320590" elapsed="0.002334"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:14:10.301285" elapsed="0.021707"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:14:10.323041" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:14:10.323215" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', '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-04-17T03:14:10.299942" elapsed="0.023302"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:10.299476" elapsed="0.023802"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:10.323491" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:10.323312" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:10.299448" elapsed="0.024127"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:14:10.324580" 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-04-17T03:14:10.323746" elapsed="0.000864"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:14:10.324670" 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/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-04-17T03:14:10.295110" elapsed="0.029733"/>
</kw>
<msg time="2026-04-17T03:14:10.325033" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:10.279699" elapsed="0.045396"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:14:10.341540" elapsed="0.000069"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:14:10.354997" elapsed="0.000058"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:14:10.368969" elapsed="0.000062"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:10.369286" 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-04-17T03:14:10.369480" 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-04-17T03:14:10.369959" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:10.369787" elapsed="0.000232"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:10.369768" 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-04-17T03:14:10.370194" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:10.370362" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:10.370542" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:14:10.369726" elapsed="0.000873"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:14:10.369580" elapsed="0.001048"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:10.370776" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:10.370858" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:14:10.371045" 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-04-17T03:14:10.273244" elapsed="0.097830"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:10.372780" 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-04-17T03:14:10.372451" elapsed="0.000410">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-04-17T03:14:10.372984" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:10.371912" elapsed="0.001099"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:10.373518" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:10.373084" elapsed="0.000500"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:14:10.374148" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:10.373798" elapsed="0.000389"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:10.373610" elapsed="0.000617"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:10.373065" elapsed="0.001184"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:10.377210" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:14:10.374413" elapsed="0.002827"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:14:10.377300" elapsed="0.000045"/>
</return>
<msg time="2026-04-17T03:14:10.377507" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:14:10.371454" elapsed="0.006078"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:10.378875" 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-04-17T03:14:10.378604" elapsed="0.000359">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-04-17T03:14:10.379061" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:10.378244" elapsed="0.000841"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:14:10.379306" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:14:10.379159" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:10.379140" elapsed="0.000251"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:10.379536" 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-04-17T03:14:10.379706" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:14:10.379771" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:14:10.381851" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:14:10.377876" elapsed="0.004001"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:10.383398" 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-04-17T03:14:10.383128" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:10.384023" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:10.383756" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:14:10.390996" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:10.592824" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:10.995292" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:10.997792" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:14:10.387167" elapsed="0.616751">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:14:10.384134" elapsed="0.620059">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:11.004733" elapsed="0.000154"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:11.004287" elapsed="0.000789"/>
</branch>
<status status="FAIL" start="2026-04-17T03:14:10.384116" elapsed="0.621034">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:11.006041" elapsed="0.000044"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:11.006258" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:11.006198" elapsed="0.000122"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:11.006171" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:11.006558" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:14:11.006659" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:14:10.382225" elapsed="0.624598">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:11.007000" elapsed="0.000030"/>
</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-04-17T03:14:10.247200" elapsed="0.759967">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:11.007565" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:11.007303" elapsed="0.000364"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:11.007278" elapsed="0.000422"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:11.007746" elapsed="0.000020"/>
</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="FAIL" start="2026-04-17T03:14:10.242119" elapsed="0.765769">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:13.071374" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:13.070949" elapsed="0.000461"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:13.072262" 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-04-17T03:14:13.071998" elapsed="0.000343">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-04-17T03:14:13.072439" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:13.071583" elapsed="0.000885"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:13.073101" 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-04-17T03:14:13.072633" elapsed="0.000497"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:14:13.073441" 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-04-17T03:14:13.073618" 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-04-17T03:14:13.073294" elapsed="0.000350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:13.074112" 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-04-17T03:14:13.073804" elapsed="0.000356"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:13.075304" level="INFO">mapping: {'IP': '10.30.170.120', '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-04-17T03:14:13.074987" elapsed="0.000366"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:14:13.075797" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:14:13.075518" elapsed="0.000306"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:13.076639" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:13.076268" elapsed="0.000398"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:13.077604" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:13.077243" elapsed="0.000390"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:13.077705" elapsed="0.000050"/>
</return>
<msg time="2026-04-17T03:14:13.077974" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:13.076859" elapsed="0.001144"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:13.078161" elapsed="0.000328"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:14:13.076088" elapsed="0.002445"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:13.079295" 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-04-17T03:14:13.078780" elapsed="0.000542"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:13.080221" 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-04-17T03:14:13.079859" elapsed="0.000389"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:13.080298" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:14:13.080452" 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-04-17T03:14:13.079515" elapsed="0.000962"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:13.080629" elapsed="0.000276"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:14:13.078648" elapsed="0.002337"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:13.081694" 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-04-17T03:14:13.081255" elapsed="0.000474"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:13.082854" 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-04-17T03:14:13.082497" elapsed="0.000383"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:13.082963" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:14:13.083147" 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-04-17T03:14:13.082041" elapsed="0.001132"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:13.083324" elapsed="0.000282"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:14:13.081113" elapsed="0.002542"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:13.084246" 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-04-17T03:14:13.083903" elapsed="0.000369"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:13.085158" 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-04-17T03:14:13.084799" elapsed="0.000385"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:13.085242" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:14:13.085404" 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-04-17T03:14:13.084459" elapsed="0.000970"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:13.085581" elapsed="0.000298"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:14:13.083771" elapsed="0.002153"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:13.086526" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:13.086200" elapsed="0.000352"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:13.087511" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:13.087099" elapsed="0.000440"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:13.087589" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:14:13.087784" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:13.086739" 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-04-17T03:14:13.087978" elapsed="0.000330"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:13.086068" elapsed="0.002297"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:13.089005" 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-04-17T03:14:13.088655" elapsed="0.000377"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:13.089984" 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-04-17T03:14:13.089564" elapsed="0.000448"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:13.090065" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:14:13.090221" 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-04-17T03:14:13.089221" elapsed="0.001025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:13.090397" elapsed="0.000347"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:14:13.088517" elapsed="0.002274"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:13.091469" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:13.091120" elapsed="0.000375"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:13.092665" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:13.092318" elapsed="0.000374"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:13.092743" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:14:13.092897" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:13.091708" 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-04-17T03:14:13.093105" elapsed="0.000305"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:13.090917" elapsed="0.002536"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:13.094110" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:13.093699" elapsed="0.000437"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:13.095124" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:13.094718" elapsed="0.000433"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:13.095203" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:14:13.095358" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:13.094324" elapsed="0.001058"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:13.095534" elapsed="0.000363"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:13.093568" elapsed="0.002394"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:14:13.075880" elapsed="0.020119"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:14:13.096043" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:14:13.096244" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', '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-04-17T03:14:13.074621" elapsed="0.021651"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:13.074239" elapsed="0.022066"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:13.096480" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:13.096330" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:13.074216" elapsed="0.022341"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:14:13.097461" 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-04-17T03:14:13.096699" elapsed="0.000791"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:14:13.097548" 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/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-04-17T03:14:13.070266" elapsed="0.027421"/>
</kw>
<msg time="2026-04-17T03:14:13.097787" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:13.056451" elapsed="0.041423"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:14:13.111791" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib.vanadium/${file_name} exists. 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-04-17T03:14:13.125390" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:13.138705" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:13.138957" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:13.139145" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:13.139574" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:13.139374" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:13.139358" elapsed="0.000317"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:13.139821" 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-04-17T03:14:13.140003" 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-04-17T03:14:13.140172" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:14:13.139327" elapsed="0.000897"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:14:13.139222" elapsed="0.001029"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:13.140401" elapsed="0.000028"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:13.140506" elapsed="0.000024"/>
</return>
<msg time="2026-04-17T03:14:13.140672" 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-04-17T03:14:13.051871" elapsed="0.088833"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:13.142118" 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-04-17T03:14:13.141794" elapsed="0.000399">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-04-17T03:14:13.142288" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:13.141404" elapsed="0.000908"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:13.142698" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:13.142382" elapsed="0.000376"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:14:13.143278" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:13.142979" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:13.142783" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:13.142364" elapsed="0.000995"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:13.146227" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:14:13.143510" elapsed="0.002744"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:14:13.146308" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:14:13.146466" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:14:13.141061" elapsed="0.005430"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:13.147868" 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-04-17T03:14:13.147625" elapsed="0.000332">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-04-17T03:14:13.148076" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:13.147213" elapsed="0.000888"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:14:13.148313" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:14:13.148174" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:13.148156" elapsed="0.000243"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:13.148546" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:13.148717" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:14:13.148783" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:14:13.151145" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:14:13.146804" elapsed="0.004372"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:13.152644" 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-04-17T03:14:13.152387" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:13.153109" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:13.152842" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:14:13.158318" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:13.359990" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:13.762668" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:13.764726" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:14:13.155360" elapsed="0.613423">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:14:13.153219" elapsed="0.615730">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:13.769406" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:13.769012" elapsed="0.000531"/>
</branch>
<status status="FAIL" start="2026-04-17T03:14:13.153202" elapsed="0.616390">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:13.770566" elapsed="0.000052"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:13.770846" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:13.770767" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:13.770729" elapsed="0.000285"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:13.771299" elapsed="0.000036"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:14:13.771409" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:14:13.151504" elapsed="0.620089">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:13.771704" 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-04-17T03:14:13.026387" elapsed="0.745456">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:13.772273" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:13.772003" elapsed="0.000374"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:13.771978" elapsed="0.000435"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:13.772467" 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="FAIL" start="2026-04-17T03:14:13.019520" elapsed="0.753099">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:15.832138" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:15.831636" elapsed="0.000540"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:15.833113" 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-04-17T03:14:15.832818" elapsed="0.000378">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-04-17T03:14:15.833295" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:15.832364" elapsed="0.000956"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:15.833909" 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-04-17T03:14:15.833489" elapsed="0.000466"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:14:15.834269" 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-04-17T03:14:15.834444" 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-04-17T03:14:15.834122" elapsed="0.000348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:15.834949" 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-04-17T03:14:15.834653" elapsed="0.000348"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:15.836272" level="INFO">mapping: {'IP': '10.30.170.120', '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-04-17T03:14:15.835981" elapsed="0.000350"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:14:15.836839" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:14:15.836506" elapsed="0.000361"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:15.837716" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:15.837327" elapsed="0.000416"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:15.838679" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:15.838309" elapsed="0.000398"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:15.838763" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:14:15.838964" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:15.837959" elapsed="0.001034"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:15.839150" elapsed="0.000342"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:14:15.837185" elapsed="0.002372"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:15.840224" 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-04-17T03:14:15.839839" elapsed="0.000412"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:15.841442" 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-04-17T03:14:15.841095" elapsed="0.000374"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:15.841521" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:14:15.841678" 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-04-17T03:14:15.840635" 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-04-17T03:14:15.841853" elapsed="0.000295"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:14:15.839684" elapsed="0.002506"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:15.842770" 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-04-17T03:14:15.842437" elapsed="0.000362"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:15.843833" 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-04-17T03:14:15.843467" elapsed="0.000393"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:15.843911" elapsed="0.000064"/>
</return>
<msg time="2026-04-17T03:14:15.844104" 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-04-17T03:14:15.843021" elapsed="0.001109"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:15.844287" elapsed="0.000277"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:14:15.842304" elapsed="0.002302"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:15.845218" 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-04-17T03:14:15.844869" elapsed="0.000376"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:15.846130" 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-04-17T03:14:15.845774" elapsed="0.000382"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:15.846207" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:14:15.846364" 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-04-17T03:14:15.845431" 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-04-17T03:14:15.846538" elapsed="0.000275"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:14:15.844736" elapsed="0.002118"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:15.847507" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:15.847132" elapsed="0.000403"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:15.848437" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:15.848100" elapsed="0.000363"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:15.848514" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:14:15.848757" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:15.847723" elapsed="0.001065"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:15.848982" elapsed="0.000290"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:15.846998" elapsed="0.002317"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:15.849892" 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-04-17T03:14:15.849557" elapsed="0.000365"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:15.850821" 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-04-17T03:14:15.850488" elapsed="0.000360"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:15.850898" elapsed="0.000058"/>
</return>
<msg time="2026-04-17T03:14:15.851083" 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-04-17T03:14:15.850144" 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-04-17T03:14:15.851257" elapsed="0.000303"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:14:15.849426" elapsed="0.002176"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:15.852211" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:15.851846" elapsed="0.000392"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:15.853155" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:15.852769" elapsed="0.000413"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:15.853235" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:14:15.853389" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:15.852425" elapsed="0.000989"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:15.853567" elapsed="0.000512"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:15.851714" elapsed="0.002410"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:15.854737" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:15.854372" elapsed="0.000397"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:15.855776" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:15.855434" elapsed="0.000368"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:15.855853" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:14:15.856061" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:15.855028" elapsed="0.001059"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:15.856236" elapsed="0.000299"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:15.854238" elapsed="0.002340"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:14:15.836963" elapsed="0.019650"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:14:15.856659" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:14:15.856826" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', '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-04-17T03:14:15.835602" elapsed="0.021251"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:15.835086" elapsed="0.021800"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:15.857116" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:15.856953" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:15.835060" elapsed="0.022134"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:14:15.858087" 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-04-17T03:14:15.857339" elapsed="0.000776"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:14:15.858164" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib.vanadium/${file_name} exists. 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-04-17T03:14:15.830739" elapsed="0.027553"/>
</kw>
<msg time="2026-04-17T03:14:15.858393" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:15.816798" elapsed="0.041649"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:14:15.871453" elapsed="0.000033"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/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-04-17T03:14:15.884644" 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/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-04-17T03:14:15.898720" elapsed="0.000055"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:15.899043" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:15.899241" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:15.899734" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:15.899562" elapsed="0.000232"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:15.899544" 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-04-17T03:14:15.899989" 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-04-17T03:14:15.900159" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:15.900323" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:14:15.899500" elapsed="0.000876"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:14:15.899349" elapsed="0.001056"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:15.900553" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:15.900640" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:14:15.900817" 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-04-17T03:14:15.811653" elapsed="0.089193"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:15.902629" 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-04-17T03:14:15.902247" elapsed="0.000481">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-04-17T03:14:15.902852" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:15.901685" elapsed="0.001200"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:15.903480" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:15.902995" elapsed="0.000562"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:14:15.904159" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:15.903828" elapsed="0.000359"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:15.903589" elapsed="0.000634"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:15.902971" elapsed="0.001274"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:15.906966" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:14:15.904399" elapsed="0.002596"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:14:15.907051" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:14:15.907221" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:14:15.901231" elapsed="0.006015"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:15.908556" 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-04-17T03:14:15.908305" elapsed="0.000320">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-04-17T03:14:15.908721" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:15.907960" elapsed="0.000786"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:14:15.908976" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:14:15.908818" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:15.908800" elapsed="0.000263"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:15.909212" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:15.909386" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:14:15.909451" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:14:15.911488" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:14:15.907602" elapsed="0.003913"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:15.913148" 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-04-17T03:14:15.912872" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:15.913598" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:15.913347" 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-04-17T03:14:15.919115" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:16.120957" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:16.524108" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:16.526852" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:14:15.915862" elapsed="0.615158">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:14:15.913706" elapsed="0.617519">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:16.531858" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:16.531303" elapsed="0.000737"/>
</branch>
<status status="FAIL" start="2026-04-17T03:14:15.913688" elapsed="0.618403">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:16.533305" elapsed="0.000059"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:16.533638" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:16.533547" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:16.533501" elapsed="0.000280"/>
</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-04-17T03:14:16.534106" elapsed="0.000045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:14:16.534247" elapsed="0.000030"/>
</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-04-17T03:14:15.912044" elapsed="0.622469">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:16.534670" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:14:15.787605" elapsed="0.747277">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:16.535474" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:16.535106" elapsed="0.000503"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:16.535068" elapsed="0.000650"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:16.535789" elapsed="0.000030"/>
</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="FAIL" start="2026-04-17T03:14:15.782367" elapsed="0.753649">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:14:16.536259" level="FAIL">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 5 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-17T03:14:04.719326" elapsed="11.817150">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 5 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Check for the presence of Ipv6 Prefix in the BGP RIB</doc>
<status status="FAIL" start="2026-04-17T03:14:04.654840" elapsed="11.881982">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 5 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:14:16.542392" elapsed="0.000377"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:14:16.542030" 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-04-17T03:14:16.544360" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:16.544180" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:16.544148" elapsed="0.000302"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:16.551009" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:16.550817" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:16.550787" elapsed="0.000322"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:16.552714" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:14:16.552124" elapsed="0.000627"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:14:16.553490" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:14:16.553119" elapsed="0.000416"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:14:16.553605" elapsed="0.000063"/>
</return>
<msg time="2026-04-17T03:14:16.553864" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:14:16.551488" elapsed="0.002409"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:16.560622" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:16.560459" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:16.560428" elapsed="0.000291"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:16.562408" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:16.562284" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:16.562263" elapsed="0.000221"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:14:16.563036" level="INFO">${karaf_connection_index} = 34</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:14:16.562644" elapsed="0.000423"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:16.563524" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:14:16.563241" elapsed="0.000311"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:14:16.564514" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:14:16.564185" elapsed="0.001269">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:14:16.565668" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:14:16.565716" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:16.563775" elapsed="0.001965"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:14:16.566615" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:14:16.566340" elapsed="0.001003">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:14:16.567538" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:14:16.567585" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:16.565953" elapsed="0.001656"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:14:16.568643" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Injected_Ipv6_Routes_1"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:14:16.567976" elapsed="0.000928">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Injected_Ipv6_Routes_1"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:14:16.567718" elapsed="0.001287">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Injected_Ipv6_Routes_1"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:14:16.567691" elapsed="0.001354">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Injected_Ipv6_Routes_1"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:16.569240" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:16.569526" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:16.569332" elapsed="0.000258"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:16.569312" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:14:16.569654" elapsed="0.000018"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:14:16.572785" elapsed="0.000208"/>
</kw>
<msg time="2026-04-17T03:14:16.573083" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:16.571563" elapsed="0.001685"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:16.573610" elapsed="0.000083"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:16.574289" 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-04-17T03:14:16.570837" elapsed="0.003809"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:14:16.570035" elapsed="0.004715"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:14:16.561893" elapsed="0.012972">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Injected_Ipv6_Routes_1"</status>
</kw>
<msg time="2026-04-17T03:14:16.575071" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:14:16.575119" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Injected_Ipv6_Routes_1"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:16.560977" elapsed="0.014167"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:14:16.575416" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:16.575252" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:16.575223" elapsed="0.000315"/>
</if>
<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-04-17T03:14:16.577161" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:16.577039" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:16.577018" elapsed="0.000218"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:16.577695" level="INFO">index=15
host=10.30.170.120
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-04-17T03:14:16.577839" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
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-04-17T03:14:16.577447" elapsed="0.000420"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:16.578409" level="INFO">{1: 34}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:16.578054" elapsed="0.000402"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:16.578862" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:16.578615" elapsed="0.000291"/>
</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-04-17T03:14:16.579777" elapsed="0.000399"/>
</kw>
<msg time="2026-04-17T03:14:16.580289" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:14:16.580336" level="INFO">${old_connection_index} = 34</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:16.579224" elapsed="0.001134"/>
</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-04-17T03:14:16.581624" elapsed="0.000242"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:14:16.583325" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:14:16.582596" elapsed="0.001892">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:16.582089" elapsed="0.002511"/>
</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-04-17T03:14:16.585370" elapsed="0.000358"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:16.584788" elapsed="0.001030"/>
</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-04-17T03:14:16.580897" elapsed="0.004969"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:16.580448" elapsed="0.005470"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:16.580423" elapsed="0.005551"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:14:16.587028" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:14:16.586670" elapsed="0.000385"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:14:16.587109" elapsed="0.000048"/>
</return>
<msg time="2026-04-17T03:14:16.587289" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:14:16.586258" elapsed="0.001056"/>
</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-04-17T03:14:16.587478" elapsed="0.000604"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:16.588405" level="INFO">index=35
host=10.30.170.120
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-04-17T03:14:16.588511" level="INFO">${karaf_connection_object} = index=35
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:14:16.588262" elapsed="0.000397"/>
</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-04-17T03:14:16.588818" elapsed="0.002696"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:14:16.592042" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:14:16.593541" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:14:16.591733" elapsed="0.002471">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:14:16.610124" elapsed="0.000481"/>
</kw>
<msg time="2026-04-17T03:14:16.610744" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:16.608246" elapsed="0.002710"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:16.611135" elapsed="0.000025"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:16.611303" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:14:16.595377" elapsed="0.016025"/>
</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-04-17T03:14:16.594660" elapsed="0.016795"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:14:16.576638" elapsed="0.034944">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:16.612362" elapsed="0.000033"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:14:16.612454" elapsed="0.000032"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:14:16.559908" elapsed="0.052692">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:14:16.612748" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:14:16.612798" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:16.554380" elapsed="0.058443"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:16.613248" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:16.612947" elapsed="0.000372"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:16.612902" elapsed="0.000448"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:14:16.554223" elapsed="0.059155"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:14:16.554000" elapsed="0.059423"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:14:16.550158" elapsed="0.063339"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:14:16.543757" elapsed="0.069805"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:16.543074" elapsed="0.070540"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:14:16.538742" elapsed="0.074935"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:14:16.614866" 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-04-17T03:14:16.613996" elapsed="0.000901"/>
</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-04-17T03:14:16.665960" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:16.665412" elapsed="0.000594"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:16.667118" 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-04-17T03:14:16.666762" elapsed="0.000464">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-04-17T03:14:16.667328" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:16.666371" elapsed="0.000982"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:16.668002" 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-04-17T03:14:16.667523" elapsed="0.000509"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:14:16.668360" 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-04-17T03:14:16.668570" 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-04-17T03:14:16.668201" elapsed="0.000396"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:16.669040" 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-04-17T03:14:16.668760" elapsed="0.000328"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:16.670309" 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-04-17T03:14:16.670030" elapsed="0.000329"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:14:16.670819" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:14:16.670521" elapsed="0.000324"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:16.671618" 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-04-17T03:14:16.671298" elapsed="0.000348"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:16.672484" 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-04-17T03:14:16.672239" elapsed="0.000272"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:16.672572" elapsed="0.000047"/>
</return>
<msg time="2026-04-17T03:14:16.672764" 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-04-17T03:14:16.671885" 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-04-17T03:14:16.672967" elapsed="0.000275"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.12</var>
<status status="PASS" start="2026-04-17T03:14:16.671152" elapsed="0.002131"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:16.673851" 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-04-17T03:14:16.673539" elapsed="0.000338"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:16.674637" 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-04-17T03:14:16.674415" elapsed="0.000248"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:16.674712" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:14:16.674868" 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-04-17T03:14:16.674083" 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-04-17T03:14:16.675063" elapsed="0.000233"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:14:16.673406" elapsed="0.001931"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:16.675980" 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-04-17T03:14:16.675591" elapsed="0.000417"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:16.676745" 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-04-17T03:14:16.676522" elapsed="0.000248"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:16.676821" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:14:16.676997" 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-04-17T03:14:16.676195" elapsed="0.000828"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:16.677176" elapsed="0.000540"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:14:16.675452" elapsed="0.002308"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:16.678341" 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-04-17T03:14:16.678034" elapsed="0.000334"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:16.679114" 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-04-17T03:14:16.678883" elapsed="0.000257"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:16.679191" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:14:16.679347" 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-04-17T03:14:16.678562" elapsed="0.000810"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:16.679524" elapsed="0.000285"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:14:16.677881" elapsed="0.001973"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:16.680427" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:16.680122" elapsed="0.000331"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:16.681187" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:16.680971" elapsed="0.000241"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:16.681262" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:14:16.681414" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:16.680639" elapsed="0.000800"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:16.681590" elapsed="0.000225"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:16.679987" elapsed="0.001868"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:16.682472" 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-04-17T03:14:16.682119" elapsed="0.000388"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:16.683302" 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-04-17T03:14:16.683087" elapsed="0.000241"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:16.683389" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:14:16.683559" 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-04-17T03:14:16.682719" elapsed="0.000867"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:16.683779" elapsed="0.000257"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:14:16.681987" elapsed="0.002091"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:16.684632" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:16.684327" elapsed="0.000331"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:16.685401" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:16.685186" elapsed="0.000242"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:16.685478" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:14:16.685646" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:16.684843" elapsed="0.000833"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:16.685840" elapsed="0.000261"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:16.684192" elapsed="0.001951"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:16.686696" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:16.686392" elapsed="0.000330"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:16.687471" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:16.687257" elapsed="0.000240"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:16.687548" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:14:16.687702" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:16.686909" 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-04-17T03:14:16.687923" elapsed="0.000294"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:16.686258" elapsed="0.002001"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:14:16.670915" elapsed="0.017381"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:14:16.688342" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:14:16.688512" 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-04-17T03:14:16.669672" elapsed="0.018867"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:16.669195" elapsed="0.019378"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:16.688765" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:16.688606" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:16.669158" elapsed="0.019685"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:14:16.689839" 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-04-17T03:14:16.689012" elapsed="0.000856"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:14:16.689916" 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/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-04-17T03:14:16.664519" elapsed="0.025547"/>
</kw>
<msg time="2026-04-17T03:14:16.690129" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:16.650123" elapsed="0.040065"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:14:16.703437" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:16.716748" 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-04-17T03:14:16.730207" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:16.730449" 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-04-17T03:14:16.730641" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:16.731112" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:16.730948" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:16.730913" elapsed="0.000289"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:16.731348" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:16.731515" 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-04-17T03:14:16.731825" elapsed="0.000025"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:14:16.730870" elapsed="0.001017"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:14:16.730733" elapsed="0.001183"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:16.732092" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:16.732176" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:14:16.732354" 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-04-17T03:14:16.643786" elapsed="0.088598"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:16.733680" 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-04-17T03:14:16.733355" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:14:16.739285" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:14:16.941474" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:14:17.345306" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:14:17.348384" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:16.736007" elapsed="0.616135">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:14:16.733803" elapsed="0.618528">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:17.352824" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:17.352416" elapsed="0.000540"/>
</branch>
<status status="FAIL" start="2026-04-17T03:14:16.733786" elapsed="0.619208">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:14:17.353819" elapsed="0.000045"/>
</kw>
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:17.353968" elapsed="0.000037"/>
</return>
<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-04-17T03:14:16.732677" elapsed="0.621507">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:17.354434" elapsed="0.000027"/>
</return>
<arg>${BGP_VAR_FOLDER}/ipv6_route_injection</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="FAIL" start="2026-04-17T03:14:16.615181" elapsed="0.739433">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Fail If Exceptions Found During Test" owner="KarafKeywords">
<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="NOT RUN" start="2026-04-17T03:14:17.355340" elapsed="0.000041"/>
</kw>
<doc>Delete the injected IPV6 routes</doc>
<status status="FAIL" start="2026-04-17T03:14:16.537293" elapsed="0.818383">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:14:17.360872" elapsed="0.000430"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:14:17.360586" elapsed="0.000777"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:17.362557" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:17.362416" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:17.362393" 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-04-17T03:14:17.368027" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:17.367899" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:17.367881" elapsed="0.000254"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:17.369246" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:14:17.368798" elapsed="0.000483"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:14:17.369776" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:14:17.369442" elapsed="0.000368"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:14:17.369865" elapsed="0.000047"/>
</return>
<msg time="2026-04-17T03:14:17.370090" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:14:17.368389" elapsed="0.001729"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:17.376419" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:17.376286" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:17.376264" 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-04-17T03:14:17.378138" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:17.377960" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:17.377909" elapsed="0.000305"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:14:17.378754" level="INFO">${karaf_connection_index} = 35</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:14:17.378389" elapsed="0.000394"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:17.379236" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:14:17.378972" elapsed="0.000291"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:14:17.382915" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:14:17.379773" elapsed="0.003977">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:14:17.383985" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:14:17.384034" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:17.379426" elapsed="0.004635"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:14:17.385140" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:14:17.384722" elapsed="0.001274">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:14:17.386195" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:14:17.386243" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:17.384300" elapsed="0.002072"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:14:17.387434" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Bgp_Peer_Configuration_4"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:14:17.386731" elapsed="0.000767">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Bgp_Peer_Configuration_4"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:14:17.386473" elapsed="0.001103">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Bgp_Peer_Configuration_4"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:14:17.386445" elapsed="0.001170">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Bgp_Peer_Configuration_4"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:17.387785" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:17.388033" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:17.387875" elapsed="0.000244"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:17.387856" elapsed="0.000290"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:14:17.388184" elapsed="0.000019"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:14:17.391049" elapsed="0.000170"/>
</kw>
<msg time="2026-04-17T03:14:17.391297" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:17.389901" elapsed="0.001534"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:17.391718" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:17.392299" 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-04-17T03:14:17.389178" elapsed="0.003323"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:14:17.388540" elapsed="0.004030"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:14:17.377593" elapsed="0.015070">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Bgp_Peer_Configuration_4"</status>
</kw>
<msg time="2026-04-17T03:14:17.392776" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:14:17.392822" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Bgp_Peer_Configuration_4"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:17.376759" elapsed="0.016087"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:14:17.393064" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:17.392944" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:17.392906" elapsed="0.000226"/>
</if>
<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-04-17T03:14:17.394064" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:17.393951" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:17.393910" elapsed="0.000221"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:17.394449" level="INFO">index=15
host=10.30.170.120
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-04-17T03:14:17.394560" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
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-04-17T03:14:17.394295" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:17.395109" level="INFO">{1: 35}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:17.394740" elapsed="0.000416"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:17.395607" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:17.395331" elapsed="0.000321"/>
</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-04-17T03:14:17.396311" elapsed="0.000303"/>
</kw>
<msg time="2026-04-17T03:14:17.396717" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:14:17.396764" level="INFO">${old_connection_index} = 35</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:17.395812" elapsed="0.000977"/>
</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-04-17T03:14:17.397694" elapsed="0.000202"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:14:17.399230" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:14:17.398648" elapsed="0.001864">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:17.398157" elapsed="0.002459"/>
</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-04-17T03:14:17.401317" elapsed="0.000340"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:17.400800" elapsed="0.000945"/>
</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-04-17T03:14:17.397131" elapsed="0.004662"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:17.396881" elapsed="0.004964"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:17.396859" elapsed="0.005016"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:14:17.402834" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:14:17.402498" elapsed="0.000369"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:14:17.402978" elapsed="0.000056"/>
</return>
<msg time="2026-04-17T03:14:17.403201" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:14:17.402133" elapsed="0.001098"/>
</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-04-17T03:14:17.403438" elapsed="0.000483"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:17.404327" level="INFO">index=36
host=10.30.170.120
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-04-17T03:14:17.404431" level="INFO">${karaf_connection_object} = index=36
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:14:17.404187" elapsed="0.000270"/>
</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-04-17T03:14:17.404608" elapsed="0.002620"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:14:17.407710" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:14:17.409400" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:14:17.407416" elapsed="0.002534">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:14:17.426317" elapsed="0.000458"/>
</kw>
<msg time="2026-04-17T03:14:17.426945" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:17.424439" elapsed="0.002708"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:17.427328" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:17.427497" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:14:17.411304" elapsed="0.016290"/>
</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-04-17T03:14:17.410384" elapsed="0.017267"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:14:17.393613" elapsed="0.034149">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:17.428355" elapsed="0.000032"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:14:17.428446" elapsed="0.000032"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:14:17.375840" elapsed="0.052748">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:14:17.428727" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:14:17.428774" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:17.370550" elapsed="0.058249"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:17.429714" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:17.429393" elapsed="0.000377"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:17.429364" elapsed="0.000436"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:14:17.370397" elapsed="0.059433"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:14:17.370185" elapsed="0.059690"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:14:17.367524" elapsed="0.062454"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:14:17.362084" elapsed="0.067964"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:17.361564" elapsed="0.068537"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:14:17.357306" elapsed="0.072858"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:14:17.431295" 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-04-17T03:14:17.430430" elapsed="0.000896"/>
</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-04-17T03:14:17.483270" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_neighbor_rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:17.482788" elapsed="0.000524"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:17.484299" 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-04-17T03:14:17.483859" elapsed="0.000544">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-04-17T03:14:17.484505" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:17.483505" elapsed="0.001026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:17.485323" 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-04-17T03:14:17.484715" elapsed="0.000636"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:14:17.485692" 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-04-17T03:14:17.485988" 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-04-17T03:14:17.485521" elapsed="0.000507"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:17.486571" 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-04-17T03:14:17.486252" elapsed="0.000376"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:17.488178" 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-04-17T03:14:17.487807" elapsed="0.000422"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:14:17.488698" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:14:17.488398" elapsed="0.000326"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:17.489507" 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-04-17T03:14:17.489183" elapsed="0.000355"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:17.490421" 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-04-17T03:14:17.490154" elapsed="0.000295"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:17.490664" elapsed="0.000064"/>
</return>
<msg time="2026-04-17T03:14:17.490880" 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-04-17T03:14:17.489765" elapsed="0.001142"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:17.491093" elapsed="0.000275"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-04-17T03:14:17.489034" elapsed="0.002378"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:17.492042" 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-04-17T03:14:17.491691" elapsed="0.000378"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:17.492904" 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-04-17T03:14:17.492682" elapsed="0.000265"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:17.492999" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:14:17.493157" 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-04-17T03:14:17.492342" elapsed="0.000840"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:17.493375" elapsed="0.000770"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:14:17.491551" elapsed="0.002650"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:17.494863" 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-04-17T03:14:17.494539" elapsed="0.000351"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:17.495699" 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-04-17T03:14:17.495442" elapsed="0.000481"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:17.496013" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:14:17.496256" 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-04-17T03:14:17.495112" 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-04-17T03:14:17.496508" elapsed="0.000278"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:14:17.494358" elapsed="0.002472"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:17.497421" 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-04-17T03:14:17.497105" elapsed="0.000342"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:17.498211" 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-04-17T03:14:17.497989" elapsed="0.000248"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:17.498289" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:14:17.498447" 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-04-17T03:14:17.497638" elapsed="0.000833"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:17.498629" elapsed="0.000228"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:14:17.496966" elapsed="0.001933"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:17.499509" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:17.499191" elapsed="0.000344"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:17.500411" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:17.500100" elapsed="0.000339"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:17.500490" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:14:17.500650" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:17.499726" elapsed="0.000949"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:17.500831" elapsed="0.000253"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:17.499048" elapsed="0.002080"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:17.501692" 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-04-17T03:14:17.501379" elapsed="0.000342"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:17.502486" 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-04-17T03:14:17.502262" elapsed="0.000251"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:17.502564" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:14:17.502875" 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-04-17T03:14:17.501910" elapsed="0.000992"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:17.503080" elapsed="0.000233"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:14:17.501246" elapsed="0.002109"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:17.503915" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:17.503604" elapsed="0.000354"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:17.504735" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:17.504499" elapsed="0.000263"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:17.504813" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:14:17.504989" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:17.504170" 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-04-17T03:14:17.505168" elapsed="0.000226"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:17.503470" elapsed="0.001966"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:17.506007" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:17.505684" elapsed="0.000350"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:17.507032" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:17.506797" elapsed="0.000263"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:17.507111" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:14:17.507269" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:17.506474" elapsed="0.000821"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:17.507449" elapsed="0.000255"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:17.505552" elapsed="0.002203"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:14:17.488794" elapsed="0.019000"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:14:17.507849" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:14:17.508087" 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-04-17T03:14:17.487340" elapsed="0.020778"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:17.486759" elapsed="0.021439"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:17.508418" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:17.508245" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:17.486712" elapsed="0.021811"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:14:17.510029" 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-04-17T03:14:17.508690" elapsed="0.001382"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:14:17.510140" 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/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-04-17T03:14:17.482042" elapsed="0.028254"/>
</kw>
<msg time="2026-04-17T03:14:17.510365" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:17.466231" elapsed="0.044203"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:14:17.527104" elapsed="0.000128"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:14:17.544469" elapsed="0.000130"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:14:17.560602" elapsed="0.000154"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:17.561286" elapsed="0.000043"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:17.561585" 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-04-17T03:14:17.562425" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:17.562159" elapsed="0.000354"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:17.562126" elapsed="0.000439"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:17.562800" 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-04-17T03:14:17.563071" 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-04-17T03:14:17.563317" elapsed="0.000028"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:14:17.562043" elapsed="0.001349"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:14:17.561736" elapsed="0.001696"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:17.563657" elapsed="0.000034"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:17.563794" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:14:17.564163" 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-04-17T03:14:17.459588" elapsed="0.104668"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:17.566470" 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-04-17T03:14:17.565898" elapsed="0.000662"/>
</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-04-17T03:14:17.574722" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:14:17.777135" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:14:18.180005" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:14:18.183058" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:17.570215" elapsed="0.616946">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:14:17.566683" elapsed="0.620637">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:18.187702" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:18.187388" elapsed="0.000417"/>
</branch>
<status status="FAIL" start="2026-04-17T03:14:17.566647" elapsed="0.621197">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:14:18.189078" elapsed="0.000044"/>
</kw>
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:18.189204" elapsed="0.000031"/>
</return>
<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-04-17T03:14:17.564814" elapsed="0.624571">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:18.189486" elapsed="0.000025"/>
</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="FAIL" start="2026-04-17T03:14:17.431584" elapsed="0.758040">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="FAIL" start="2026-04-17T03:14:17.356370" elapsed="0.833483">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:14:18.195901" elapsed="0.000312"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:14:18.195610" 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-04-17T03:14:18.197637" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:18.197456" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:18.197424" elapsed="0.000317"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:18.203296" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:18.203159" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:18.203134" elapsed="0.000243"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:18.204639" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:14:18.204121" elapsed="0.000553"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:14:18.205213" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:14:18.204868" elapsed="0.000374"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:14:18.205368" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:14:18.205553" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:14:18.203660" elapsed="0.001924"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:18.211507" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:18.211394" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:18.211373" elapsed="0.000218"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:18.212900" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:18.212785" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:18.212767" elapsed="0.000231"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:14:18.213468" level="INFO">${karaf_connection_index} = 36</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:14:18.213152" elapsed="0.000344"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:18.213914" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:14:18.213679" elapsed="0.000281"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:14:18.214775" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:14:18.214480" elapsed="0.000991">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:14:18.215684" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:14:18.215734" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:18.214128" elapsed="0.001631"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:14:18.216627" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:14:18.216309" elapsed="0.001015">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:14:18.217520" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:14:18.217569" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:18.215952" elapsed="0.001643"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:14:18.218585" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Empty_4"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:14:18.217948" elapsed="0.000703">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Empty_4"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:14:18.217679" elapsed="0.001044">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Empty_4"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:14:18.217658" elapsed="0.001101">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Empty_4"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:18.218984" elapsed="0.000032"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:18.219276" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:18.219098" elapsed="0.000242"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:18.219076" elapsed="0.000290"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:14:18.219401" elapsed="0.000018"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:14:18.239189" elapsed="0.000167"/>
</kw>
<msg time="2026-04-17T03:14:18.239437" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:18.237965" elapsed="0.001617"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:18.239854" elapsed="0.000092"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:18.240209" 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-04-17T03:14:18.237282" elapsed="0.003113"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:14:18.236346" elapsed="0.004115"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:14:18.212408" elapsed="0.028169">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Empty_4"</status>
</kw>
<msg time="2026-04-17T03:14:18.240769" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:14:18.240816" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Empty_4"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:18.211749" elapsed="0.029092"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:14:18.241077" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:18.240951" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:18.240911" elapsed="0.000242"/>
</if>
<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-04-17T03:14:18.242320" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:18.242208" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:18.242190" elapsed="0.000201"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:18.242682" level="INFO">index=15
host=10.30.170.120
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-04-17T03:14:18.242791" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
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-04-17T03:14:18.242548" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:18.243271" level="INFO">{1: 36}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:18.242996" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:18.243717" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:18.243469" elapsed="0.000291"/>
</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-04-17T03:14:18.244310" elapsed="0.000321"/>
</kw>
<msg time="2026-04-17T03:14:18.244735" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:14:18.244784" level="INFO">${old_connection_index} = 36</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:18.243919" elapsed="0.000888"/>
</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-04-17T03:14:18.245645" elapsed="0.000201"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:14:18.247074" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:14:18.246523" elapsed="0.001551">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:18.246033" elapsed="0.002145"/>
</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-04-17T03:14:18.248892" elapsed="0.000320"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:18.248352" elapsed="0.000947"/>
</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-04-17T03:14:18.245123" elapsed="0.004225"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:18.244883" elapsed="0.004516"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:18.244864" elapsed="0.004561"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:14:18.250309" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:14:18.249986" elapsed="0.000350"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:14:18.250385" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:14:18.250543" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:14:18.249637" elapsed="0.000931"/>
</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-04-17T03:14:18.250725" elapsed="0.000446"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:18.251457" level="INFO">index=37
host=10.30.170.120
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-04-17T03:14:18.251563" level="INFO">${karaf_connection_object} = index=37
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:14:18.251344" elapsed="0.000247"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:18.251742" elapsed="0.002527"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:14:18.254772" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:14:18.257870" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:14:18.254490" elapsed="0.003807">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:14:18.273196" elapsed="0.000406"/>
</kw>
<msg time="2026-04-17T03:14:18.273727" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:18.271702" elapsed="0.002190"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:18.274080" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:18.274241" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:14:18.259171" elapsed="0.015151"/>
</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-04-17T03:14:18.258599" elapsed="0.015768"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:14:18.241845" elapsed="0.032620">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:18.274826" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:14:18.274900" 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="FAIL" start="2026-04-17T03:14:18.211020" elapsed="0.064181">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:14:18.275313" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:14:18.275357" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:18.206008" elapsed="0.069373"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:18.275716" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:18.275461" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:18.275443" elapsed="0.000350"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:14:18.205840" elapsed="0.069978"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:14:18.205648" elapsed="0.070205"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:14:18.202621" elapsed="0.073292"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:14:18.197081" elapsed="0.078908"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:18.196537" elapsed="0.079499"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:14:18.193019" elapsed="0.083074"/>
</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-04-17T03:14:18.365981" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:18.365333" elapsed="0.000688"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:18.366958" 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-04-17T03:14:18.366644" elapsed="0.000397">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-04-17T03:14:18.367143" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:18.366209" elapsed="0.000960"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:18.367877" 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-04-17T03:14:18.367448" elapsed="0.000459"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:14:18.368243" 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-04-17T03:14:18.368425" 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-04-17T03:14:18.368091" elapsed="0.000361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:18.368947" 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-04-17T03:14:18.368656" elapsed="0.000342"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:18.370183" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:18.369838" elapsed="0.000393"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:14:18.370767" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:14:18.370421" elapsed="0.000373"/>
</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-04-17T03:14:18.371231" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:18.371501" 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-04-17T03:14:18.371704" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:14:18.371087" elapsed="0.000686"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:14:18.370861" elapsed="0.000954"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:14:18.371873" elapsed="0.000072"/>
</return>
<msg time="2026-04-17T03:14:18.372109" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:14:18.369470" elapsed="0.002669"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:18.369087" elapsed="0.003096"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:18.372375" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:18.372217" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:18.369058" elapsed="0.003397"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:14:18.373221" 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-04-17T03:14:18.372668" elapsed="0.000583"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:14:18.373302" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:14:18.363965" elapsed="0.009471"/>
</kw>
<msg time="2026-04-17T03:14:18.373497" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:18.341771" elapsed="0.031788"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:14:18.387440" elapsed="0.000090"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:14:18.401359" elapsed="0.000062"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:14:18.415675" elapsed="0.000063"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:18.416001" 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-04-17T03:14:18.416189" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:18.416643" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:18.416468" elapsed="0.000232"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:18.416450" 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-04-17T03:14:18.416866" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:18.417050" 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-04-17T03:14:18.417217" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:14:18.416414" elapsed="0.000856"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:14:18.416276" elapsed="0.001021"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:18.417442" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:18.417523" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:14:18.417684" 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-04-17T03:14:18.335702" elapsed="0.082011"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:18.419186" 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-04-17T03:14:18.418873" elapsed="0.000389">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-04-17T03:14:18.419358" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:18.418471" elapsed="0.000912"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:18.419721" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:18.419454" elapsed="0.000324"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:14:18.420309" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:18.420007" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:18.419803" elapsed="0.000567"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:18.419435" elapsed="0.000956"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:18.422919" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:14:18.420541" elapsed="0.002420"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:14:18.423015" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:14:18.423183" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:14:18.418104" elapsed="0.005104"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:18.424492" 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-04-17T03:14:18.424231" elapsed="0.000331">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-04-17T03:14:18.424773" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:18.423871" elapsed="0.000927"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:14:18.425027" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:14:18.424870" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:18.424851" elapsed="0.000262"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:18.425258" 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-04-17T03:14:18.425428" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:14:18.425494" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:14:18.427675" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:14:18.423532" elapsed="0.004170"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:18.429360" 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-04-17T03:14:18.429074" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:18.429807" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:18.429561" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:14:18.434845" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:18.636330" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:19.038678" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:19.040656" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:14:18.432166" elapsed="0.611754">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:14:18.429922" elapsed="0.614178">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:19.044453" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:19.044159" elapsed="0.000384"/>
</branch>
<status status="FAIL" start="2026-04-17T03:14:18.429901" elapsed="0.614674">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:19.045216" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:19.045409" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:19.045358" elapsed="0.000112"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:19.045333" elapsed="0.000168"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:19.045703" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:14:19.045793" 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-04-17T03:14:18.428131" elapsed="0.617841">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:19.046161" 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-04-17T03:14:18.287971" elapsed="0.758332">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:19.046706" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:19.046434" elapsed="0.000378"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:19.046410" elapsed="0.000438"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:19.046897" elapsed="0.000022"/>
</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="FAIL" start="2026-04-17T03:14:18.281047" elapsed="0.766021">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:21.108162" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:21.107650" elapsed="0.000548"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:21.109045" 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-04-17T03:14:21.108755" elapsed="0.000369">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-04-17T03:14:21.109222" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:21.108379" elapsed="0.000868"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:21.109822" 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-04-17T03:14:21.109417" elapsed="0.000434"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:14:21.110212" 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-04-17T03:14:21.110383" 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-04-17T03:14:21.110054" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:21.110829" 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-04-17T03:14:21.110569" 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-04-17T03:14:21.112100" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:21.111708" elapsed="0.000440"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:14:21.112586" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:14:21.112310" 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-04-17T03:14:21.112983" 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-04-17T03:14:21.113207" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:21.113383" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:14:21.112817" elapsed="0.000623"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:14:21.112668" elapsed="0.000896"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:14:21.113644" elapsed="0.000052"/>
</return>
<msg time="2026-04-17T03:14:21.113874" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:14:21.111355" elapsed="0.002552"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:21.110983" elapsed="0.002982"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:21.114188" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:21.113994" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:21.110955" elapsed="0.003311"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:14:21.114975" 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-04-17T03:14:21.114412" elapsed="0.000604"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:14:21.115077" 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_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-04-17T03:14:21.106835" elapsed="0.008383"/>
</kw>
<msg time="2026-04-17T03:14:21.115276" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:21.093193" elapsed="0.022139"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:14:21.128973" elapsed="0.000067"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:14:21.143065" elapsed="0.000043"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:14:21.156277" elapsed="0.000043"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:21.156544" 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-04-17T03:14:21.156730" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:21.157172" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:21.157021" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:21.157003" 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-04-17T03:14:21.157400" 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-04-17T03:14:21.157564" 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-04-17T03:14:21.157726" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:14:21.156961" elapsed="0.000817"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:14:21.156813" elapsed="0.000993"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:21.157963" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:21.158153" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:14:21.158310" 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-04-17T03:14:21.088432" elapsed="0.069906"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:21.159783" 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-04-17T03:14:21.159490" elapsed="0.000369">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-04-17T03:14:21.159969" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:21.159097" 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-04-17T03:14:21.160325" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:21.160066" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:14:21.160877" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:21.160584" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:21.160406" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:21.160047" elapsed="0.000927"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:21.163423" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:14:21.161121" elapsed="0.002330"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:14:21.163504" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:14:21.163662" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:14:21.158718" elapsed="0.004968"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:21.164907" 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-04-17T03:14:21.164672" elapsed="0.000316">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-04-17T03:14:21.165084" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:21.164337" elapsed="0.000772"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:14:21.165315" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:14:21.165179" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:21.165161" 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-04-17T03:14:21.165544" 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-04-17T03:14:21.165711" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:14:21.165776" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:14:21.168435" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:14:21.164010" elapsed="0.004460"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:21.170012" 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-04-17T03:14:21.169717" elapsed="0.000395"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:21.170521" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:21.170270" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:14:21.175775" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:21.377370" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:21.779604" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:21.782159" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:14:21.172805" elapsed="0.615301">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:14:21.170632" elapsed="0.617678">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:21.788799" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:21.788403" elapsed="0.000554"/>
</branch>
<status status="FAIL" start="2026-04-17T03:14:21.170614" elapsed="0.618394">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:21.789754" elapsed="0.000054"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:21.790079" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:21.789985" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:21.789920" elapsed="0.000294"/>
</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-04-17T03:14:21.790525" elapsed="0.000045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:14:21.790666" elapsed="0.000035"/>
</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-04-17T03:14:21.168808" elapsed="0.622151">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:21.791115" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:14:21.064083" elapsed="0.727225">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:21.791851" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:21.791501" elapsed="0.000519"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:21.791465" elapsed="0.000601"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:21.792131" elapsed="0.000029"/>
</return>
<arg>${BGP_VAR_FOLDER}/ipv6_topology_empty</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-04-17T03:14:21.057112" elapsed="0.735218">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:23.872065" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:23.871568" elapsed="0.000535"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:23.872944" 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-04-17T03:14:23.872654" elapsed="0.000386">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-04-17T03:14:23.873141" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:23.872293" elapsed="0.000874"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:23.873736" 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-04-17T03:14:23.873339" elapsed="0.000425"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:14:23.874096" 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-04-17T03:14:23.874263" 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-04-17T03:14:23.873943" elapsed="0.000345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:23.874701" 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-04-17T03:14:23.874449" 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-04-17T03:14:23.876115" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:23.875762" elapsed="0.000402"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:14:23.876619" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:14:23.876328" elapsed="0.000317"/>
</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-04-17T03:14:23.877029" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:23.877263" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:23.877439" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:14:23.876870" elapsed="0.000636"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:14:23.876718" elapsed="0.000820"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:14:23.877586" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:14:23.877767" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:14:23.875295" elapsed="0.002501"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:23.874837" elapsed="0.002992"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:23.878043" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:23.877858" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:23.874809" elapsed="0.003313"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:14:23.878777" 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-04-17T03:14:23.878269" elapsed="0.000539"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:14:23.878856" 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/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-04-17T03:14:23.870482" elapsed="0.008536"/>
</kw>
<msg time="2026-04-17T03:14:23.879078" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:23.850614" elapsed="0.028521"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:14:23.896854" elapsed="0.000065"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:14:23.910462" elapsed="0.000061"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:14:23.924354" elapsed="0.000070"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:23.924681" 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-04-17T03:14:23.924901" elapsed="0.000038"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:23.925465" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:23.925266" elapsed="0.000280"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:23.925247" elapsed="0.000334"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:23.925740" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:23.925911" elapsed="0.000037"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:23.926098" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:14:23.925204" elapsed="0.000948"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:14:23.925011" elapsed="0.001169"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:23.926325" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:23.926406" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:14:23.926568" 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-04-17T03:14:23.843889" elapsed="0.082709"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:23.928268" 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-04-17T03:14:23.927892" elapsed="0.000457">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-04-17T03:14:23.928447" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:23.927397" elapsed="0.001075"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:23.928857" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:23.928544" elapsed="0.000577"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:14:23.929716" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:23.929395" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:23.929153" elapsed="0.000697"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:23.928525" elapsed="0.001359"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:23.932591" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:14:23.930085" elapsed="0.002537"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:14:23.932680" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:14:23.932854" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:14:23.927035" elapsed="0.005845"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:23.934278" 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-04-17T03:14:23.933976" elapsed="0.000375">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-04-17T03:14:23.934449" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:23.933598" elapsed="0.000876"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:14:23.934694" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:14:23.934548" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:23.934529" elapsed="0.000252"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:23.934970" 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-04-17T03:14:23.935172" elapsed="0.000023"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:14:23.935241" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:14:23.937642" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:14:23.933243" elapsed="0.004427"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:23.939349" 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-04-17T03:14:23.939037" elapsed="0.000360"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:23.939919" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:23.939625" elapsed="0.000358"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:14:23.946007" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:24.147606" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:24.550489" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:24.552603" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:14:23.942541" elapsed="0.613731">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:14:23.940062" elapsed="0.616423">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:24.556889" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:24.556563" elapsed="0.000458"/>
</branch>
<status status="FAIL" start="2026-04-17T03:14:23.940034" elapsed="0.617023">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:24.557744" elapsed="0.000049"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:24.558113" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:24.558053" elapsed="0.000136"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:24.558018" elapsed="0.000204"/>
</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-04-17T03:14:24.558437" elapsed="0.000039"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:14:24.558573" elapsed="0.000025"/>
</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-04-17T03:14:23.938044" elapsed="0.620702">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:24.558912" elapsed="0.000058"/>
</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-04-17T03:14:23.810178" elapsed="0.748950">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:24.559542" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:24.559272" elapsed="0.000409"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:24.559248" elapsed="0.000468"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:24.559764" elapsed="0.000023"/>
</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="FAIL" start="2026-04-17T03:14:23.799784" elapsed="0.760190">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:26.624217" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:26.623662" elapsed="0.000593"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:26.625288" 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-04-17T03:14:26.625002" elapsed="0.000372">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-04-17T03:14:26.625475" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:26.624472" elapsed="0.001029"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:26.626084" 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-04-17T03:14:26.625668" elapsed="0.000445"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:14:26.626425" 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-04-17T03:14:26.626613" 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-04-17T03:14:26.626276" elapsed="0.000364"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:26.627093" 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-04-17T03:14:26.626815" elapsed="0.000327"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:26.628470" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:26.628151" elapsed="0.000367"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:14:26.629053" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:14:26.628682" elapsed="0.000399"/>
</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-04-17T03:14:26.629428" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:26.629643" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:26.629829" elapsed="0.000029"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:14:26.629291" elapsed="0.000625"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:14:26.629140" elapsed="0.000830"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:14:26.630024" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:14:26.630209" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:14:26.627746" elapsed="0.002489"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:26.627310" elapsed="0.002958"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:26.630472" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:26.630294" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:26.627282" elapsed="0.003283"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:14:26.631307" 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-04-17T03:14:26.630711" elapsed="0.000629"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:14:26.631391" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:14:26.622740" elapsed="0.008790"/>
</kw>
<msg time="2026-04-17T03:14:26.631588" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:26.607156" elapsed="0.024483"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:14:26.644872" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:26.657867" 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-04-17T03:14:26.670724" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:26.670949" 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-04-17T03:14:26.671132" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:26.671583" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:26.671433" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:26.671417" 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-04-17T03:14:26.671809" 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-04-17T03:14:26.672024" 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-04-17T03:14:26.672213" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:14:26.671384" elapsed="0.000886"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:14:26.671273" elapsed="0.001025"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:26.672447" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:26.672526" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:14:26.672660" 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-04-17T03:14:26.602066" elapsed="0.070621"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:26.674104" 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-04-17T03:14:26.673816" elapsed="0.000364">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-04-17T03:14:26.674277" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:26.673448" elapsed="0.000854"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:26.674645" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:26.674373" elapsed="0.000332"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:14:26.675229" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:26.674910" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:26.674730" elapsed="0.000561"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:26.674355" elapsed="0.000958"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:26.677787" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:14:26.675461" elapsed="0.002354"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:14:26.677867" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:14:26.678047" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:14:26.673079" elapsed="0.004994"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:26.679346" 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-04-17T03:14:26.679106" elapsed="0.000306">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-04-17T03:14:26.679508" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:26.678714" elapsed="0.000819"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:14:26.679739" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:14:26.679603" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:26.679585" elapsed="0.000240"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:26.679992" elapsed="0.000024"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:26.680171" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:14:26.680280" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:14:26.682464" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:14:26.678386" elapsed="0.004105"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:26.683908" 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-04-17T03:14:26.683652" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:26.684378" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:26.684131" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:14:26.689622" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:26.891298" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:27.294153" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:27.296677" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:14:26.686698" elapsed="0.614121">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:14:26.684490" elapsed="0.616517">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:27.301439" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:27.301080" elapsed="0.000460"/>
</branch>
<status status="FAIL" start="2026-04-17T03:14:26.684471" elapsed="0.617103">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:27.302415" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:27.302614" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:27.302558" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:27.302532" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:27.302907" elapsed="0.000049"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:14:27.303024" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:14:26.682808" elapsed="0.620376">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:27.303289" 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-04-17T03:14:26.575259" elapsed="0.728166">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:27.303805" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:27.303555" elapsed="0.000481"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:27.303531" elapsed="0.000541"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:27.304120" elapsed="0.000020"/>
</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="FAIL" start="2026-04-17T03:14:26.566987" elapsed="0.737275">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:29.373323" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:29.372747" elapsed="0.000613"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:29.374241" 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-04-17T03:14:29.373963" elapsed="0.000419">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-04-17T03:14:29.374510" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:29.373543" elapsed="0.000999"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:29.375530" 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-04-17T03:14:29.374766" elapsed="0.000804"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:14:29.376014" 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-04-17T03:14:29.376246" 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-04-17T03:14:29.375791" elapsed="0.000496"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:29.376807" 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-04-17T03:14:29.376494" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:29.378163" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:29.377800" elapsed="0.000411"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:14:29.378796" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:14:29.378435" elapsed="0.000398"/>
</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-04-17T03:14:29.379258" elapsed="0.000025"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:29.379475" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:29.379681" elapsed="0.000030"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:14:29.379106" elapsed="0.000651"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:14:29.378906" elapsed="0.000893"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:14:29.379865" elapsed="0.000049"/>
</return>
<msg time="2026-04-17T03:14:29.380143" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:14:29.377449" elapsed="0.002730"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:29.376993" elapsed="0.003232"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:29.380463" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:29.380259" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:29.376956" elapsed="0.003616"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:14:29.381409" 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-04-17T03:14:29.380769" elapsed="0.000676"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:14:29.381578" 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-04-17T03:14:29.371623" elapsed="0.010130"/>
</kw>
<msg time="2026-04-17T03:14:29.381829" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:29.353531" elapsed="0.028369"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:14:29.399656" elapsed="0.000081"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:14:29.415260" elapsed="0.000050"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:14:29.429333" elapsed="0.000047"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:29.429607" 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-04-17T03:14:29.429794" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:29.430239" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:29.430086" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:29.430068" 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-04-17T03:14:29.430507" 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-04-17T03:14:29.430677" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:29.430872" elapsed="0.000028"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:14:29.430027" elapsed="0.000929"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:14:29.429879" elapsed="0.001113"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:29.431159" elapsed="0.000029"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:29.431266" elapsed="0.000027"/>
</return>
<msg time="2026-04-17T03:14:29.431484" 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-04-17T03:14:29.347155" elapsed="0.084370"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:29.433462" 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-04-17T03:14:29.433142" elapsed="0.000399">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-04-17T03:14:29.433638" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:29.432602" elapsed="0.001061"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:29.434025" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:29.433736" elapsed="0.000349"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:14:29.434625" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:29.434292" elapsed="0.000360"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:29.434110" elapsed="0.000578"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:29.433717" elapsed="0.000993"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:29.437443" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:14:29.434863" elapsed="0.002608"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:14:29.437524" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:14:29.437715" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:14:29.432036" elapsed="0.005712"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:29.439493" 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-04-17T03:14:29.439173" elapsed="0.000409">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-04-17T03:14:29.439706" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:29.438630" elapsed="0.001109"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:14:29.440036" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-04-17T03:14:29.439834" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:29.439811" elapsed="0.000345"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:29.440366" elapsed="0.000030"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:29.440604" elapsed="0.000027"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:14:29.440694" elapsed="0.000022"/>
</return>
<msg time="2026-04-17T03:14:29.443743" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:14:29.438164" elapsed="0.005616"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:29.445749" 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-04-17T03:14:29.445390" elapsed="0.000425"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:29.446323" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:29.446038" elapsed="0.000333"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:14:29.452986" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:29.654699" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:30.057483" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:30.060596" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:14:29.449333" elapsed="0.615921">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:14:29.446465" elapsed="0.619186">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:30.066120" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:30.065738" elapsed="0.000487"/>
</branch>
<status status="FAIL" start="2026-04-17T03:14:29.446444" elapsed="0.619817">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:30.067031" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:30.067273" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:30.067215" elapsed="0.000126"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:30.067185" elapsed="0.000186"/>
</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-04-17T03:14:30.067578" elapsed="0.000038"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:14:30.067690" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:14:29.444243" elapsed="0.623620">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:30.067997" 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-04-17T03:14:29.319832" elapsed="0.748311">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:30.068548" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:30.068283" elapsed="0.000383"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:30.068256" elapsed="0.000447"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:30.068750" elapsed="0.000022"/>
</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="FAIL" start="2026-04-17T03:14:29.311951" elapsed="0.756945">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:14:30.069094" level="FAIL">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 5 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-17T03:14:18.276519" elapsed="11.792732">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 5 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verifies that example-ipv6-topology is empty</doc>
<status status="FAIL" start="2026-04-17T03:14:18.276235" elapsed="11.793176">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 5 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verifies that example-ipv6-topology is empty after deconfiguring peer for the first time.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:14:18.192268" elapsed="11.877449">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 5 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:14:30.075959" elapsed="0.000298"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:14:30.075654" elapsed="0.000670"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:30.077453" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:30.077315" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:30.077290" 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-04-17T03:14:30.083541" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:30.083366" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:30.083334" elapsed="0.000320"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:30.084962" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:14:30.084450" elapsed="0.000545"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:14:30.085493" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:14:30.085166" elapsed="0.000354"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:14:30.085567" elapsed="0.000054"/>
</return>
<msg time="2026-04-17T03:14:30.085763" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:14:30.084036" elapsed="0.001752"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:30.091711" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:30.091565" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:30.091543" 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-04-17T03:14:30.093095" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:30.092985" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:30.092967" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:14:30.093658" level="INFO">${karaf_connection_index} = 37</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:14:30.093313" elapsed="0.000375"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:30.094101" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:14:30.093854" elapsed="0.000273"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:14:30.094993" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:14:30.094633" elapsed="0.001376">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:14:30.096205" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:14:30.096252" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:30.094287" elapsed="0.001989"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:14:30.097099" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:14:30.096823" elapsed="0.000957">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:14:30.097995" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:14:30.098042" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:30.096449" elapsed="0.001616"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:14:30.099099" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Reconfigure_ODL_To_Accept_Connections_5"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:14:30.098375" elapsed="0.000790">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Reconfigure_ODL_To_Accept_Connections_5"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:14:30.098146" elapsed="0.001097">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Reconfigure_ODL_To_Accept_Connections_5"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:14:30.098124" elapsed="0.001225">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Reconfigure_ODL_To_Accept_Connections_5"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:30.099519" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:30.099783" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:30.099614" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:30.099592" elapsed="0.000272"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:14:30.099899" elapsed="0.000018"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:14:30.102630" elapsed="0.000243"/>
</kw>
<msg time="2026-04-17T03:14:30.102981" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:30.101422" elapsed="0.001724"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:30.103471" elapsed="0.000096"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:30.103901" elapsed="0.000115"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:14:30.100778" elapsed="0.003374"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:14:30.100220" elapsed="0.003999"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:14:30.092648" elapsed="0.011663">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Reconfigure_ODL_To_Accept_Connections_5"</status>
</kw>
<msg time="2026-04-17T03:14:30.104422" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:14:30.104466" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Reconfigure_ODL_To_Accept_Connections_5"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:30.091973" elapsed="0.012517"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:14:30.104688" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:30.104574" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:30.104553" elapsed="0.000205"/>
</if>
<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-04-17T03:14:30.105621" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:30.105516" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:30.105497" elapsed="0.000190"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:30.106074" level="INFO">index=15
host=10.30.170.120
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-04-17T03:14:30.106185" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
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-04-17T03:14:30.105840" elapsed="0.000372"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:30.106644" level="INFO">{1: 37}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:30.106365" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:30.107137" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:30.106874" elapsed="0.000308"/>
</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-04-17T03:14:30.107731" elapsed="0.000302"/>
</kw>
<msg time="2026-04-17T03:14:30.108137" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:14:30.108183" level="INFO">${old_connection_index} = 37</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:30.107342" elapsed="0.000863"/>
</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-04-17T03:14:30.109036" elapsed="0.000197"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:14:30.110401" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:14:30.109873" elapsed="0.001796">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:30.109399" elapsed="0.002381"/>
</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-04-17T03:14:30.112466" elapsed="0.000302"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:30.111982" elapsed="0.000888"/>
</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-04-17T03:14:30.108507" elapsed="0.004525"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:30.108283" elapsed="0.004817"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:30.108264" elapsed="0.004864"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:14:30.114105" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:14:30.113703" elapsed="0.000430"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:14:30.114185" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:14:30.114362" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:14:30.113351" elapsed="0.001043"/>
</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-04-17T03:14:30.114593" elapsed="0.000572"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:30.115508" level="INFO">index=38
host=10.30.170.120
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-04-17T03:14:30.115632" level="INFO">${karaf_connection_object} = index=38
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:14:30.115373" elapsed="0.000293"/>
</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-04-17T03:14:30.115823" elapsed="0.002501"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:14:30.118817" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:14:30.120044" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:14:30.118494" elapsed="0.001952">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:14:30.135804" elapsed="0.000540"/>
</kw>
<msg time="2026-04-17T03:14:30.136478" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:30.134207" elapsed="0.002474"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:30.136881" elapsed="0.000027"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:30.137111" elapsed="0.000027"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:14:30.121343" elapsed="0.015882"/>
</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-04-17T03:14:30.120775" elapsed="0.016517"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:14:30.105202" elapsed="0.032223">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:30.138099" elapsed="0.000038"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:14:30.138208" 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="FAIL" start="2026-04-17T03:14:30.091183" elapsed="0.047194">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:14:30.138537" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:14:30.138592" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:30.086236" elapsed="0.052388"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:30.139065" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:30.138722" elapsed="0.000400"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:30.138698" elapsed="0.000450"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:14:30.086086" elapsed="0.053088"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:14:30.085859" elapsed="0.053352"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:14:30.082746" elapsed="0.056529"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:14:30.076995" elapsed="0.062417"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:30.076484" elapsed="0.062979"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:14:30.071103" elapsed="0.068419"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:14:30.140515" 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-04-17T03:14:30.139768" elapsed="0.000776"/>
</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-04-17T03:14:30.177762" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:30.177234" elapsed="0.000566"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:30.178842" 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-04-17T03:14:30.178461" elapsed="0.000499">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-04-17T03:14:30.179073" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:30.178004" elapsed="0.001118"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:30.179776" 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-04-17T03:14:30.179329" elapsed="0.000475"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:14:30.180137" 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-04-17T03:14:30.180503" 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-04-17T03:14:30.179987" elapsed="0.000543"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:30.181036" 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-04-17T03:14:30.180699" elapsed="0.000397"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:30.182414" 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-04-17T03:14:30.182134" elapsed="0.000327"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:14:30.183041" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:14:30.182636" elapsed="0.000434"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:30.183786" 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-04-17T03:14:30.183478" elapsed="0.000334"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:30.184618" 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-04-17T03:14:30.184386" elapsed="0.000257"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:30.184699" elapsed="0.000047"/>
</return>
<msg time="2026-04-17T03:14:30.184879" 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-04-17T03:14:30.184045" elapsed="0.000858"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:30.185078" elapsed="0.000279"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-04-17T03:14:30.183337" elapsed="0.002063"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:30.185982" 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-04-17T03:14:30.185650" elapsed="0.000358"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:30.187130" 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-04-17T03:14:30.186891" elapsed="0.000265"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:30.187207" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:14:30.187363" 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-04-17T03:14:30.186275" elapsed="0.001113"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:30.187539" elapsed="0.000225"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:14:30.185517" elapsed="0.002289"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:30.188371" 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-04-17T03:14:30.188068" elapsed="0.000329"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:30.189172" 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-04-17T03:14:30.188920" elapsed="0.000279"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:30.189249" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:14:30.189416" 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-04-17T03:14:30.188586" elapsed="0.000858"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:30.189607" elapsed="0.000230"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:14:30.187920" elapsed="0.001959"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:30.190444" 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-04-17T03:14:30.190141" elapsed="0.000328"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:30.191246" 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-04-17T03:14:30.191030" elapsed="0.000241"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:30.191320" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:14:30.191472" 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-04-17T03:14:30.190655" elapsed="0.000841"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:30.191644" elapsed="0.000221"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:14:30.190008" elapsed="0.001898"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:30.192467" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:30.192166" elapsed="0.000326"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:30.193276" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:30.193057" elapsed="0.000245"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:30.193352" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:14:30.193505" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:30.192677" 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-04-17T03:14:30.193678" elapsed="0.000224"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:30.192037" elapsed="0.001923"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:30.194534" 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-04-17T03:14:30.194230" elapsed="0.000330"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:30.195360" 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-04-17T03:14:30.195138" elapsed="0.000248"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:30.195436" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:14:30.195590" 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-04-17T03:14:30.194747" elapsed="0.000868"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:30.195779" elapsed="0.000250"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:14:30.194096" elapsed="0.001975"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:30.196618" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:30.196316" elapsed="0.000327"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:30.197477" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:30.197255" elapsed="0.000248"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:30.197554" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:14:30.197710" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:30.196832" elapsed="0.000903"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:30.197884" elapsed="0.000499"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:30.196184" elapsed="0.002242"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:30.199053" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:30.198673" elapsed="0.000405"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:30.199800" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:30.199589" elapsed="0.000236"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:30.199877" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:14:30.200048" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:30.199271" elapsed="0.000801"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:30.200223" elapsed="0.000224"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:30.198541" elapsed="0.001948"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:14:30.183135" elapsed="0.017391"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:14:30.200571" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:14:30.200736" 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-04-17T03:14:30.181692" elapsed="0.019070"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:30.181211" elapsed="0.019585"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:30.201014" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:30.200828" elapsed="0.000244"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:30.181172" elapsed="0.019921"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:14:30.202031" 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-04-17T03:14:30.201244" elapsed="0.000817"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:14:30.202110" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:14:30.176272" elapsed="0.026162"/>
</kw>
<msg time="2026-04-17T03:14:30.202493" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:30.162454" elapsed="0.040097"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:14:30.216841" elapsed="0.000122"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:14:30.233365" elapsed="0.000064"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:14:30.246408" elapsed="0.000037"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:30.246666" 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-04-17T03:14:30.246893" 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-04-17T03:14:30.247374" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:30.247212" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:30.247193" 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-04-17T03:14:30.247617" 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-04-17T03:14:30.247786" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:30.247967" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:14:30.247150" elapsed="0.000880"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:14:30.247011" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:30.248217" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:30.248299" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:14:30.248500" 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-04-17T03:14:30.157779" elapsed="0.090754"/>
</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-04-17T03:14:30.276884" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:30.276352" elapsed="0.000596"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:30.277906" 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-04-17T03:14:30.277603" elapsed="0.000406">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-04-17T03:14:30.278115" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:30.277171" elapsed="0.000969"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:30.278710" 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-04-17T03:14:30.278306" elapsed="0.000431"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:14:30.279268" 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-04-17T03:14:30.279476" 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-04-17T03:14:30.279103" elapsed="0.000403"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:30.279952" 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-04-17T03:14:30.279674" elapsed="0.000432"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-17T03:14:30.280595" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:30.280201" elapsed="0.000455"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:14:30.281179" level="INFO">${mapping_to_use} = {'IP': '127.0.0.1', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'e...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:30.280833" elapsed="0.000377"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:30.280686" elapsed="0.000567"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:30.280170" elapsed="0.001110"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:14:30.282337" 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-04-17T03:14:30.281462" elapsed="0.000909"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:14:30.282426" 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/bgp_peer.vanadium/${file_name} exists. 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-04-17T03:14:30.275476" elapsed="0.007104"/>
</kw>
<msg time="2026-04-17T03:14:30.282643" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:30.261812" elapsed="0.020887"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:14:30.295844" elapsed="0.000066"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:14:30.309133" elapsed="0.000056"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:14:30.322175" elapsed="0.000051"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:30.322475" 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-04-17T03:14:30.322663" 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-04-17T03:14:30.323181" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:30.323027" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:30.323008" 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-04-17T03:14:30.323407" elapsed="0.000019"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:30.323586" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:30.323750" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:14:30.322962" elapsed="0.000841"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:14:30.322752" elapsed="0.001079"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:30.324115" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:30.324200" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:14:30.324382" 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-04-17T03:14:30.258994" elapsed="0.065419"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:30.325918" 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-04-17T03:14:30.325608" elapsed="0.000411">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-04-17T03:14:30.326115" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:30.325178" elapsed="0.000961"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:30.326476" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:30.326211" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:14:30.327073" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:30.326741" elapsed="0.000358"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:30.326557" elapsed="0.000577"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:30.326193" elapsed="0.000962"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:30.329841" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:14:30.327305" elapsed="0.002565"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:14:30.329951" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:14:30.330129" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:14:30.324792" elapsed="0.005362"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:30.331696" 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-04-17T03:14:30.331416" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:30.332160" 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-04-17T03:14:30.331896" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:30.332615" 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-04-17T03:14:30.332370" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:30.333061" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:30.332804" elapsed="0.000299"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:14:30.333922" 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-04-17T03:14:30.333717" elapsed="0.000246"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:14:30.334317" 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-04-17T03:14:30.334142" 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-04-17T03:14:30.334583" elapsed="0.000217"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:30.335264" 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-04-17T03:14:30.335001" elapsed="0.000307"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:14:30.335352" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:14:30.335522" 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-04-17T03:14:30.333307" elapsed="0.002239"/>
</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-04-17T03:14:30.341203" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:14:30.543451" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:14:30.946199" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:14:30.949270" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:14:30.337834" elapsed="0.616019">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:14:30.335629" elapsed="0.618575">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:30.954783" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:30.954308" elapsed="0.000726"/>
</branch>
<status status="FAIL" start="2026-04-17T03:14:30.335606" elapsed="0.619499">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:30.956154" elapsed="0.000063"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:30.956463" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:30.956377" elapsed="0.000184"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:30.956336" elapsed="0.000272"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:30.956958" elapsed="0.000049"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:14:30.957111" elapsed="0.000031"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:14:30.330521" elapsed="0.626843">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:30.957679" elapsed="0.000038"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:14:30.146452" elapsed="0.811456">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:30.958600" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:30.958186" elapsed="0.000560"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:30.958148" elapsed="0.000651"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:30.958870" elapsed="0.000036"/>
</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="FAIL" start="2026-04-17T03:14:30.140837" elapsed="0.818401">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Configure BGP peer modules with initiate-connection set to false with short ipv6 address.</doc>
<status status="FAIL" start="2026-04-17T03:14:30.070092" elapsed="0.889528">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:14:30.966123" elapsed="0.000400"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:14:30.965668" elapsed="0.000956"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:30.968293" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:30.968141" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:30.968111" elapsed="0.000263"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:30.974489" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:30.974325" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:30.974301" elapsed="0.000291"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:30.976116" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:14:30.975555" elapsed="0.000599"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:14:30.976706" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:14:30.976347" elapsed="0.000386"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:14:30.976779" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:14:30.977001" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:14:30.975026" elapsed="0.002002"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:30.983144" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:30.982996" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:30.982966" elapsed="0.000315"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:30.984846" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:30.984709" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:30.984686" elapsed="0.000277"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:14:30.985476" level="INFO">${karaf_connection_index} = 38</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:14:30.985135" elapsed="0.000372"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:30.986043" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:14:30.985725" elapsed="0.000353"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:14:30.987380" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:14:30.986792" elapsed="0.001381">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:14:30.988380" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:14:30.988428" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:30.986367" elapsed="0.002085"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:14:30.989285" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:14:30.989021" elapsed="0.000963">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:14:30.990175" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:14:30.990223" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:30.988632" elapsed="0.001614"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:14:30.991290" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Inject_Ipv6_Route_2"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:14:30.990582" elapsed="0.000773">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Inject_Ipv6_Route_2"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:14:30.990335" elapsed="0.001095">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Inject_Ipv6_Route_2"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:14:30.990311" elapsed="0.001154">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Inject_Ipv6_Route_2"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:30.991637" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:30.991871" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:30.991729" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:30.991710" elapsed="0.000256"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:14:30.992003" elapsed="0.000021"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:14:30.994863" elapsed="0.000204"/>
</kw>
<msg time="2026-04-17T03:14:30.995149" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:30.993632" elapsed="0.001705"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:30.995617" elapsed="0.000081"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:30.995974" 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-04-17T03:14:30.992974" elapsed="0.003192"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:14:30.992348" elapsed="0.003884"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:14:30.984332" elapsed="0.011998">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Inject_Ipv6_Route_2"</status>
</kw>
<msg time="2026-04-17T03:14:30.996445" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:14:30.996489" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Inject_Ipv6_Route_2"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:30.983493" elapsed="0.013019"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:14:30.996733" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:30.996606" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:30.996580" elapsed="0.000227"/>
</if>
<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-04-17T03:14:30.997716" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:30.997609" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:30.997590" elapsed="0.000192"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:30.998170" level="INFO">index=15
host=10.30.170.120
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-04-17T03:14:30.998281" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
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-04-17T03:14:30.998022" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:30.998867" level="INFO">{1: 38}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:30.998535" elapsed="0.000484"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:30.999609" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:30.999332" elapsed="0.000329"/>
</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-04-17T03:14:31.000424" elapsed="0.000377"/>
</kw>
<msg time="2026-04-17T03:14:31.000961" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:14:31.001030" level="INFO">${old_connection_index} = 38</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:30.999861" elapsed="0.001202"/>
</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-04-17T03:14:31.002401" elapsed="0.000289"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:14:31.004624" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:14:31.004008" elapsed="0.002080">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:31.002956" elapsed="0.003282"/>
</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-04-17T03:14:31.007222" elapsed="0.000411"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:31.006504" elapsed="0.001247"/>
</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-04-17T03:14:31.001501" elapsed="0.006318"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:31.001178" elapsed="0.006708"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:31.001148" elapsed="0.006808"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:14:31.009330" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:14:31.008833" elapsed="0.000540"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:14:31.009444" elapsed="0.000058"/>
</return>
<msg time="2026-04-17T03:14:31.009688" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:14:31.008302" elapsed="0.001421"/>
</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-04-17T03:14:31.009980" elapsed="0.000600"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:31.011007" level="INFO">index=39
host=10.30.170.120
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-04-17T03:14:31.011150" level="INFO">${karaf_connection_object} = index=39
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:14:31.010821" elapsed="0.000367"/>
</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-04-17T03:14:31.011528" elapsed="0.003527"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:14:31.015889" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:14:31.017502" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:14:31.015435" elapsed="0.002829">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:14:31.037153" elapsed="0.000546"/>
</kw>
<msg time="2026-04-17T03:14:31.037841" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:31.034975" elapsed="0.003097"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:31.038300" elapsed="0.000041"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:31.038537" elapsed="0.000031"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:14:31.019534" elapsed="0.019130"/>
</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-04-17T03:14:31.018750" elapsed="0.019986"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:14:30.997287" elapsed="0.041699">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:31.039609" elapsed="0.000037"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:14:31.039715" 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="FAIL" start="2026-04-17T03:14:30.982455" elapsed="0.057428">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:14:31.040451" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:14:31.040517" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:30.977453" elapsed="0.063098"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:31.041080" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:31.040673" elapsed="0.000485"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:31.040641" elapsed="0.000554"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:14:30.977303" elapsed="0.063928"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:14:30.977097" elapsed="0.064183"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:14:30.973727" elapsed="0.067642"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:14:30.967704" elapsed="0.073742"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:30.966855" elapsed="0.074657"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:14:30.961511" elapsed="0.080080"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:14:31.042925" 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-04-17T03:14:31.041900" elapsed="0.001088"/>
</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-04-17T03:14:31.092847" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:31.092287" elapsed="0.000598"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:31.093863" 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-04-17T03:14:31.093503" elapsed="0.000466">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-04-17T03:14:31.094081" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:31.093088" elapsed="0.001028"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:31.094737" 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-04-17T03:14:31.094303" elapsed="0.000462"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:14:31.095171" 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-04-17T03:14:31.095433" 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-04-17T03:14:31.094975" elapsed="0.000486"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:31.095970" 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-04-17T03:14:31.095631" elapsed="0.000388"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:31.097564" 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-04-17T03:14:31.097209" elapsed="0.000417"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:14:31.098247" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:14:31.097850" elapsed="0.000431"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:31.099280" 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-04-17T03:14:31.098808" elapsed="0.000508"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:31.100277" 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-04-17T03:14:31.100042" elapsed="0.000262"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:31.100358" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:14:31.100535" 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-04-17T03:14:31.099594" 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-04-17T03:14:31.100714" elapsed="0.000304"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.12</var>
<status status="PASS" start="2026-04-17T03:14:31.098622" elapsed="0.002440"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:31.101674" 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-04-17T03:14:31.101343" elapsed="0.000358"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:31.104588" 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-04-17T03:14:31.104342" elapsed="0.000284"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:31.104696" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:14:31.104871" 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-04-17T03:14:31.101897" elapsed="0.002999"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:31.105068" elapsed="0.000274"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:14:31.101193" elapsed="0.004192"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:31.106055" 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-04-17T03:14:31.105655" elapsed="0.000428"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:31.106857" 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-04-17T03:14:31.106612" elapsed="0.000274"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:31.106952" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:14:31.107112" 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-04-17T03:14:31.106289" elapsed="0.000848"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:31.107304" elapsed="0.000230"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:14:31.105501" elapsed="0.002085"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:31.108254" 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-04-17T03:14:31.107851" elapsed="0.000437"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:31.109056" 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-04-17T03:14:31.108816" elapsed="0.000266"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:31.109135" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:14:31.109323" 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-04-17T03:14:31.108480" 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-04-17T03:14:31.109530" elapsed="0.000234"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:14:31.107715" elapsed="0.002091"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:31.110458" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:31.110068" elapsed="0.000417"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:31.111389" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:31.111088" elapsed="0.000338"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:31.111600" elapsed="0.000045"/>
</return>
<msg time="2026-04-17T03:14:31.111812" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:31.110706" elapsed="0.001142"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:31.112082" elapsed="0.000313"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:31.109919" elapsed="0.002533"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:31.113187" 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-04-17T03:14:31.112780" elapsed="0.000443"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:31.114248" 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-04-17T03:14:31.113954" elapsed="0.000330"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:31.114353" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:14:31.114563" 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-04-17T03:14:31.113482" 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-04-17T03:14:31.114806" elapsed="0.000323"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:14:31.112601" elapsed="0.002583"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:31.116060" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:31.115587" elapsed="0.000511"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:31.117169" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:31.116835" elapsed="0.000371"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:31.117277" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:14:31.117495" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:31.116377" elapsed="0.001155"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:31.117741" elapsed="0.000674"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:31.115399" elapsed="0.003070"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:31.119238" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:31.118809" elapsed="0.000546"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:31.120443" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:31.120140" elapsed="0.000339"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:31.120550" elapsed="0.000053"/>
</return>
<msg time="2026-04-17T03:14:31.120780" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:31.119642" elapsed="0.001174"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:31.121046" elapsed="0.000323"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:31.118626" elapsed="0.002797"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:14:31.098356" elapsed="0.023118"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:14:31.121539" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:14:31.121761" 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-04-17T03:14:31.096730" elapsed="0.025068"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:31.096245" elapsed="0.025598"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:31.122128" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:31.121887" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:31.096209" elapsed="0.026026"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:14:31.123547" 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-04-17T03:14:31.122446" elapsed="0.001144"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:14:31.123659" elapsed="0.000045"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:14:31.091264" elapsed="0.032578"/>
</kw>
<msg time="2026-04-17T03:14:31.124079" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:31.074619" elapsed="0.049535"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:14:31.140288" elapsed="0.000087"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:14:31.155082" elapsed="0.000068"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:14:31.168139" elapsed="0.000062"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:31.168449" 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-04-17T03:14:31.168637" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:31.169103" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:31.168947" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:31.168912" 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-04-17T03:14:31.169330" 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-04-17T03:14:31.169497" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:31.169661" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:14:31.168872" elapsed="0.000841"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:14:31.168724" elapsed="0.001016"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:31.169884" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:31.169979" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:14:31.170148" 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-04-17T03:14:31.069545" elapsed="0.100632"/>
</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-04-17T03:14:31.197092" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:31.196616" elapsed="0.000511"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:31.197921" 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-04-17T03:14:31.197658" elapsed="0.000466">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-04-17T03:14:31.198223" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:31.197307" elapsed="0.000942"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:31.198812" 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-04-17T03:14:31.198416" elapsed="0.000424"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:14:31.199162" 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-04-17T03:14:31.199367" 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-04-17T03:14:31.199016" elapsed="0.000387"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:31.199816" 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-04-17T03:14:31.199563" elapsed="0.000334"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-17T03:14:31.200369" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:31.200002" elapsed="0.000426"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:14:31.200905" level="INFO">${mapping_to_use} = {'IP': '127.0.0.12', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': '...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:31.200600" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:31.200456" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:31.199976" elapsed="0.001033"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:14:31.201846" 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-04-17T03:14:31.201154" elapsed="0.000722"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:14:31.201943" 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_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-04-17T03:14:31.195765" elapsed="0.006319"/>
</kw>
<msg time="2026-04-17T03:14:31.202143" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:31.181831" elapsed="0.020362"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:14:31.214916" elapsed="0.000042"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:14:31.227655" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_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-04-17T03:14:31.240502" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:31.240720" 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-04-17T03:14:31.240901" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:31.241349" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:31.241170" elapsed="0.000243"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:31.241153" 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-04-17T03:14:31.241585" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:31.241753" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:31.241915" elapsed="0.000037"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:14:31.241116" elapsed="0.000870"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:14:31.240998" elapsed="0.001017"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:31.242159" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:31.242237" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:14:31.242403" 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-04-17T03:14:31.180863" elapsed="0.061570"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:31.243961" 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-04-17T03:14:31.243602" elapsed="0.000439">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-04-17T03:14:31.244137" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:31.243159" elapsed="0.001002"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:31.244493" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:31.244231" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:14:31.245068" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:31.244755" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:31.244574" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:31.244212" elapsed="0.000937"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:31.247875" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:14:31.245297" elapsed="0.002606"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:14:31.247973" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:14:31.248138" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:14:31.242780" elapsed="0.005383"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:31.249752" 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-04-17T03:14:31.249493" elapsed="0.000369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:31.250281" 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-04-17T03:14:31.250034" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:31.250730" 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-04-17T03:14:31.250486" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:31.251180" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:31.250920" elapsed="0.000302"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:14:31.252101" 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-04-17T03:14:31.251865" elapsed="0.000262"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:14:31.252457" 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-04-17T03:14:31.252283" 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-04-17T03:14:31.252632" elapsed="0.000213"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:31.253266" 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-04-17T03:14:31.253015" elapsed="0.000294"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:14:31.253352" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:14:31.253512" 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-04-17T03:14:31.251451" elapsed="0.002086"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:14:31.260603" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:14:31.463077" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:14:31.866616" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:14:31.870073" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:14:31.256486" elapsed="0.618021">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:14:31.253612" elapsed="0.621103">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:14:31.875263" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:31.874799" elapsed="0.000605"/>
</branch>
<status status="FAIL" start="2026-04-17T03:14:31.253593" elapsed="0.621851">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:14:31.876305" elapsed="0.000046"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:31.876696" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:31.876629" elapsed="0.000140"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:31.876596" 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-04-17T03:14:31.877113" elapsed="0.000049"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:14:31.877254" elapsed="0.000031"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>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="FAIL" start="2026-04-17T03:14:31.248513" elapsed="0.628986">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:31.877674" elapsed="0.000036"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>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="FAIL" start="2026-04-17T03:14:31.050468" elapsed="0.827423">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:31.878580" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:31.878170" elapsed="0.000562"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:31.878132" elapsed="0.000659"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:31.878864" elapsed="0.000032"/>
</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="FAIL" start="2026-04-17T03:14:31.043432" elapsed="0.835684">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Inject the Ipv6 route from controller</doc>
<status status="FAIL" start="2026-04-17T03:14:30.960516" elapsed="0.918937">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:14:31.885512" elapsed="0.000346"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:14:31.885212" elapsed="0.000730"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:31.887170" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:31.886998" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:31.886967" elapsed="0.000283"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:31.892903" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:31.892737" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:31.892710" elapsed="0.000310"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:31.894308" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:14:31.893770" elapsed="0.000571"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:14:31.894843" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:14:31.894513" elapsed="0.000358"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:14:31.894918" elapsed="0.000063"/>
</return>
<msg time="2026-04-17T03:14:31.895121" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:14:31.893344" elapsed="0.001960"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:31.901443" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:31.901272" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:31.901239" elapsed="0.000327"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:31.903170" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:31.903055" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:31.903036" elapsed="0.000206"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:14:31.903802" level="INFO">${karaf_connection_index} = 39</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:14:31.903401" elapsed="0.000433"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:31.904269" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:14:31.904027" elapsed="0.000270"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:14:31.905861" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:14:31.905017" elapsed="0.001765">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:14:31.907051" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:14:31.907100" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:31.904507" elapsed="0.002617"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:14:31.908289" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:14:31.907910" elapsed="0.001213">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:14:31.909338" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:14:31.909388" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:31.907364" elapsed="0.002050"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:14:31.910665" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Check_Ipv6_Prefix_In_Bgp_Rib_2"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:14:31.909859" elapsed="0.000880">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Check_Ipv6_Prefix_In_Bgp_Rib_2"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:14:31.909540" elapsed="0.001281">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Check_Ipv6_Prefix_In_Bgp_Rib_2"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:14:31.909497" elapsed="0.001365">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Check_Ipv6_Prefix_In_Bgp_Rib_2"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:31.911060" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:31.911298" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:31.911156" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:31.911134" elapsed="0.000241"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:14:31.911420" elapsed="0.000022"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:14:31.914656" elapsed="0.000218"/>
</kw>
<msg time="2026-04-17T03:14:31.914971" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:31.913379" elapsed="0.001737"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:31.915398" elapsed="0.000080"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:31.915821" 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-04-17T03:14:31.912607" elapsed="0.003596"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:14:31.911882" elapsed="0.004390"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:14:31.902690" elapsed="0.013677">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Check_Ipv6_Prefix_In_Bgp_Rib_2"</status>
</kw>
<msg time="2026-04-17T03:14:31.916602" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:14:31.916648" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Check_Ipv6_Prefix_In_Bgp_Rib_2"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:31.901833" elapsed="0.014840"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:14:31.916896" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:31.916768" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:31.916743" elapsed="0.000247"/>
</if>
<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-04-17T03:14:31.917941" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:31.917817" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:31.917800" elapsed="0.000212"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:31.918343" level="INFO">index=15
host=10.30.170.120
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-04-17T03:14:31.918456" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
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-04-17T03:14:31.918177" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:31.918940" level="INFO">{1: 39}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:31.918635" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:31.919378" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:31.919136" elapsed="0.000286"/>
</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-04-17T03:14:31.920117" elapsed="0.000287"/>
</kw>
<msg time="2026-04-17T03:14:31.920503" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:14:31.920549" level="INFO">${old_connection_index} = 39</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:31.919585" elapsed="0.000987"/>
</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-04-17T03:14:31.921414" elapsed="0.000194"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:14:31.922999" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:14:31.922264" elapsed="0.002018">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:31.921772" elapsed="0.002613"/>
</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-04-17T03:14:31.925040" elapsed="0.000288"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:31.924559" elapsed="0.000853"/>
</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-04-17T03:14:31.920872" elapsed="0.004585"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:31.920648" elapsed="0.004857"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:31.920628" elapsed="0.004905"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:14:31.926466" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:14:31.926146" elapsed="0.000349"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:14:31.926545" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:14:31.926712" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:14:31.925768" elapsed="0.000969"/>
</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-04-17T03:14:31.926896" elapsed="0.000482"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:31.927674" level="INFO">index=40
host=10.30.170.120
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-04-17T03:14:31.927808" level="INFO">${karaf_connection_object} = index=40
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:14:31.927549" elapsed="0.000286"/>
</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-04-17T03:14:31.928003" elapsed="0.002667"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:14:31.931350" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:14:31.933428" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:14:31.930918" elapsed="0.003376">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:14:31.957573" elapsed="0.000737"/>
</kw>
<msg time="2026-04-17T03:14:31.958470" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:31.954465" elapsed="0.004262"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:31.959065" elapsed="0.000043"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:31.959336" elapsed="0.000032"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:14:31.936084" elapsed="0.023385"/>
</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-04-17T03:14:31.934915" elapsed="0.024649"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:14:31.917484" elapsed="0.042294">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:31.960608" elapsed="0.000032"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:14:31.960699" 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="FAIL" start="2026-04-17T03:14:31.900757" elapsed="0.060099">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:14:31.961015" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:14:31.961067" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:31.895784" elapsed="0.065309"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:31.961469" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:31.961189" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:31.961164" elapsed="0.000391"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:14:31.895595" elapsed="0.065987"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:14:31.895382" elapsed="0.066236"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:14:31.892143" elapsed="0.069541"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:14:31.886644" elapsed="0.075104"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:31.886115" elapsed="0.075684"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:14:31.881019" elapsed="0.080853"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:14:31.962905" level="INFO">&amp;{mapping} = { IP=10.30.170.120 | 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-04-17T03:14:31.962140" elapsed="0.000825"/>
</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-04-17T03:14:32.016430" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:32.015993" elapsed="0.000476"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:32.017335" 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-04-17T03:14:32.017015" elapsed="0.000406">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-04-17T03:14:32.017613" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:32.016649" elapsed="0.000991"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:32.018243" 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-04-17T03:14:32.017809" elapsed="0.000462"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:14:32.018587" 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-04-17T03:14:32.018754" 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-04-17T03:14:32.018437" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:32.019216" 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-04-17T03:14:32.018956" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:32.020417" level="INFO">mapping: {'IP': '10.30.170.120', '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-04-17T03:14:32.020144" elapsed="0.000320"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:14:32.020896" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:14:32.020623" elapsed="0.000299"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:32.021681" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:32.021324" elapsed="0.000383"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:32.022611" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:32.022266" elapsed="0.000372"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:32.022691" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:14:32.022865" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:32.021896" elapsed="0.000994"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:32.023057" elapsed="0.000291"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:14:32.021188" elapsed="0.002200"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:32.024183" 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-04-17T03:14:32.023633" elapsed="0.000576"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:32.025147" 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-04-17T03:14:32.024800" elapsed="0.000372"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:32.025222" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:14:32.025373" 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-04-17T03:14:32.024462" 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-04-17T03:14:32.025549" elapsed="0.000268"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:14:32.023503" elapsed="0.002355"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:32.026439" 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-04-17T03:14:32.026115" elapsed="0.000349"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:32.027336" 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-04-17T03:14:32.027002" elapsed="0.000360"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:32.027411" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:14:32.027562" 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-04-17T03:14:32.026648" 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-04-17T03:14:32.027768" elapsed="0.000296"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:14:32.025985" elapsed="0.002123"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:32.028672" 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-04-17T03:14:32.028353" elapsed="0.000345"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:32.029622" 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-04-17T03:14:32.029289" elapsed="0.000359"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:32.029697" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:14:32.029850" 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-04-17T03:14:32.028944" 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-04-17T03:14:32.030037" elapsed="0.000271"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:14:32.028224" elapsed="0.002125"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:32.030908" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:32.030589" elapsed="0.000370"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:32.031829" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:32.031484" elapsed="0.000371"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:32.031904" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:14:32.032073" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:32.031150" 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-04-17T03:14:32.032244" elapsed="0.000266"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:32.030462" elapsed="0.002089"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:32.033125" 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-04-17T03:14:32.032788" elapsed="0.000362"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:32.034178" 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-04-17T03:14:32.033826" elapsed="0.000544"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:32.034419" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:14:32.034569" 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-04-17T03:14:32.033485" elapsed="0.001108"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:32.034740" elapsed="0.000307"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:14:32.032661" elapsed="0.002428"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:32.035649" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:32.035328" elapsed="0.000346"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:32.036803" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:32.036460" elapsed="0.000370"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:32.036880" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:14:32.037067" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:32.035902" 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-04-17T03:14:32.037241" elapsed="0.000272"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:32.035200" elapsed="0.002352"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:32.038146" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:32.037793" elapsed="0.000379"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:32.039155" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:32.038733" elapsed="0.000449"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:32.039232" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:14:32.039387" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:32.038356" elapsed="0.001055"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:32.039559" elapsed="0.000358"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:32.037665" elapsed="0.002316"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:14:32.020996" elapsed="0.019025"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:14:32.040077" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:14:32.040315" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', '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-04-17T03:14:32.019689" elapsed="0.020654"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:32.019349" elapsed="0.021029"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:32.040561" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:32.040406" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:32.019323" elapsed="0.021316"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:14:32.041610" 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-04-17T03:14:32.040783" elapsed="0.000873"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:14:32.041739" 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/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-04-17T03:14:32.015157" elapsed="0.026736"/>
</kw>
<msg time="2026-04-17T03:14:32.041970" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:32.001595" elapsed="0.040459"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:14:32.055597" elapsed="0.000044"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:14:32.069593" elapsed="0.000061"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:14:32.083370" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:32.083627" 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-04-17T03:14:32.083854" 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-04-17T03:14:32.084327" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:32.084168" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:32.084148" 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-04-17T03:14:32.084557" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:32.084739" 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-04-17T03:14:32.084905" elapsed="0.000035"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:14:32.084100" elapsed="0.000876"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:14:32.083962" elapsed="0.001043"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:32.085152" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:32.085306" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:14:32.085471" 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-04-17T03:14:31.996784" elapsed="0.088716"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:32.087142" 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-04-17T03:14:32.086743" elapsed="0.000500">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-04-17T03:14:32.087367" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:32.086268" elapsed="0.001133"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:32.087888" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:32.087496" elapsed="0.000487"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:14:32.088665" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:32.088266" elapsed="0.000434"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:32.088016" elapsed="0.000731"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:32.087472" elapsed="0.001302"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:32.091584" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:14:32.088993" elapsed="0.002626"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:14:32.091683" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:14:32.091877" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:14:32.085858" elapsed="0.006045"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:32.093197" 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-04-17T03:14:32.092949" elapsed="0.000316">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-04-17T03:14:32.093361" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:32.092576" elapsed="0.000810"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:14:32.093596" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-17T03:14:32.093457" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:32.093439" 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-04-17T03:14:32.093851" 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-04-17T03:14:32.094046" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:14:32.094113" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:14:32.096412" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:14:32.092241" elapsed="0.004198"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:32.098067" 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-04-17T03:14:32.097738" elapsed="0.000382"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:32.098577" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:32.098298" elapsed="0.000335"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:14:32.103694" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:32.305446" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:32.707709" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:32.709950" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:14:32.100907" elapsed="0.612164">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:14:32.098714" elapsed="0.614503">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:32.713580" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:32.713277" elapsed="0.000397"/>
</branch>
<status status="FAIL" start="2026-04-17T03:14:32.098691" elapsed="0.615018">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:32.714351" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:32.714545" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:32.714492" elapsed="0.000111"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:32.714467" elapsed="0.000165"/>
</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-04-17T03:14:32.714829" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:14:32.714921" elapsed="0.000046"/>
</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-04-17T03:14:32.096771" elapsed="0.618326">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:32.715201" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:14:31.973020" elapsed="0.742325">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:32.715727" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:32.715474" elapsed="0.000356"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:32.715451" elapsed="0.000415"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:32.715914" elapsed="0.000041"/>
</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="FAIL" start="2026-04-17T03:14:31.968385" elapsed="0.747690">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:34.776204" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:34.775752" elapsed="0.000495"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:34.777250" 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-04-17T03:14:34.776803" elapsed="0.000525">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-04-17T03:14:34.777425" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:34.776431" elapsed="0.001019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:34.778038" 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-04-17T03:14:34.777621" elapsed="0.000444"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:14:34.778452" 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-04-17T03:14:34.778617" 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-04-17T03:14:34.778281" elapsed="0.000361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:34.779082" 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-04-17T03:14:34.778809" 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-04-17T03:14:34.780164" level="INFO">mapping: {'IP': '10.30.170.120', '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-04-17T03:14:34.779857" elapsed="0.000366"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:14:34.780715" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:14:34.780388" elapsed="0.000353"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:34.781520" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:34.781150" elapsed="0.000396"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:34.782529" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:34.782153" elapsed="0.000404"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:34.782610" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:14:34.782799" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:34.781754" elapsed="0.001071"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:34.783005" elapsed="0.000321"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:14:34.781007" elapsed="0.002361"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:34.785905" 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-04-17T03:14:34.783644" elapsed="0.002304"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:34.786910" 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-04-17T03:14:34.786553" elapsed="0.000402"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:34.787018" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:14:34.787174" 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-04-17T03:14:34.786154" 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-04-17T03:14:34.787363" elapsed="0.000302"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:14:34.783495" elapsed="0.004212"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:34.788342" 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-04-17T03:14:34.787993" elapsed="0.000374"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:34.789334" 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-04-17T03:14:34.788974" elapsed="0.000386"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:34.789411" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:14:34.789562" 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-04-17T03:14:34.788569" elapsed="0.001017"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:34.789734" elapsed="0.000298"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:14:34.787821" elapsed="0.002254"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:34.790682" 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-04-17T03:14:34.790358" elapsed="0.000350"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:34.791604" 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-04-17T03:14:34.791270" elapsed="0.000360"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:34.791679" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:14:34.791831" 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-04-17T03:14:34.790892" 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-04-17T03:14:34.792060" elapsed="0.000282"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:14:34.790227" elapsed="0.002158"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:34.792962" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:34.792627" elapsed="0.000362"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:34.793894" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:34.793557" elapsed="0.000363"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:34.793987" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:14:34.794151" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:34.793202" 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-04-17T03:14:34.794352" elapsed="0.000272"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:34.792496" elapsed="0.002170"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:34.795255" 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-04-17T03:14:34.794907" elapsed="0.000374"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:34.796208" 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-04-17T03:14:34.795801" elapsed="0.000434"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:34.796286" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:14:34.796440" 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-04-17T03:14:34.795464" elapsed="0.001000"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:34.796633" elapsed="0.000272"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:14:34.794778" elapsed="0.002183"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:34.797596" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:34.797228" elapsed="0.000395"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:34.798777" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:34.798223" elapsed="0.000581"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:34.798868" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:14:34.799071" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:34.797845" 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-04-17T03:14:34.799259" elapsed="0.000290"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:34.797075" elapsed="0.002516"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:34.800217" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:34.799833" elapsed="0.000410"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:34.801141" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:34.800779" elapsed="0.000394"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:34.801301" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:14:34.801456" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:34.800427" elapsed="0.001054"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:34.801630" elapsed="0.000285"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:34.799703" elapsed="0.002268"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:14:34.780795" elapsed="0.021250"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:14:34.802093" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:14:34.802264" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', '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-04-17T03:14:34.779536" elapsed="0.022754"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:34.779205" elapsed="0.023117"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:34.802497" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:34.802349" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:34.779182" elapsed="0.023391"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:14:34.803465" 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-04-17T03:14:34.802716" elapsed="0.000777"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:14:34.803542" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:14:34.775068" elapsed="0.028599"/>
</kw>
<msg time="2026-04-17T03:14:34.803721" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:34.760865" elapsed="0.042916"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:14:34.817243" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib.vanadium/${file_name} exists. 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-04-17T03:14:34.830986" 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/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-04-17T03:14:34.850810" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:34.851063" 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-04-17T03:14:34.851254" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:34.851750" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:34.851540" elapsed="0.000274"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:34.851521" 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-04-17T03:14:34.852050" 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-04-17T03:14:34.852231" 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-04-17T03:14:34.852399" elapsed="0.000028"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:14:34.851479" elapsed="0.000998"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:14:34.851338" elapsed="0.001176"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:34.852682" elapsed="0.000097"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:34.852843" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:14:34.853034" 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-04-17T03:14:34.756128" elapsed="0.096936"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:34.854908" 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-04-17T03:14:34.854598" elapsed="0.000420">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-04-17T03:14:34.855118" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:34.854158" 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-04-17T03:14:34.855502" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:34.855232" elapsed="0.000327"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:14:34.856127" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:34.855788" elapsed="0.000373"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:34.855584" elapsed="0.000613"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:34.855212" elapsed="0.001006"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:34.858965" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:14:34.856392" elapsed="0.002602"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:14:34.859054" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:14:34.859217" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:14:34.853747" elapsed="0.005495"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:34.860551" 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-04-17T03:14:34.860269" elapsed="0.000361">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-04-17T03:14:34.860739" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:34.859904" elapsed="0.000867"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:14:34.861019" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-17T03:14:34.860848" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:34.860829" elapsed="0.000279"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:34.861295" elapsed="0.000024"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:34.861469" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:14:34.861535" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:14:34.863817" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:14:34.859549" elapsed="0.004309"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:34.865474" 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-04-17T03:14:34.865159" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:34.865945" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:34.865684" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:14:34.871258" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:35.072957" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:35.475496" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:35.482912" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:14:34.868310" elapsed="0.617980">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:14:34.866057" elapsed="0.620347">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:35.486692" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:35.486452" elapsed="0.000311"/>
</branch>
<status status="FAIL" start="2026-04-17T03:14:34.866039" elapsed="0.620748">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:35.487267" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:35.487615" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:35.487573" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:35.487353" elapsed="0.000328"/>
</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-04-17T03:14:35.487858" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:14:35.487972" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:14:34.864234" elapsed="0.623887">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:35.488220" 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-04-17T03:14:34.731530" elapsed="0.756834">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:35.488717" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:35.488487" elapsed="0.000317"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:35.488463" elapsed="0.000370"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:35.488871" elapsed="0.000016"/>
</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="FAIL" start="2026-04-17T03:14:34.724459" elapsed="0.764549">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:37.548996" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:37.548459" elapsed="0.000661"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:37.549967" 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-04-17T03:14:37.549661" elapsed="0.000394">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-04-17T03:14:37.550158" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:37.549307" elapsed="0.000877"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:37.550793" 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-04-17T03:14:37.550353" elapsed="0.000469"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:14:37.551175" 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-04-17T03:14:37.551339" 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-04-17T03:14:37.551020" elapsed="0.000346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:37.551785" 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-04-17T03:14:37.551527" 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-04-17T03:14:37.552868" level="INFO">mapping: {'IP': '10.30.170.120', '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-04-17T03:14:37.552600" elapsed="0.000315"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:14:37.553402" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:14:37.553109" elapsed="0.000324"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:37.554238" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:37.553819" elapsed="0.000448"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:37.555233" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:37.554838" elapsed="0.000433"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:37.555343" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:14:37.555520" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:37.554462" 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-04-17T03:14:37.555701" elapsed="0.000348"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:14:37.553683" elapsed="0.002411"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:37.556909" 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-04-17T03:14:37.556346" elapsed="0.000608"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:37.557840" 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-04-17T03:14:37.557501" elapsed="0.000366"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:37.557918" elapsed="0.000048"/>
</return>
<msg time="2026-04-17T03:14:37.558093" 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-04-17T03:14:37.557150" elapsed="0.000967"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:37.558273" elapsed="0.000278"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:14:37.556213" elapsed="0.002381"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:37.559224" 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-04-17T03:14:37.558872" elapsed="0.000378"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:37.560144" 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-04-17T03:14:37.559782" elapsed="0.000388"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:37.560221" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:14:37.560376" 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-04-17T03:14:37.559437" 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-04-17T03:14:37.560547" elapsed="0.000336"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:14:37.558741" elapsed="0.002213"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:37.561605" 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-04-17T03:14:37.561244" elapsed="0.000390"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:37.562616" 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-04-17T03:14:37.562246" elapsed="0.000415"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:37.562718" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:14:37.562888" 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-04-17T03:14:37.561846" 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-04-17T03:14:37.563108" elapsed="0.000309"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:14:37.561087" elapsed="0.002376"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:37.564131" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:37.563742" elapsed="0.000419"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:37.565149" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:37.564758" elapsed="0.000420"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:37.565234" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:14:37.565404" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:37.564379" elapsed="0.001052"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:37.565610" elapsed="0.000306"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:37.563588" elapsed="0.002389"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:37.566565" 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-04-17T03:14:37.566227" elapsed="0.000364"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:37.567620" 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-04-17T03:14:37.567271" elapsed="0.000375"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:37.567697" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:14:37.567850" 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-04-17T03:14:37.566856" elapsed="0.001019"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:37.568062" elapsed="0.000277"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:14:37.566094" elapsed="0.002287"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:37.568979" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:37.568625" elapsed="0.000381"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:37.570270" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:37.569592" elapsed="0.000706"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:37.570350" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:14:37.570509" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:37.569222" elapsed="0.001314"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:37.570707" elapsed="0.000297"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:37.568496" elapsed="0.002550"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:37.571705" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:37.571298" elapsed="0.000435"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:37.572733" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:37.572305" elapsed="0.000466"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:37.572830" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:14:37.573016" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:37.571924" elapsed="0.001126"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:37.573217" elapsed="0.000326"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:37.571161" elapsed="0.002425"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:14:37.553492" elapsed="0.020136"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:14:37.573691" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:14:37.573921" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', '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-04-17T03:14:37.552271" elapsed="0.021697"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:37.551916" elapsed="0.022089"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:37.574191" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:37.574034" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:37.551891" elapsed="0.022388"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:14:37.575310" 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-04-17T03:14:37.574436" elapsed="0.000904"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:14:37.575405" 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/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-04-17T03:14:37.547728" elapsed="0.027861"/>
</kw>
<msg time="2026-04-17T03:14:37.575661" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:37.533561" elapsed="0.042157"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:14:37.588960" 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/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-04-17T03:14:37.601988" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/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-04-17T03:14:37.614592" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:37.614847" 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-04-17T03:14:37.615050" 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-04-17T03:14:37.615456" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:37.615306" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:37.615289" 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-04-17T03:14:37.615684" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:37.615847" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:37.616026" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:14:37.615251" elapsed="0.000887"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:14:37.615135" elapsed="0.001032"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:37.616316" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:37.616392" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:14:37.616532" 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-04-17T03:14:37.528621" elapsed="0.087937"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:37.617960" 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-04-17T03:14:37.617659" elapsed="0.000378">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-04-17T03:14:37.618131" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:37.617259" elapsed="0.000897"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:37.618485" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:37.618224" elapsed="0.000323"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:14:37.619155" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:37.618828" elapsed="0.000354"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:37.618572" elapsed="0.000646"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:37.618207" elapsed="0.001033"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:37.621853" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:14:37.619390" elapsed="0.002490"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:14:37.621946" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:14:37.622110" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:14:37.616888" elapsed="0.005247"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:37.623425" 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-04-17T03:14:37.623188" elapsed="0.000304">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-04-17T03:14:37.623587" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:37.622820" elapsed="0.000791"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:14:37.623820" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:14:37.623682" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:37.623663" elapsed="0.000241"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:37.624066" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:37.624248" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:14:37.624314" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:14:37.626293" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:14:37.622446" elapsed="0.003875"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:37.627905" 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-04-17T03:14:37.627650" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:37.628362" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:37.628118" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:14:37.633507" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:37.835190" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:38.237801" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:38.239884" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:14:37.630760" elapsed="0.612529">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:14:37.628574" elapsed="0.614879">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:38.243855" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:38.243524" elapsed="0.000450"/>
</branch>
<status status="FAIL" start="2026-04-17T03:14:37.628556" elapsed="0.615451">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:38.244633" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:38.244835" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:38.244777" elapsed="0.000123"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:38.244750" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:38.245195" elapsed="0.000036"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:14:38.245307" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:14:37.626634" elapsed="0.618834">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:38.245575" 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-04-17T03:14:37.504331" elapsed="0.741392">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:38.246163" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:38.245868" elapsed="0.000393"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:38.245841" elapsed="0.000451"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:38.246340" elapsed="0.000020"/>
</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="FAIL" start="2026-04-17T03:14:37.497952" elapsed="0.748525">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:40.311266" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:40.310804" elapsed="0.000496"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:40.312271" 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-04-17T03:14:40.311889" elapsed="0.000465">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-04-17T03:14:40.312460" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:40.311476" elapsed="0.001009"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:40.313073" 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-04-17T03:14:40.312655" elapsed="0.000447"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:14:40.313424" 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-04-17T03:14:40.313630" 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-04-17T03:14:40.313265" elapsed="0.000400"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:40.314211" 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-04-17T03:14:40.313864" elapsed="0.000400"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:40.315353" level="INFO">mapping: {'IP': '10.30.170.120', '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-04-17T03:14:40.315084" elapsed="0.000322"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:14:40.315843" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:14:40.315567" elapsed="0.000302"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:40.316689" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:40.316290" elapsed="0.000434"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:40.317695" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:40.317335" elapsed="0.000387"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:40.317777" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:14:40.317966" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:40.316974" elapsed="0.001018"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:40.318147" elapsed="0.000297"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:14:40.316151" elapsed="0.002334"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:40.319285" 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-04-17T03:14:40.318733" elapsed="0.000579"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:40.320297" 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-04-17T03:14:40.319881" elapsed="0.000444"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:40.320381" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:14:40.320538" 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-04-17T03:14:40.319505" elapsed="0.001057"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:40.320737" elapsed="0.000330"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:14:40.318601" elapsed="0.002517"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:40.321729" 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-04-17T03:14:40.321382" elapsed="0.000373"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:40.322692" 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-04-17T03:14:40.322344" elapsed="0.000375"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:40.322769" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:14:40.323021" 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-04-17T03:14:40.321983" 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-04-17T03:14:40.323198" elapsed="0.000287"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:14:40.321247" elapsed="0.002281"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:40.324170" 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-04-17T03:14:40.323773" elapsed="0.000425"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:40.325096" 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-04-17T03:14:40.324742" elapsed="0.000380"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:40.325172" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:14:40.325324" 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-04-17T03:14:40.324398" elapsed="0.000950"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:40.325496" elapsed="0.000271"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:14:40.323642" elapsed="0.002167"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:40.326417" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:40.326089" elapsed="0.000354"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:40.327318" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:40.326983" elapsed="0.000365"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:40.327398" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:14:40.327548" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:40.326627" 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-04-17T03:14:40.327719" elapsed="0.000284"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:40.325921" elapsed="0.002126"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:40.328700" 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-04-17T03:14:40.328349" elapsed="0.000376"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:40.329631" 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-04-17T03:14:40.329283" elapsed="0.000374"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:40.329708" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:14:40.329862" 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-04-17T03:14:40.328914" elapsed="0.000972"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:40.330090" elapsed="0.000276"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:14:40.328202" elapsed="0.002206"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:40.330996" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:40.330650" elapsed="0.000372"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:40.332167" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:40.331759" elapsed="0.000436"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:40.332251" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:14:40.332416" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:40.331209" 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-04-17T03:14:40.332591" elapsed="0.000274"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:40.330519" elapsed="0.002387"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:40.333493" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:40.333169" elapsed="0.000350"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:40.334433" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:40.334089" elapsed="0.000370"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:40.334511" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:14:40.334720" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:40.333707" elapsed="0.001039"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:40.334897" elapsed="0.000294"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:40.333036" elapsed="0.002197"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:14:40.315925" elapsed="0.019343"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:14:40.335312" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:14:40.335484" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', '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-04-17T03:14:40.314716" elapsed="0.020794"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:40.314350" elapsed="0.021195"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:40.335729" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:40.335575" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:40.314323" elapsed="0.021485"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:14:40.336762" 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-04-17T03:14:40.335969" elapsed="0.000821"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:14:40.336841" 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-04-17T03:14:40.310021" elapsed="0.026967"/>
</kw>
<msg time="2026-04-17T03:14:40.337045" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:40.296394" elapsed="0.040706"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:14:40.350296" elapsed="0.000049"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/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-04-17T03:14:40.363313" elapsed="0.000044"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:14:40.376034" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:40.376372" elapsed="0.000035"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:40.376606" 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-04-17T03:14:40.377065" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:40.376896" elapsed="0.000226"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:40.376877" 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-04-17T03:14:40.377290" 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-04-17T03:14:40.377460" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:40.377725" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:14:40.376836" elapsed="0.000942"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:14:40.376710" elapsed="0.001096"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:40.377964" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:40.378044" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:14:40.378199" 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-04-17T03:14:40.291523" elapsed="0.086703"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:40.379656" 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-04-17T03:14:40.379366" elapsed="0.000366">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-04-17T03:14:40.379827" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:40.378921" elapsed="0.000930"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:40.380259" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:40.379920" elapsed="0.000400"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:14:40.380831" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:40.380531" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:40.380347" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:40.379902" elapsed="0.001012"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:40.383556" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:14:40.381080" elapsed="0.002503"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:14:40.383637" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:14:40.383798" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:14:40.378564" elapsed="0.005258"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:40.385160" 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-04-17T03:14:40.384902" elapsed="0.000321">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-04-17T03:14:40.385317" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:40.384566" elapsed="0.000775"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:14:40.385545" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-17T03:14:40.385410" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:40.385392" elapsed="0.000235"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:40.385770" 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-04-17T03:14:40.385953" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:14:40.386020" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:14:40.387995" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:14:40.384235" elapsed="0.003788"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:40.389553" 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-04-17T03:14:40.389226" elapsed="0.000387"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:40.390240" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:40.389811" elapsed="0.000486"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:14:40.396235" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:40.598074" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:41.000480" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:41.003128" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:14:40.392986" elapsed="0.614524">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:14:40.390389" elapsed="0.617289">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:41.008088" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:41.007744" elapsed="0.000453"/>
</branch>
<status status="FAIL" start="2026-04-17T03:14:40.390363" elapsed="0.617872">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:41.008957" elapsed="0.000043"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:41.009177" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:41.009117" elapsed="0.000128"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:41.009088" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:41.009499" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:14:41.009605" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:14:40.388369" elapsed="0.621405">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:41.009903" elapsed="0.000055"/>
</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-04-17T03:14:40.261631" elapsed="0.748463">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:41.010587" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:41.010276" elapsed="0.000424"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:41.010240" elapsed="0.000502"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:41.010807" elapsed="0.000026"/>
</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="FAIL" start="2026-04-17T03:14:40.256889" elapsed="0.754101">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:43.069886" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:43.069356" elapsed="0.000583"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:43.070774" 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-04-17T03:14:43.070476" elapsed="0.000393">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-04-17T03:14:43.071005" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:43.070120" elapsed="0.000912"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:43.071631" 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-04-17T03:14:43.071225" elapsed="0.000434"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:14:43.071986" 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-04-17T03:14:43.072159" 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-04-17T03:14:43.071822" elapsed="0.000364"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:43.072596" 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-04-17T03:14:43.072342" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:43.073693" level="INFO">mapping: {'IP': '10.30.170.120', '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-04-17T03:14:43.073384" elapsed="0.000359"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:14:43.074205" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:14:43.073905" elapsed="0.000327"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:43.075044" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:43.074624" elapsed="0.000448"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:43.076121" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:43.075705" elapsed="0.000445"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:43.076235" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:14:43.076422" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:43.075277" 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-04-17T03:14:43.076602" elapsed="0.000306"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:14:43.074483" elapsed="0.002507"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:43.079232" 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-04-17T03:14:43.077285" elapsed="0.001976"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:43.080219" 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-04-17T03:14:43.079816" elapsed="0.000431"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:43.080300" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:14:43.080460" 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-04-17T03:14:43.079460" elapsed="0.001025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:43.080636" elapsed="0.000320"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:14:43.077143" elapsed="0.003858"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:43.081595" 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-04-17T03:14:43.081247" elapsed="0.000375"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:43.082551" 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-04-17T03:14:43.082209" elapsed="0.000369"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:43.082685" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:14:43.082877" 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-04-17T03:14:43.081836" 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-04-17T03:14:43.083134" elapsed="0.000286"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:14:43.081115" elapsed="0.002364"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:43.084133" 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-04-17T03:14:43.083763" elapsed="0.000403"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:43.085091" 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-04-17T03:14:43.084730" elapsed="0.000388"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:43.085171" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:14:43.085333" 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-04-17T03:14:43.084384" elapsed="0.000977"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:43.085587" elapsed="0.000369"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:14:43.083607" elapsed="0.002395"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:43.086666" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:43.086294" elapsed="0.000399"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:43.087703" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:43.087295" elapsed="0.000441"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:43.087796" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:14:43.088002" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:43.086887" elapsed="0.001142"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:43.088183" elapsed="0.000279"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:43.086145" elapsed="0.002360"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:43.089103" 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-04-17T03:14:43.088752" elapsed="0.000378"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:43.090042" 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-04-17T03:14:43.089682" elapsed="0.000387"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:43.090120" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:14:43.090275" 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-04-17T03:14:43.089318" elapsed="0.000981"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:43.090448" elapsed="0.000286"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:14:43.088620" elapsed="0.002157"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:43.091413" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:43.091067" elapsed="0.000373"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:43.092541" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:43.092007" elapsed="0.000562"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:43.092620" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:14:43.092810" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:43.091630" 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-04-17T03:14:43.093009" elapsed="0.000280"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:43.090890" elapsed="0.002442"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:43.093990" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:43.093630" elapsed="0.000388"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:43.094895" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:43.094553" elapsed="0.000369"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:43.095037" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:14:43.095197" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:43.094209" elapsed="0.001013"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:43.095373" elapsed="0.000294"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:43.093459" elapsed="0.002256"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:14:43.074288" elapsed="0.021469"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:14:43.095834" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:14:43.096065" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', '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-04-17T03:14:43.073055" elapsed="0.023038"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:43.072724" elapsed="0.023402"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:43.096312" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:43.096157" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:43.072697" elapsed="0.023693"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:14:43.097356" 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-04-17T03:14:43.096571" elapsed="0.000817"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:14:43.097449" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib.vanadium/${file_name} exists. 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-04-17T03:14:43.068694" elapsed="0.028906"/>
</kw>
<msg time="2026-04-17T03:14:43.097657" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:43.055188" elapsed="0.042523"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:14:43.110957" elapsed="0.000034"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/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-04-17T03:14:43.124089" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:43.138330" elapsed="0.000035"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:43.138556" 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-04-17T03:14:43.138737" 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-04-17T03:14:43.139177" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:43.139009" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:43.138991" elapsed="0.000273"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:43.139409" 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-04-17T03:14:43.139641" 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-04-17T03:14:43.139807" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:14:43.138953" elapsed="0.000908"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:14:43.138820" elapsed="0.001069"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:43.140052" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:43.140130" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:14:43.140278" 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-04-17T03:14:43.050634" elapsed="0.089671"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:43.141870" 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-04-17T03:14:43.141502" elapsed="0.000465">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-04-17T03:14:43.142065" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:43.141066" 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-04-17T03:14:43.142424" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:43.142161" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:14:43.143042" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:43.142686" elapsed="0.000384"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:43.142506" elapsed="0.000600"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:43.142142" elapsed="0.000991"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:43.146024" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:14:43.143287" elapsed="0.002767"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:14:43.146112" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:14:43.146285" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:14:43.140672" elapsed="0.005645"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:43.147739" 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-04-17T03:14:43.147466" elapsed="0.000347">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-04-17T03:14:43.147910" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:43.147080" elapsed="0.000880"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:14:43.148198" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:14:43.148049" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:43.148029" elapsed="0.000257"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:43.148446" 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-04-17T03:14:43.148634" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:14:43.148702" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:14:43.150809" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:14:43.146669" elapsed="0.004168"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:43.152384" 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-04-17T03:14:43.152084" elapsed="0.000413"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:43.152910" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:43.152655" elapsed="0.000318"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:14:43.158227" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:43.359790" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:43.762193" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:43.764413" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:14:43.155264" elapsed="0.613721">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:14:43.153043" elapsed="0.616111">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:43.769780" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:43.769217" elapsed="0.000783"/>
</branch>
<status status="FAIL" start="2026-04-17T03:14:43.153024" elapsed="0.617034">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:43.770909" elapsed="0.000080"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:43.771219" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:43.771141" elapsed="0.000156"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:43.771100" elapsed="0.000233"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:43.771620" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:14:43.771752" 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-04-17T03:14:43.151179" elapsed="0.620776">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:43.772067" 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-04-17T03:14:43.027301" elapsed="0.744908">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:43.772709" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:43.772354" elapsed="0.000469"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:43.772322" elapsed="0.000536"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:43.772906" elapsed="0.000042"/>
</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="FAIL" start="2026-04-17T03:14:43.020905" elapsed="0.752172">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:14:43.773309" level="FAIL">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 5 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-17T03:14:31.963170" elapsed="11.810288">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 5 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Check for the presence of Ipv6 Prefix in the BGP RIB</doc>
<status status="FAIL" start="2026-04-17T03:14:31.880111" elapsed="11.893598">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 5 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:14:43.780058" elapsed="0.000371"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:14:43.779593" 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-04-17T03:14:43.782141" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:43.781900" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:43.781842" elapsed="0.000416"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:43.789094" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:43.788943" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:43.788898" elapsed="0.000282"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:43.790427" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:14:43.789956" elapsed="0.000506"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:14:43.790962" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:14:43.790629" elapsed="0.000361"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:14:43.791036" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:14:43.791206" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:14:43.789487" elapsed="0.001743"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:43.798348" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:43.798201" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:43.798168" elapsed="0.000287"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:43.800021" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:43.799831" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:43.799805" elapsed="0.000315"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:14:43.800778" level="INFO">${karaf_connection_index} = 40</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:14:43.800336" elapsed="0.000480"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:43.801360" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:14:43.801061" elapsed="0.000336"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:14:43.802571" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:14:43.802156" elapsed="0.001373">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:14:43.803783" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:14:43.803844" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:43.801623" elapsed="0.002255"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:14:43.804970" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:14:43.804610" elapsed="0.001271">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:14:43.806275" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:14:43.806341" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:43.804133" elapsed="0.002241"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:14:43.807476" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Injected_Ipv6_Routes_2"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:14:43.806750" elapsed="0.000811">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Injected_Ipv6_Routes_2"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:14:43.806473" elapsed="0.001177">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Injected_Ipv6_Routes_2"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:14:43.806446" elapsed="0.001241">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Injected_Ipv6_Routes_2"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:43.807859" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:43.808113" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:43.807970" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:43.807950" elapsed="0.000241"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:14:43.808230" elapsed="0.000019"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:14:43.811972" elapsed="0.000231"/>
</kw>
<msg time="2026-04-17T03:14:43.812306" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:43.810379" elapsed="0.002124"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:43.812896" elapsed="0.000206"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:43.813455" 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-04-17T03:14:43.809417" elapsed="0.004297"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:14:43.808604" elapsed="0.005191"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:14:43.799472" elapsed="0.014609">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Injected_Ipv6_Routes_2"</status>
</kw>
<msg time="2026-04-17T03:14:43.814240" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:14:43.814303" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Injected_Ipv6_Routes_2"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:43.798657" elapsed="0.015679"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:14:43.814650" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:43.814460" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:43.814419" elapsed="0.000334"/>
</if>
<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-04-17T03:14:43.816310" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:43.816164" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:43.816138" elapsed="0.000265"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:43.816819" level="INFO">index=15
host=10.30.170.120
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-04-17T03:14:43.816987" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
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-04-17T03:14:43.816631" elapsed="0.000395"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:43.817648" level="INFO">{1: 40}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:43.817242" elapsed="0.000470"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:43.818472" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:43.818115" elapsed="0.000419"/>
</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-04-17T03:14:43.819345" elapsed="0.000407"/>
</kw>
<msg time="2026-04-17T03:14:43.819897" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:14:43.819985" level="INFO">${old_connection_index} = 40</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:43.818764" elapsed="0.001256"/>
</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-04-17T03:14:43.821354" elapsed="0.000276"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:14:43.823292" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:14:43.822685" elapsed="0.001965">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:43.821859" elapsed="0.002928"/>
</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-04-17T03:14:43.825669" elapsed="0.000416"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:43.825048" elapsed="0.001139"/>
</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-04-17T03:14:43.820610" elapsed="0.005637"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:43.820262" elapsed="0.006049"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:43.820226" elapsed="0.006128"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:14:43.827578" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:14:43.827162" elapsed="0.000451"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:14:43.827681" elapsed="0.000053"/>
</return>
<msg time="2026-04-17T03:14:43.827889" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:14:43.826667" elapsed="0.001251"/>
</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-04-17T03:14:43.828140" elapsed="0.000591"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:43.829252" level="INFO">index=41
host=10.30.170.120
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-04-17T03:14:43.829395" level="INFO">${karaf_connection_object} = index=41
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:14:43.829082" elapsed="0.000352"/>
</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-04-17T03:14:43.829649" elapsed="0.003570"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:14:43.833813" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:14:43.835275" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:14:43.833452" elapsed="0.002396">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:14:43.854993" elapsed="0.000541"/>
</kw>
<msg time="2026-04-17T03:14:43.855687" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:43.852907" elapsed="0.003003"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:43.856168" elapsed="0.000033"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:43.856406" elapsed="0.000032"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:14:43.837133" elapsed="0.019406"/>
</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-04-17T03:14:43.836319" elapsed="0.020292"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:14:43.815707" elapsed="0.041034">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:43.857372" elapsed="0.000043"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:14:43.857481" elapsed="0.000032"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:14:43.797571" elapsed="0.060077">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:14:43.857815" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:14:43.857877" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:43.791716" elapsed="0.066395"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:43.858636" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:43.858247" elapsed="0.000467"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:43.858217" elapsed="0.000534"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:14:43.791519" elapsed="0.067266"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:14:43.791296" elapsed="0.067537"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:14:43.788332" elapsed="0.070585"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:14:43.781427" elapsed="0.077888"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:43.780743" 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-04-17T03:14:43.775327" elapsed="0.084141"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:14:43.860803" 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-04-17T03:14:43.859784" elapsed="0.001060"/>
</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-04-17T03:14:43.920517" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_route_injection.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:43.920068" elapsed="0.000484"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:43.921386" 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-04-17T03:14:43.921094" elapsed="0.000368">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-04-17T03:14:43.921558" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:43.920729" elapsed="0.000854"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:43.922202" 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-04-17T03:14:43.921745" elapsed="0.000485"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:14:43.922539" 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-04-17T03:14:43.922705" 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-04-17T03:14:43.922389" elapsed="0.000342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:43.923153" 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-04-17T03:14:43.922885" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:43.924288" 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-04-17T03:14:43.924019" elapsed="0.000316"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:14:43.924769" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:14:43.924494" elapsed="0.000301"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:43.925546" 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-04-17T03:14:43.925195" elapsed="0.000382"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:43.926474" 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-04-17T03:14:43.926205" elapsed="0.000296"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:43.926658" elapsed="0.000050"/>
</return>
<msg time="2026-04-17T03:14:43.926845" 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-04-17T03:14:43.925795" 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-04-17T03:14:43.927047" elapsed="0.000252"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.12</var>
<status status="PASS" start="2026-04-17T03:14:43.925058" elapsed="0.002283"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:43.928252" 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-04-17T03:14:43.927710" elapsed="0.000583"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:43.929546" 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-04-17T03:14:43.929176" elapsed="0.000421"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:43.929683" elapsed="0.000050"/>
</return>
<msg time="2026-04-17T03:14:43.930026" 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-04-17T03:14:43.928614" elapsed="0.001467"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:43.930317" elapsed="0.000311"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:14:43.927486" elapsed="0.003191"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:43.931253" 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-04-17T03:14:43.930947" elapsed="0.000332"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:43.932064" 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-04-17T03:14:43.931824" elapsed="0.000266"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:43.932141" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:14:43.932297" 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-04-17T03:14:43.931466" elapsed="0.000857"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:43.932474" elapsed="0.000488"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:14:43.930797" elapsed="0.002210"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:43.933570" 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-04-17T03:14:43.933257" elapsed="0.000338"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:43.934573" 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-04-17T03:14:43.934205" elapsed="0.000395"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:43.934661" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:14:43.934835" 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-04-17T03:14:43.933805" elapsed="0.001058"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:43.935060" elapsed="0.000229"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:14:43.933123" elapsed="0.002208"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:43.935890" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:43.935580" elapsed="0.000335"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:43.936661" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:43.936437" elapsed="0.000255"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:43.936748" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:14:43.936904" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:43.936120" 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-04-17T03:14:43.937096" elapsed="0.000224"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:43.935446" elapsed="0.001914"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:43.938019" 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-04-17T03:14:43.937601" elapsed="0.000449"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:43.938803" 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-04-17T03:14:43.938575" elapsed="0.000254"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:43.938972" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:14:43.939133" 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-04-17T03:14:43.938253" 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-04-17T03:14:43.939308" elapsed="0.000231"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:14:43.937471" elapsed="0.002109"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:43.940196" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:43.939839" elapsed="0.000390"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:43.941118" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:43.940866" elapsed="0.000279"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:43.941198" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:14:43.941359" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:43.940479" 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-04-17T03:14:43.941534" elapsed="0.000241"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:43.939707" elapsed="0.002114"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:43.942477" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:43.942139" elapsed="0.000364"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:43.943367" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:43.943135" elapsed="0.000259"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:43.943445" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:14:43.943606" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:43.942721" 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-04-17T03:14:43.943793" elapsed="0.000297"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:43.942002" elapsed="0.002134"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:14:43.924850" elapsed="0.019323"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:14:43.944220" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:14:43.944396" 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-04-17T03:14:43.923644" elapsed="0.020779"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:43.923277" elapsed="0.021180"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:43.944656" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:43.944488" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:43.923253" elapsed="0.021485"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:14:43.945716" 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-04-17T03:14:43.944911" elapsed="0.000834"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:14:43.945796" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_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-04-17T03:14:43.919218" elapsed="0.026730"/>
</kw>
<msg time="2026-04-17T03:14:43.946355" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:43.902603" elapsed="0.043962"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:14:43.964624" 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/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-04-17T03:14:43.978593" elapsed="0.000213"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:14:43.991945" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:43.992198" 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-04-17T03:14:43.992387" 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-04-17T03:14:43.992842" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:43.992686" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:43.992668" 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-04-17T03:14:43.993099" 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-04-17T03:14:43.993271" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:43.993437" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:14:43.992625" elapsed="0.000872"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:14:43.992489" elapsed="0.001038"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:43.993680" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:43.993763" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:14:43.993945" 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-04-17T03:14:43.895862" elapsed="0.098113"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:43.995352" 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-04-17T03:14:43.994997" elapsed="0.000410"/>
</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-04-17T03:14:44.000728" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:14:44.202347" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:14:44.604786" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:14:44.606926" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:43.997694" elapsed="0.614612">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:14:43.995477" elapsed="0.617078">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:44.613179" elapsed="0.000104"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:44.612664" elapsed="0.000752"/>
</branch>
<status status="FAIL" start="2026-04-17T03:14:43.995459" elapsed="0.618017">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:14:44.614728" elapsed="0.000066"/>
</kw>
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:44.614914" elapsed="0.000081"/>
</return>
<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-04-17T03:14:43.994306" elapsed="0.620915">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:44.615367" elapsed="0.000035"/>
</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="FAIL" start="2026-04-17T03:14:43.861647" elapsed="0.753899">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Fail If Exceptions Found During Test" owner="KarafKeywords">
<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="NOT RUN" start="2026-04-17T03:14:44.615972" elapsed="0.000034"/>
</kw>
<doc>Delete the injected IPV6 routes</doc>
<status status="FAIL" start="2026-04-17T03:14:43.774265" elapsed="0.841932">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:14:44.620316" elapsed="0.000290"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:14:44.620010" elapsed="0.000665"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:44.621879" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:44.621746" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:44.621722" elapsed="0.000248"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:44.627183" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:44.627073" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:44.627055" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:44.628286" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:14:44.627863" elapsed="0.000451"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:14:44.628774" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:14:44.628474" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:14:44.628845" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:14:44.629024" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:14:44.627483" elapsed="0.001565"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:44.635312" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:44.635189" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:44.635166" elapsed="0.000222"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:44.636658" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:44.636544" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:44.636526" elapsed="0.000201"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:14:44.637261" level="INFO">${karaf_connection_index} = 41</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:14:44.636876" elapsed="0.000413"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:44.637768" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:14:44.637471" elapsed="0.000324"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:14:44.638845" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:14:44.638389" elapsed="0.001226">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:14:44.639812" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:14:44.639861" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:44.637984" elapsed="0.001901"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:14:44.640719" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:14:44.640461" elapsed="0.001088">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:14:44.641776" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:14:44.641834" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:44.640072" elapsed="0.001787"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:14:44.642920" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_App_Peer"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:14:44.642240" elapsed="0.000786">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_App_Peer"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:14:44.641971" elapsed="0.001139">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_App_Peer"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:14:44.641917" elapsed="0.001232">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_App_Peer"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:44.643331" elapsed="0.000031"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:44.643576" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:44.643435" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:44.643417" elapsed="0.000234"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:14:44.643694" elapsed="0.000018"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:14:44.646655" elapsed="0.000166"/>
</kw>
<msg time="2026-04-17T03:14:44.646895" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:44.645380" 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-04-17T03:14:44.647328" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:44.647667" 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-04-17T03:14:44.644645" elapsed="0.003261"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:14:44.644002" elapsed="0.004079"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:14:44.636235" elapsed="0.011950">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_App_Peer"</status>
</kw>
<msg time="2026-04-17T03:14:44.648311" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:14:44.648366" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_App_Peer"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:44.635557" elapsed="0.012834"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:14:44.648642" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:44.648525" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:44.648504" elapsed="0.000205"/>
</if>
<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-04-17T03:14:44.649566" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:44.649455" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:44.649438" elapsed="0.000195"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:44.649955" level="INFO">index=15
host=10.30.170.120
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-04-17T03:14:44.650108" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
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-04-17T03:14:44.649786" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:44.650703" level="INFO">{1: 41}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:44.650317" elapsed="0.000435"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:44.651282" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:44.650945" elapsed="0.000398"/>
</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-04-17T03:14:44.652126" elapsed="0.000315"/>
</kw>
<msg time="2026-04-17T03:14:44.652545" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:14:44.652591" level="INFO">${old_connection_index} = 41</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:44.651558" elapsed="0.001057"/>
</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-04-17T03:14:44.653585" elapsed="0.000209"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:14:44.656879" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:14:44.654617" elapsed="0.003273">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:44.654009" elapsed="0.004049"/>
</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-04-17T03:14:44.658858" elapsed="0.000312"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:44.658273" elapsed="0.000985"/>
</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-04-17T03:14:44.653012" elapsed="0.006293"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:44.652699" elapsed="0.006655"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:44.652673" elapsed="0.006710"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:14:44.660406" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:14:44.660022" elapsed="0.000414"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:14:44.660494" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:14:44.660662" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:14:44.659644" elapsed="0.001043"/>
</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-04-17T03:14:44.660845" elapsed="0.000461"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:44.661602" level="INFO">index=42
host=10.30.170.120
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-04-17T03:14:44.661705" level="INFO">${karaf_connection_object} = index=42
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:14:44.661478" elapsed="0.000253"/>
</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-04-17T03:14:44.661878" elapsed="0.002443"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:14:44.664790" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:14:44.666227" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:14:44.664493" elapsed="0.002263">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:14:44.681655" elapsed="0.000580"/>
</kw>
<msg time="2026-04-17T03:14:44.682361" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:44.680042" elapsed="0.002489"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:44.682697" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:44.682863" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:14:44.667749" elapsed="0.015237"/>
</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-04-17T03:14:44.667142" elapsed="0.015915"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:14:44.649150" elapsed="0.034025">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:44.683581" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:14:44.683661" elapsed="0.000023"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:14:44.634755" elapsed="0.049024">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:14:44.683898" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:14:44.683960" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:44.629430" elapsed="0.054556"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:44.684341" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:44.684074" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:44.684053" elapsed="0.000367"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:14:44.629286" elapsed="0.055159"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:14:44.629109" elapsed="0.055371"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:14:44.626690" elapsed="0.057847"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:14:44.621399" elapsed="0.063195"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:44.620838" elapsed="0.063803"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:14:44.617073" elapsed="0.067623"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:14:44.685624" 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-04-17T03:14:44.684910" elapsed="0.000744"/>
</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-04-17T03:14:44.731649" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:44.731204" elapsed="0.000487"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:44.732573" 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-04-17T03:14:44.732293" elapsed="0.000375">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-04-17T03:14:44.732774" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:44.731896" elapsed="0.000903"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:44.733377" 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-04-17T03:14:44.732984" elapsed="0.000488"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:14:44.733796" 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-04-17T03:14:44.733974" 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-04-17T03:14:44.733645" elapsed="0.000357"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:44.734459" 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-04-17T03:14:44.734159" elapsed="0.000349"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:44.735572" 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-04-17T03:14:44.735304" elapsed="0.000314"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:14:44.736103" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:14:44.735801" elapsed="0.000328"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:44.736825" 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-04-17T03:14:44.736513" elapsed="0.000338"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:44.737602" 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-04-17T03:14:44.737378" elapsed="0.000249"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:44.737681" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:14:44.737887" 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-04-17T03:14:44.737057" elapsed="0.000858"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:44.738120" elapsed="0.000274"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.12</var>
<status status="PASS" start="2026-04-17T03:14:44.736376" elapsed="0.002078"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:44.739078" 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-04-17T03:14:44.738742" elapsed="0.000361"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:44.739908" 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-04-17T03:14:44.739665" elapsed="0.000287"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:44.740005" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:14:44.740160" 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-04-17T03:14:44.739290" 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-04-17T03:14:44.740336" elapsed="0.000404"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:14:44.738597" elapsed="0.002194"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:44.741390" 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-04-17T03:14:44.741076" elapsed="0.000340"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:44.742310" 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-04-17T03:14:44.742082" elapsed="0.000254"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:44.742407" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:14:44.742571" 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-04-17T03:14:44.741668" 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-04-17T03:14:44.742771" elapsed="0.000276"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:14:44.740911" elapsed="0.002180"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:44.743641" 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-04-17T03:14:44.743339" elapsed="0.000331"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:44.744490" 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-04-17T03:14:44.744274" elapsed="0.000242"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:44.744566" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:14:44.744786" 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-04-17T03:14:44.743912" 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-04-17T03:14:44.745031" elapsed="0.000240"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:14:44.743206" elapsed="0.002107"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:44.745864" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:44.745562" elapsed="0.000327"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:44.746712" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:44.746495" elapsed="0.000243"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:44.746788" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:14:44.746957" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:44.746115" elapsed="0.000868"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:44.747134" elapsed="0.000245"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:44.745426" elapsed="0.001995"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:44.748014" 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-04-17T03:14:44.747670" elapsed="0.000371"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:44.748797" 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-04-17T03:14:44.748584" elapsed="0.000239"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:44.748872" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:14:44.749064" 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-04-17T03:14:44.748229" elapsed="0.000863"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:44.749245" elapsed="0.000279"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:14:44.747536" elapsed="0.002032"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:44.750168" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:44.749815" elapsed="0.000379"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:44.750961" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:44.750731" elapsed="0.000271"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:44.751063" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:14:44.751223" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:44.750402" 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-04-17T03:14:44.751398" elapsed="0.000280"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:44.749682" elapsed="0.002040"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:44.752298" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:44.751991" elapsed="0.000333"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:44.753269" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:44.753054" elapsed="0.000241"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:44.753345" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:14:44.753510" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:44.752511" 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-04-17T03:14:44.753745" elapsed="0.000252"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:44.751838" elapsed="0.002202"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:14:44.736186" elapsed="0.017889"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:14:44.754119" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:14:44.754285" 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-04-17T03:14:44.734915" elapsed="0.019396"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:44.734586" elapsed="0.019833"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:44.754614" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:44.754458" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:44.734563" elapsed="0.020128"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:14:44.755569" 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-04-17T03:14:44.754834" elapsed="0.000764"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:14:44.755648" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:14:44.730501" elapsed="0.025275"/>
</kw>
<msg time="2026-04-17T03:14:44.755832" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:44.717220" elapsed="0.038662"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:14:44.768695" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/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-04-17T03:14:44.781418" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/application_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:44.795396" elapsed="0.000040"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:44.795642" 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-04-17T03:14:44.795845" 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-04-17T03:14:44.796267" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:44.796118" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:44.796103" 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-04-17T03:14:44.796494" 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-04-17T03:14:44.796657" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:44.796820" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:14:44.796068" elapsed="0.000803"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:14:44.795951" elapsed="0.000947"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:44.797059" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:44.797138" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:14:44.797361" 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-04-17T03:14:44.712451" elapsed="0.084939"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:44.798649" 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-04-17T03:14:44.798317" elapsed="0.000383"/>
</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-04-17T03:14:44.803907" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:14:45.005758" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:14:45.408739" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:14:45.411539" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:44.801077" elapsed="0.616591">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:14:44.798768" elapsed="0.619201">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:45.418599" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:45.418086" elapsed="0.000778"/>
</branch>
<status status="FAIL" start="2026-04-17T03:14:44.798751" elapsed="0.620210">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:14:45.419764" elapsed="0.000034"/>
</kw>
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:45.419855" elapsed="0.000026"/>
</return>
<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-04-17T03:14:44.797672" elapsed="0.622349">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:45.420092" elapsed="0.000017"/>
</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="FAIL" start="2026-04-17T03:14:44.685903" elapsed="0.734290">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Deletes bgp application peer.</doc>
<status status="FAIL" start="2026-04-17T03:14:44.616500" elapsed="0.803947">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:14:45.424758" elapsed="0.000343"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:14:45.424479" elapsed="0.000683"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:45.426278" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:45.426148" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:45.426125" elapsed="0.000223"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:45.431657" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:45.431502" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:45.431476" elapsed="0.000258"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:45.432860" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:14:45.432427" elapsed="0.000463"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:14:45.433449" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:14:45.433119" elapsed="0.000357"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:14:45.433521" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:14:45.433686" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:14:45.432023" elapsed="0.001688"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:45.439765" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:45.439653" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:45.439634" 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-04-17T03:14:45.441096" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:45.440949" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:45.440907" elapsed="0.000259"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:14:45.441695" level="INFO">${karaf_connection_index} = 42</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:14:45.441320" elapsed="0.000412"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:45.442290" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:14:45.441976" elapsed="0.000350"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:14:45.443444" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:14:45.443070" elapsed="0.001290">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:14:45.444630" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:14:45.444694" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:45.442549" elapsed="0.002177"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:14:45.445884" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:14:45.445536" elapsed="0.001369">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:14:45.447203" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:14:45.447298" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:45.445015" elapsed="0.002320"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:14:45.448332" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Bgp_Peer_Configuration_5"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:14:45.447690" elapsed="0.000765">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Bgp_Peer_Configuration_5"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:14:45.447443" elapsed="0.001085">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Bgp_Peer_Configuration_5"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:14:45.447416" elapsed="0.001147">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Bgp_Peer_Configuration_5"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:45.448731" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:45.448997" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:45.448818" elapsed="0.000265"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:45.448800" elapsed="0.000313"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:14:45.449153" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:14:45.451818" elapsed="0.000192"/>
</kw>
<msg time="2026-04-17T03:14:45.452087" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:45.450637" 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-04-17T03:14:45.452506" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:45.452839" 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-04-17T03:14:45.450014" elapsed="0.003163"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:14:45.449440" elapsed="0.003830"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:14:45.440621" elapsed="0.012752">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Bgp_Peer_Configuration_5"</status>
</kw>
<msg time="2026-04-17T03:14:45.453479" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:14:45.453524" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Bgp_Peer_Configuration_5"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:45.440003" elapsed="0.013544"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:14:45.453733" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:45.453624" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:45.453606" elapsed="0.000193"/>
</if>
<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-04-17T03:14:45.454942" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:45.454739" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:45.454722" elapsed="0.000292"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:45.455297" level="INFO">index=15
host=10.30.170.120
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-04-17T03:14:45.455401" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
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-04-17T03:14:45.455167" elapsed="0.000261"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:45.455885" level="INFO">{1: 42}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:45.455609" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:45.456349" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:45.456102" elapsed="0.000292"/>
</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-04-17T03:14:45.456964" elapsed="0.000268"/>
</kw>
<msg time="2026-04-17T03:14:45.457331" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:14:45.457376" level="INFO">${old_connection_index} = 42</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:45.456570" elapsed="0.000829"/>
</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-04-17T03:14:45.458375" elapsed="0.000211"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:14:45.459719" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:14:45.459293" elapsed="0.001318">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:45.458784" elapsed="0.001929"/>
</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-04-17T03:14:45.461435" elapsed="0.000350"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:45.460968" elapsed="0.000903"/>
</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-04-17T03:14:45.457708" elapsed="0.004299"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:45.457473" elapsed="0.004594"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:45.457455" elapsed="0.004638"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:14:45.463066" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:14:45.462690" elapsed="0.000402"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:14:45.463142" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:14:45.463296" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:14:45.462332" elapsed="0.000988"/>
</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-04-17T03:14:45.463474" elapsed="0.000606"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:45.464467" level="INFO">index=43
host=10.30.170.120
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-04-17T03:14:45.464605" level="INFO">${karaf_connection_object} = index=43
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:14:45.464314" elapsed="0.000327"/>
</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-04-17T03:14:45.464886" elapsed="0.003355"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:14:45.468671" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:14:45.469874" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:14:45.468409" elapsed="0.001943">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:14:45.490467" elapsed="0.000673"/>
</kw>
<msg time="2026-04-17T03:14:45.491285" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:45.488060" elapsed="0.003460"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:45.491753" elapsed="0.000033"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:45.492003" elapsed="0.000030"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:14:45.471244" elapsed="0.020879"/>
</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-04-17T03:14:45.470641" elapsed="0.021546"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:14:45.454441" elapsed="0.037862">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:45.492787" elapsed="0.000036"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:14:45.492890" 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="FAIL" start="2026-04-17T03:14:45.439296" elapsed="0.053786">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:14:45.493240" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:14:45.493302" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:45.434130" elapsed="0.059205"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:45.493805" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:45.493448" elapsed="0.000433"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:45.493421" elapsed="0.000765"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:14:45.433975" elapsed="0.060255"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:14:45.433772" elapsed="0.060505"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:14:45.431061" elapsed="0.063298"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:14:45.425790" elapsed="0.068650"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:45.425323" elapsed="0.069182"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:14:45.421876" elapsed="0.072708"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:14:45.495830" 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-04-17T03:14:45.494898" 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-04-17T03:14:45.541971" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:45.541507" elapsed="0.000501"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:45.542887" 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-04-17T03:14:45.542546" elapsed="0.000440">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-04-17T03:14:45.543091" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:45.542184" elapsed="0.000934"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:45.543703" 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-04-17T03:14:45.543287" elapsed="0.000443"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:14:45.544071" 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-04-17T03:14:45.544242" 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-04-17T03:14:45.543892" elapsed="0.000377"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:45.544739" 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-04-17T03:14:45.544422" 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-04-17T03:14:45.545953" 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-04-17T03:14:45.545640" elapsed="0.000363"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:14:45.546435" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:14:45.546162" elapsed="0.000298"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:45.547245" 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-04-17T03:14:45.546923" elapsed="0.000348"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:45.548087" 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-04-17T03:14:45.547824" elapsed="0.000301"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:45.548182" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:14:45.548362" 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-04-17T03:14:45.547475" 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-04-17T03:14:45.548553" elapsed="0.000270"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-04-17T03:14:45.546737" elapsed="0.002212"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:45.549552" 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-04-17T03:14:45.549217" elapsed="0.000373"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:45.550411" 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-04-17T03:14:45.550196" elapsed="0.000240"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:45.550487" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:14:45.550662" 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-04-17T03:14:45.549823" 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-04-17T03:14:45.550890" elapsed="0.000255"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:14:45.549073" elapsed="0.002116"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:45.551762" 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-04-17T03:14:45.551437" elapsed="0.000351"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:45.552526" 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-04-17T03:14:45.552310" elapsed="0.000241"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:45.552604" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:14:45.552765" 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-04-17T03:14:45.551992" elapsed="0.000797"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:45.552951" elapsed="0.000405"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:14:45.551306" elapsed="0.002092"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:45.553972" 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-04-17T03:14:45.553651" elapsed="0.000348"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:45.554720" 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-04-17T03:14:45.554499" elapsed="0.000247"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:45.554796" elapsed="0.000080"/>
</return>
<msg time="2026-04-17T03:14:45.555018" 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-04-17T03:14:45.554184" 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-04-17T03:14:45.555192" elapsed="0.000222"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:14:45.553512" elapsed="0.001963"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:45.556098" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:45.555753" elapsed="0.000371"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:45.556866" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:45.556629" elapsed="0.000263"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:45.556958" elapsed="0.000048"/>
</return>
<msg time="2026-04-17T03:14:45.557147" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:45.556312" elapsed="0.000861"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:45.557322" elapsed="0.000226"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:45.555601" elapsed="0.001996"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:45.558233" 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-04-17T03:14:45.557898" elapsed="0.000360"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:45.559120" 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-04-17T03:14:45.558881" elapsed="0.000265"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:45.559195" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:14:45.559365" 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-04-17T03:14:45.558461" 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-04-17T03:14:45.559541" elapsed="0.000225"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:14:45.557730" elapsed="0.002129"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:45.560432" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:45.560127" elapsed="0.000331"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:45.561184" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:45.560973" elapsed="0.000237"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:45.561258" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:14:45.561409" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:45.560643" elapsed="0.000790"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:45.561580" elapsed="0.000223"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:45.559995" elapsed="0.001849"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:45.562488" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:45.562104" elapsed="0.000410"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:45.563358" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:45.563146" elapsed="0.000237"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:45.563435" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:14:45.563612" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:45.562737" 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-04-17T03:14:45.563816" elapsed="0.000263"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:45.561973" elapsed="0.002151"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:14:45.546538" elapsed="0.017622"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:14:45.564226" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:14:45.564448" 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-04-17T03:14:45.545251" elapsed="0.019228"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:45.544870" elapsed="0.019656"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:45.564723" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:45.564568" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:45.544845" elapsed="0.019955"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:14:45.566117" 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-04-17T03:14:45.565055" elapsed="0.001098"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:14:45.566204" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:14:45.540775" elapsed="0.025560"/>
</kw>
<msg time="2026-04-17T03:14:45.566393" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:45.526997" elapsed="0.039446"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:14:45.579819" elapsed="0.000058"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/${file_name} exists. 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-04-17T03:14:45.595688" elapsed="0.000078"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:14:45.611025" elapsed="0.000054"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:45.611325" 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-04-17T03:14:45.611507" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:45.611958" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:45.611785" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:45.611766" 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-04-17T03:14:45.612183" 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-04-17T03:14:45.612346" elapsed="0.000037"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:45.612527" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:14:45.611725" elapsed="0.000855"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:14:45.611591" elapsed="0.001016"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:45.612750" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:45.612838" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:14:45.613024" 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-04-17T03:14:45.521890" elapsed="0.091164"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:45.614344" 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-04-17T03:14:45.614029" elapsed="0.000369"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:14:45.619730" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:14:45.821492" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:14:46.224486" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:14:46.227637" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:45.616678" elapsed="0.616120">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:14:45.614466" elapsed="0.618575">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:46.233416" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:46.233107" elapsed="0.000401"/>
</branch>
<status status="FAIL" start="2026-04-17T03:14:45.614448" elapsed="0.619094">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:14:46.234278" elapsed="0.000054"/>
</kw>
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:46.234422" elapsed="0.000047"/>
</return>
<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-04-17T03:14:45.613359" elapsed="0.621279">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:46.234771" elapsed="0.000028"/>
</return>
<arg>${BGP_VAR_FOLDER}/bgp_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="FAIL" start="2026-04-17T03:14:45.496122" elapsed="0.738831">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="FAIL" start="2026-04-17T03:14:45.420798" elapsed="0.814526">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:14:46.241346" elapsed="0.000422"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:14:46.240899" elapsed="0.000974"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:46.243566" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:46.243385" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:46.243354" elapsed="0.000282"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:46.248739" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:46.248624" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:46.248606" elapsed="0.000204"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:46.249882" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:14:46.249453" elapsed="0.000458"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:14:46.250398" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:14:46.250093" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:14:46.250470" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:14:46.250633" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:14:46.249066" elapsed="0.001591"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:46.257594" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:46.257469" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:46.257449" elapsed="0.000215"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:46.259070" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:46.258896" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:46.258876" elapsed="0.000264"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:14:46.259666" level="INFO">${karaf_connection_index} = 43</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:14:46.259318" elapsed="0.000376"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:46.260104" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:14:46.259857" elapsed="0.000273"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:14:46.262466" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:14:46.260636" elapsed="0.002584">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:14:46.263511" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:14:46.263558" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:46.260293" elapsed="0.003290"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:14:46.264523" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:14:46.264239" elapsed="0.001137">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:14:46.265579" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:14:46.265629" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:46.263777" elapsed="0.001876"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:14:46.266689" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Empty_5"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:14:46.266008" elapsed="0.000749">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Empty_5"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:14:46.265744" elapsed="0.001096">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Empty_5"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:14:46.265717" elapsed="0.001160">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Empty_5"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:46.267064" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:46.267341" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:46.267154" elapsed="0.000242"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:46.267137" elapsed="0.000282"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:14:46.267457" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:14:46.270313" elapsed="0.000158"/>
</kw>
<msg time="2026-04-17T03:14:46.270540" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:46.269049" elapsed="0.001630"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:46.271040" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:46.271454" 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-04-17T03:14:46.268379" elapsed="0.003273"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:14:46.267767" elapsed="0.003950"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:14:46.258525" elapsed="0.013280">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Empty_5"</status>
</kw>
<msg time="2026-04-17T03:14:46.271910" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:14:46.271971" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Verify_Ipv6_Topology_Empty_5"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:46.257822" elapsed="0.014175"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:14:46.272185" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:46.272074" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:46.272055" elapsed="0.000195"/>
</if>
<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-04-17T03:14:46.273169" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:46.273061" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:46.273043" elapsed="0.000194"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:46.273543" level="INFO">index=15
host=10.30.170.120
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-04-17T03:14:46.273651" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
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-04-17T03:14:46.273401" elapsed="0.000277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:46.274129" level="INFO">{1: 43}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:46.273831" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:46.274642" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:46.274360" elapsed="0.000329"/>
</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-04-17T03:14:46.275393" elapsed="0.000277"/>
</kw>
<msg time="2026-04-17T03:14:46.275791" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:14:46.275849" level="INFO">${old_connection_index} = 43</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:46.274879" elapsed="0.000995"/>
</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-04-17T03:14:46.276716" elapsed="0.000200"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:14:46.278028" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:14:46.277590" elapsed="0.001671">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:46.277100" elapsed="0.002266"/>
</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-04-17T03:14:46.280225" elapsed="0.000280"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:46.279542" elapsed="0.001053"/>
</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-04-17T03:14:46.276201" elapsed="0.004441"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:46.275972" elapsed="0.004719"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:46.275952" elapsed="0.004765"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:14:46.281597" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:14:46.281282" elapsed="0.000343"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:14:46.281675" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:14:46.281833" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:14:46.280946" elapsed="0.000912"/>
</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-04-17T03:14:46.282029" elapsed="0.000431"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:46.282739" level="INFO">index=44
host=10.30.170.120
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-04-17T03:14:46.282838" level="INFO">${karaf_connection_object} = index=44
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:14:46.282629" elapsed="0.000235"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:46.283052" elapsed="0.002326"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:14:46.285807" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:14:46.287123" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:14:46.285542" elapsed="0.002070">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:14:46.304566" elapsed="0.000877"/>
</kw>
<msg time="2026-04-17T03:14:46.305561" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:46.302911" elapsed="0.002820"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:46.305995" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:46.306184" elapsed="0.000024"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:14:46.288494" elapsed="0.017780"/>
</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-04-17T03:14:46.287957" elapsed="0.018375"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:14:46.272732" elapsed="0.033692">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:46.306855" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:14:46.306951" elapsed="0.000024"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:14:46.257075" elapsed="0.049996">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:14:46.307251" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:14:46.307322" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:46.251058" elapsed="0.056290"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:46.307883" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:46.307439" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:46.307416" elapsed="0.000566"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:14:46.250897" elapsed="0.057111"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:14:46.250717" elapsed="0.057332"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:14:46.248253" elapsed="0.059907"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:14:46.242792" elapsed="0.065440"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:46.242132" elapsed="0.066148"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:14:46.236967" elapsed="0.071368"/>
</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-04-17T03:14:46.364909" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:46.364492" elapsed="0.000475"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:46.365851" 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-04-17T03:14:46.365540" elapsed="0.000426">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-04-17T03:14:46.366089" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:46.365189" elapsed="0.000932"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:46.366710" 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-04-17T03:14:46.366310" elapsed="0.000427"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:14:46.367070" 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-04-17T03:14:46.367333" 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-04-17T03:14:46.366902" elapsed="0.000465"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:46.367895" 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-04-17T03:14:46.367623" elapsed="0.000356"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:46.369188" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:46.368814" elapsed="0.000430"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:14:46.369691" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:14:46.369410" 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-04-17T03:14:46.370105" 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-04-17T03:14:46.370326" elapsed="0.000037"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:14:46.370523" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:14:46.369959" elapsed="0.000628"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:14:46.369772" elapsed="0.000845"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:14:46.370665" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:14:46.370849" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:14:46.368433" elapsed="0.002442"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:46.368068" elapsed="0.002839"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:46.371103" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:46.370950" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:46.368043" elapsed="0.003136"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:14:46.372004" 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-04-17T03:14:46.371366" elapsed="0.000674"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:14:46.372090" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:14:46.363811" elapsed="0.008424"/>
</kw>
<msg time="2026-04-17T03:14:46.372292" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:46.350447" elapsed="0.021896"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:14:46.390187" elapsed="0.000049"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_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-04-17T03:14:46.404263" 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/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-04-17T03:14:46.418354" elapsed="0.000032"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:46.418595" 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-04-17T03:14:46.418881" 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-04-17T03:14:46.419386" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:46.419167" elapsed="0.000289"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:46.419149" 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-04-17T03:14:46.419647" 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-04-17T03:14:46.419862" 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-04-17T03:14:46.420056" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:14:46.419109" elapsed="0.001004"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:14:46.418987" elapsed="0.001154"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:46.420291" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:46.420370" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:14:46.420529" 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-04-17T03:14:46.345794" elapsed="0.074762"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:46.422046" 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-04-17T03:14:46.421707" elapsed="0.000435">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-04-17T03:14:46.422246" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:46.421293" elapsed="0.000977"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:46.422640" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:46.422343" elapsed="0.000357"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:14:46.423315" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:46.422920" elapsed="0.000427"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:46.422724" elapsed="0.000661"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:46.422325" elapsed="0.001082"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:46.425892" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:14:46.423582" elapsed="0.002336"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:14:46.425989" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:14:46.426177" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:14:46.420909" elapsed="0.005295"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:46.427622" 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-04-17T03:14:46.427374" elapsed="0.000312">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-04-17T03:14:46.427806" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:46.426956" elapsed="0.000875"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:14:46.428088" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:14:46.427944" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:46.427906" 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-04-17T03:14:46.428320" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:46.428540" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:14:46.428608" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:14:46.430904" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:14:46.426543" elapsed="0.004435"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:46.432629" 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-04-17T03:14:46.432348" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:46.433160" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:46.432849" elapsed="0.000356"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:14:46.438429" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:46.640070" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:47.042737" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:47.045335" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:14:46.435668" elapsed="0.615204">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:14:46.433276" elapsed="0.617848">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:47.051697" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:47.051215" elapsed="0.000640"/>
</branch>
<status status="FAIL" start="2026-04-17T03:14:46.433256" elapsed="0.618653">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:47.052875" elapsed="0.000087"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:47.053222" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:47.053134" elapsed="0.000184"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:47.053090" elapsed="0.000276"/>
</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-04-17T03:14:47.053686" elapsed="0.000047"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:14:47.053841" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:14:46.431425" elapsed="0.622696">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:47.054293" elapsed="0.000035"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:14:46.322079" elapsed="0.732430">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:47.055257" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:47.054813" elapsed="0.000610"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:47.054773" elapsed="0.000705"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:47.055552" elapsed="0.000222"/>
</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="FAIL" start="2026-04-17T03:14:46.313643" elapsed="0.742549">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:49.118000" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:49.117568" elapsed="0.000468"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:49.118824" 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-04-17T03:14:49.118550" elapsed="0.000352">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-04-17T03:14:49.119014" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:49.118210" elapsed="0.000829"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:49.119592" 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-04-17T03:14:49.119202" elapsed="0.000417"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:14:49.119920" 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-04-17T03:14:49.120108" 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-04-17T03:14:49.119779" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:49.120544" 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-04-17T03:14:49.120294" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:49.121644" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:49.121340" elapsed="0.000348"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:14:49.122155" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:14:49.121851" elapsed="0.000329"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:49.122513" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:49.122717" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:49.122887" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:14:49.122380" elapsed="0.000581"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:14:49.122235" elapsed="0.000757"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:14:49.123040" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:14:49.123211" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:14:49.121018" elapsed="0.002218"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:49.120691" elapsed="0.002577"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:49.123436" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:49.123292" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:49.120649" elapsed="0.002863"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:14:49.124124" 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-04-17T03:14:49.123658" elapsed="0.000494"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:14:49.124256" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:14:49.116914" elapsed="0.007469"/>
</kw>
<msg time="2026-04-17T03:14:49.124437" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:49.103528" elapsed="0.020956"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:14:49.139751" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:49.155493" elapsed="0.000100"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:14:49.169887" elapsed="0.000056"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:49.170158" 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-04-17T03:14:49.170340" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:49.170784" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:49.170618" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:49.170599" 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-04-17T03:14:49.171040" 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-04-17T03:14:49.171252" elapsed="0.000029"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:49.171441" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:14:49.170549" elapsed="0.000947"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:14:49.170423" elapsed="0.001102"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:49.171669" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:49.171749" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:14:49.171906" 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-04-17T03:14:49.098989" elapsed="0.072962"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:49.173987" 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-04-17T03:14:49.173632" elapsed="0.000439">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-04-17T03:14:49.174169" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:49.173079" elapsed="0.001114"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:49.174586" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:49.174279" elapsed="0.000372"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:14:49.175241" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:49.174898" elapsed="0.000370"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:49.174683" elapsed="0.000621"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:49.174247" elapsed="0.001081"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:49.178057" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:14:49.175479" elapsed="0.002606"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:14:49.178145" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:14:49.178323" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:14:49.172475" elapsed="0.005878"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:49.179825" 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-04-17T03:14:49.179529" elapsed="0.000376">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-04-17T03:14:49.180024" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:49.179155" elapsed="0.000895"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:14:49.180278" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-17T03:14:49.180129" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:49.180108" elapsed="0.000262"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:49.180539" 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-04-17T03:14:49.180748" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:14:49.180818" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:14:49.183218" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:14:49.178753" elapsed="0.004493"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:49.184837" 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-04-17T03:14:49.184524" elapsed="0.000364"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:49.185335" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:49.185073" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:14:49.199548" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:49.401110" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:49.803594" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:49.805267" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:14:49.187854" elapsed="0.619946">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:14:49.185452" elapsed="0.622719">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:49.808686" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:49.808264" elapsed="0.000580"/>
</branch>
<status status="FAIL" start="2026-04-17T03:14:49.185433" elapsed="0.623466">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:49.809925" elapsed="0.000094"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:49.810274" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:49.810187" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:49.810147" elapsed="0.000276"/>
</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-04-17T03:14:49.810748" elapsed="0.000047"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:14:49.810906" elapsed="0.000070"/>
</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-04-17T03:14:49.183604" elapsed="0.627591">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:49.811392" elapsed="0.000052"/>
</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-04-17T03:14:49.075167" elapsed="0.736505">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:49.812343" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:49.811893" elapsed="0.000614"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:49.811855" elapsed="0.000706"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:49.812636" elapsed="0.000034"/>
</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="FAIL" start="2026-04-17T03:14:49.066679" elapsed="0.746184">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:51.872020" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:51.871597" elapsed="0.000459"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:51.872836" 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-04-17T03:14:51.872563" elapsed="0.000349">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-04-17T03:14:51.873025" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:51.872226" elapsed="0.000912"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:51.873708" 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-04-17T03:14:51.873307" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:14:51.874065" 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-04-17T03:14:51.874252" 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-04-17T03:14:51.873896" elapsed="0.000382"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:51.874684" 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-04-17T03:14:51.874434" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:51.875810" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:51.875461" elapsed="0.000396"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:14:51.876362" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:14:51.876061" elapsed="0.000328"/>
</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-04-17T03:14:51.876779" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:51.877012" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:51.877191" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:14:51.876640" elapsed="0.000607"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:14:51.876461" elapsed="0.000817"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:14:51.877326" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:14:51.877496" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:14:51.875138" elapsed="0.002383"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:51.874809" elapsed="0.002744"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:51.877723" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:51.877579" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:51.874784" elapsed="0.003014"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:14:51.878425" 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-04-17T03:14:51.877953" elapsed="0.000502"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:14:51.878517" elapsed="0.000033"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:14:51.870960" elapsed="0.007700"/>
</kw>
<msg time="2026-04-17T03:14:51.878728" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:51.857884" elapsed="0.020904"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:14:51.891625" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:51.904326" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:51.917194" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:51.917401" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:51.917577" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:51.918002" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:51.917834" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:51.917812" 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-04-17T03:14:51.918265" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:51.918430" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:51.918589" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:14:51.917760" elapsed="0.000880"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:14:51.917653" elapsed="0.001013"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:51.918807" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:51.918881" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:14:51.919025" 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-04-17T03:14:51.853194" elapsed="0.065857"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:51.920345" 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-04-17T03:14:51.920083" elapsed="0.000337">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/ipv6/ipv6_topology_empty/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-17T03:14:51.920514" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:51.919711" elapsed="0.000827"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:51.920853" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:51.920606" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:14:51.921422" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:51.921127" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:51.920948" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:51.920589" elapsed="0.000913"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:51.924013" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:14:51.921655" elapsed="0.002385"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:14:51.924091" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:14:51.924245" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:14:51.919375" elapsed="0.004895"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:51.925485" 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-04-17T03:14:51.925251" elapsed="0.000297">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-04-17T03:14:51.925685" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:51.924894" elapsed="0.000816"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:14:51.925916" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-04-17T03:14:51.925780" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:51.925762" elapsed="0.000254"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:51.926195" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:51.926368" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:14:51.926445" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:14:51.928573" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:14:51.924573" elapsed="0.004026"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:51.930036" 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-04-17T03:14:51.929766" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:51.930496" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:51.930254" 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-04-17T03:14:51.935794" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:52.137401" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:52.539818" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:52.541749" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:14:51.932723" elapsed="0.612896">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:14:51.930605" elapsed="0.615211">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:52.546251" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:52.545888" elapsed="0.000498"/>
</branch>
<status status="FAIL" start="2026-04-17T03:14:51.930587" elapsed="0.615849">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:52.547191" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:52.547403" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:52.547344" elapsed="0.000125"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:52.547316" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:52.547712" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:14:52.547817" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:14:51.928912" elapsed="0.619093">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:52.548203" 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-04-17T03:14:51.830335" elapsed="0.718017">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:52.548777" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:52.548495" elapsed="0.000393"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:52.548469" elapsed="0.000454"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:52.548997" elapsed="0.000024"/>
</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="FAIL" start="2026-04-17T03:14:51.823156" elapsed="0.725993">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:54.614643" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:54.614121" elapsed="0.000567"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:54.615603" 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-04-17T03:14:54.615273" elapsed="0.000418">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-04-17T03:14:54.615794" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:54.614873" elapsed="0.000952"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:54.616433" 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-04-17T03:14:54.616025" elapsed="0.000436"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:14:54.616816" 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-04-17T03:14:54.617066" 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-04-17T03:14:54.616653" elapsed="0.000443"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:54.617616" 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-04-17T03:14:54.617292" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:54.618911" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:54.618589" elapsed="0.000397"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:14:54.619464" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:14:54.619180" elapsed="0.000311"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:54.619942" elapsed="0.000027"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:54.620182" 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-04-17T03:14:54.620371" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:14:54.619761" elapsed="0.000668"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:14:54.619587" elapsed="0.000952"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:14:54.620593" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:14:54.620770" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:14:54.618241" elapsed="0.002555"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:54.617777" elapsed="0.003050"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:54.621016" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:54.620853" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:54.617749" elapsed="0.003369"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:14:54.621781" 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-04-17T03:14:54.621274" elapsed="0.000543"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:14:54.621881" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_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-04-17T03:14:54.613250" elapsed="0.008791"/>
</kw>
<msg time="2026-04-17T03:14:54.622097" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:54.598519" elapsed="0.023643"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:14:54.637667" elapsed="0.000059"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:14:54.650695" elapsed="0.000043"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:14:54.664996" elapsed="0.000037"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:54.665249" 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-04-17T03:14:54.665438" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:54.665865" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:54.665711" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:54.665693" 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-04-17T03:14:54.666113" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:54.666278" 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-04-17T03:14:54.666441" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:14:54.665652" elapsed="0.000841"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:14:54.665522" elapsed="0.000999"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:54.666665" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:54.666821" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:14:54.666998" 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-04-17T03:14:54.593030" elapsed="0.073996"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:54.668529" 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-04-17T03:14:54.668232" elapsed="0.000375">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-04-17T03:14:54.668702" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:54.667797" elapsed="0.000930"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:54.669077" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:54.668797" elapsed="0.000338"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:14:54.669676" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:54.669348" elapsed="0.000354"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:54.669159" elapsed="0.000579"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:54.668778" elapsed="0.000982"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:54.672278" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:14:54.669982" elapsed="0.002323"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:14:54.672358" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:14:54.672518" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:14:54.667367" elapsed="0.005175"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:54.673772" 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-04-17T03:14:54.673529" elapsed="0.000307">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-04-17T03:14:54.673946" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:54.673192" elapsed="0.000781"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:14:54.674178" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:14:54.674043" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:54.674025" elapsed="0.000237"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:54.674406" 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-04-17T03:14:54.674574" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:14:54.674639" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:14:54.747840" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:14:54.672848" elapsed="0.075038"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:54.749673" 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-04-17T03:14:54.749355" elapsed="0.000371"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:54.750154" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:54.749880" elapsed="0.000327"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:14:54.755763" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:54.957376" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:55.360194" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:55.362862" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:14:54.752517" elapsed="0.616236">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:14:54.750302" elapsed="0.618649">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:55.369325" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:55.369017" elapsed="0.000406"/>
</branch>
<status status="FAIL" start="2026-04-17T03:14:54.750272" elapsed="0.619184">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:55.370161" elapsed="0.000047"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:55.370398" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:55.370338" elapsed="0.000126"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:55.370307" elapsed="0.000188"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:55.370699" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:14:55.370798" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:14:54.748416" elapsed="0.622571">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:55.371098" 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-04-17T03:14:54.567596" elapsed="0.803640">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:55.371691" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:55.371431" elapsed="0.000364"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:55.371401" elapsed="0.000427"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:55.371874" elapsed="0.000021"/>
</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="FAIL" start="2026-04-17T03:14:54.558355" elapsed="0.813762">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:57.430598" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:57.430194" elapsed="0.000439"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:57.431426" 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-04-17T03:14:57.431167" elapsed="0.000336">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-04-17T03:14:57.431600" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:57.430806" elapsed="0.000819"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:57.432195" 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-04-17T03:14:57.431790" elapsed="0.000432"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:14:57.432528" 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-04-17T03:14:57.432681" 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-04-17T03:14:57.432384" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:57.433150" 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-04-17T03:14:57.432863" elapsed="0.000333"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:57.434231" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:57.433904" elapsed="0.000372"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:14:57.434707" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:14:57.434437" 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-04-17T03:14:57.435084" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:57.435294" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:57.435466" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:14:57.434948" elapsed="0.000575"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:14:57.434786" elapsed="0.000767"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:14:57.435600" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:14:57.435770" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:14:57.433582" elapsed="0.002213"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:57.433272" elapsed="0.002555"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:57.436015" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:57.435852" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:57.433249" elapsed="0.002845"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:14:57.436687" 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-04-17T03:14:57.436237" elapsed="0.000477"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:14:57.436761" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:14:57.429448" elapsed="0.007437"/>
</kw>
<msg time="2026-04-17T03:14:57.436956" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:57.416070" elapsed="0.020937"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:14:57.452128" elapsed="0.000042"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:14:57.467787" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/ipv6_topology_empty/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:57.480457" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:57.480695" 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-04-17T03:14:57.480885" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:57.481306" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:57.481158" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:57.481143" 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-04-17T03:14:57.481527" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:57.481693" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:57.481882" elapsed="0.000024"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:14:57.481110" elapsed="0.000854"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:14:57.480980" elapsed="0.001014"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:57.482144" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:57.482220" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:14:57.482348" 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-04-17T03:14:57.411636" elapsed="0.070738"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:57.483691" 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-04-17T03:14:57.483419" elapsed="0.000349">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-04-17T03:14:57.483861" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:57.483057" elapsed="0.000828"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:57.484221" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:57.483970" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:14:57.484776" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:57.484480" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:57.484302" elapsed="0.000573"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:57.483951" elapsed="0.000948"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:57.487353" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:14:57.485106" elapsed="0.002273"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:14:57.487430" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:14:57.487585" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:14:57.482702" elapsed="0.004908"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:57.488827" 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-04-17T03:14:57.488594" elapsed="0.000298">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-04-17T03:14:57.489006" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:57.488257" elapsed="0.000773"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:14:57.489253" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:14:57.489117" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:57.489098" elapsed="0.000240"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:57.489483" 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-04-17T03:14:57.489651" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:14:57.489715" elapsed="0.000014"/>
</return>
<msg time="2026-04-17T03:14:57.491833" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:14:57.487917" elapsed="0.003943"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:57.493334" 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-04-17T03:14:57.493023" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:57.493778" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:57.493532" 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-04-17T03:14:57.499072" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:57.700585" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:58.103324" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:58.105916" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:14:57.496113" elapsed="0.615356">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:14:57.493898" elapsed="0.617792">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:58.112254" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:58.111782" elapsed="0.000626"/>
</branch>
<status status="FAIL" start="2026-04-17T03:14:57.493876" elapsed="0.618587">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:58.113449" elapsed="0.000060"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:58.113871" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:58.113782" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:58.113740" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:58.114384" elapsed="0.000051"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:14:58.114547" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:14:57.492188" elapsed="0.622610">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:58.115003" elapsed="0.000036"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:14:57.388745" elapsed="0.726481">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:58.115915" elapsed="0.000118"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:58.115453" elapsed="0.000699"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:58.115413" elapsed="0.000795"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:58.116283" elapsed="0.000035"/>
</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="FAIL" start="2026-04-17T03:14:57.382362" elapsed="0.734153">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:14:58.116761" level="FAIL">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 5 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-17T03:14:46.308789" elapsed="11.808229">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 5 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verifies that example-ipv6-topology is empty</doc>
<status status="FAIL" start="2026-04-17T03:14:46.308487" elapsed="11.808810">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 5 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verifies that example-ipv6-topology is empty after deconfiguring peer for the first time.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:14:46.235965" elapsed="11.881733">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 5 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv6-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:14:58.121591" elapsed="0.000264"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:14:58.121284" 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-04-17T03:14:58.123030" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:58.122880" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:58.122860" elapsed="0.000241"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:58.128290" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:58.128180" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:58.128162" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:58.129445" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:14:58.128992" elapsed="0.000484"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:14:58.130054" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:14:58.129669" elapsed="0.000412"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:14:58.130128" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:14:58.130293" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:14:58.128588" elapsed="0.001730"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:58.135911" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:58.135802" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:58.135783" elapsed="0.000212"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:58.137203" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:58.137095" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:58.137077" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:14:58.137767" level="INFO">${karaf_connection_index} = 44</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:14:58.137457" elapsed="0.000338"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:58.138196" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:14:58.137972" elapsed="0.000250"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:14:58.139144" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:14:58.138855" elapsed="0.000946">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:14:58.140010" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:14:58.140056" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:58.138380" elapsed="0.001700"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:14:58.140836" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:14:58.140591" elapsed="0.000981">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:14:58.141768" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:14:58.141816" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:58.140248" elapsed="0.001591"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:14:58.142819" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Stop_All_Exabgps_2"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:14:58.142168" elapsed="0.000715">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Stop_All_Exabgps_2"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:14:58.141918" elapsed="0.001054">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Stop_All_Exabgps_2"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:14:58.141898" elapsed="0.001110">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Stop_All_Exabgps_2"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:58.143172" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:58.143400" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:58.143260" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:58.143243" elapsed="0.000234"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:14:58.143520" elapsed="0.000020"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:14:58.146154" elapsed="0.000156"/>
</kw>
<msg time="2026-04-17T03:14:58.146380" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:58.145040" 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-04-17T03:14:58.147001" elapsed="0.000083"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:58.147408" 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-04-17T03:14:58.144380" 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-04-17T03:14:58.143809" elapsed="0.003945"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:14:58.136756" elapsed="0.011092">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Stop_All_Exabgps_2"</status>
</kw>
<msg time="2026-04-17T03:14:58.147980" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:14:58.148028" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Stop_All_Exabgps_2"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:58.136148" elapsed="0.011904"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:14:58.148246" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:58.148132" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:58.148113" elapsed="0.000207"/>
</if>
<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-04-17T03:14:58.149491" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:58.149324" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:58.149305" elapsed="0.000255"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:58.149877" level="INFO">index=15
host=10.30.170.120
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-04-17T03:14:58.150143" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
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-04-17T03:14:58.149735" elapsed="0.000441"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:58.150624" level="INFO">{1: 44}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:58.150336" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:58.151123" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:58.150844" elapsed="0.000328"/>
</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-04-17T03:14:58.151815" elapsed="0.000365"/>
</kw>
<msg time="2026-04-17T03:14:58.152300" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:14:58.152353" level="INFO">${old_connection_index} = 44</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:58.151382" elapsed="0.001003"/>
</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-04-17T03:14:58.153287" elapsed="0.000439"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:14:58.154864" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:14:58.154429" elapsed="0.001427">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:58.153906" elapsed="0.002105"/>
</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-04-17T03:14:58.156741" elapsed="0.000322"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:58.156222" elapsed="0.000929"/>
</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-04-17T03:14:58.152737" elapsed="0.004473"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:58.152486" elapsed="0.004785"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:58.152464" elapsed="0.004836"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:14:58.158322" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:14:58.157998" elapsed="0.000351"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:14:58.158399" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:14:58.158561" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:14:58.157631" elapsed="0.000954"/>
</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-04-17T03:14:58.158743" elapsed="0.000460"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:58.159582" level="INFO">index=45
host=10.30.170.120
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-04-17T03:14:58.159689" level="INFO">${karaf_connection_object} = index=45
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:14:58.159448" elapsed="0.000267"/>
</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-04-17T03:14:58.159885" elapsed="0.002499"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:14:58.162881" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:14:58.164096" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:14:58.162590" elapsed="0.001938">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:14:58.180376" elapsed="0.000417"/>
</kw>
<msg time="2026-04-17T03:14:58.180895" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:58.178717" elapsed="0.002357"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:58.181250" elapsed="0.000025"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:58.181457" elapsed="0.000023"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:14:58.165560" elapsed="0.015988"/>
</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-04-17T03:14:58.164831" elapsed="0.016767"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:14:58.148864" elapsed="0.032830">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:58.182109" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:14:58.182196" elapsed="0.000029"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:14:58.135458" elapsed="0.046870">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:14:58.182449" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:14:58.182494" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:58.130706" elapsed="0.051813"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:58.182874" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:58.182607" elapsed="0.000474"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:58.182586" elapsed="0.000525"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:14:58.130560" elapsed="0.052578"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:14:58.130378" elapsed="0.052798"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:14:58.127795" elapsed="0.055453"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:14:58.122571" elapsed="0.060741"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:58.122109" elapsed="0.061253"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:14:58.118677" elapsed="0.064743"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:14:58.193333" level="INFO">Executing command 'cat exaipv4.log'.</msg>
<msg time="2026-04-17T03:14:58.206296" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:14:58.206569" level="INFO">${output_log} = 03:13:55 | 3402   | welcome         | Thank you for using ExaBGP
03:13:55 | 3402   | version         | 4.2.4
03:13:55 | 3402   | interpreter     | 3.10.12 (main, Jan 26 2026, 14:55:28) [GCC 11.4.0]
03...</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-04-17T03:14:58.193170" elapsed="0.013465"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:58.208255" level="INFO">03:13:55 | 3402   | welcome         | Thank you for using ExaBGP
03:13:55 | 3402   | version         | 4.2.4
03:13:55 | 3402   | interpreter     | 3.10.12 (main, Jan 26 2026, 14:55:28) [GCC 11.4.0]
03:13:55 | 3402   | os              | Linux releng-26932-188-0-builder-0 5.15.0-171-generic #181-Ubuntu SMP Fri Feb 6 22:44:50 UTC 2026 x86_64
03:13:55 | 3402   | installation    | /tmp/defaultvenv
03:13:55 | 3402   | advice          | environment file missing
03:13:55 | 3402   | advice          | generate it using "exabgp --fi &gt; /tmp/defaultvenv/etc/exabgp/exabgp.env"
03:13:55 | 3402   | cli             | could not find the named pipes (exabgp.in and exabgp.out) required for the cli
03:13:55 | 3402   | cli             | we scanned the following folders (the number is your PID):
03:13:55 | 3402   | cli control     |  - /run/exabgp/
03:13:55 | 3402   | cli control     |  - /run/1001/
03:13:55 | 3402   | cli control     |  - /run/
03:13:55 | 3402   | cli control     |  - /var/run/exabgp/
03:13:55 | 3402   | cli control     |  - /var/run/1001/
03:13:55 | 3402   | cli control     |  - /var/run/
03:13:55 | 3402   | cli control     |  - /tmp/defaultvenv/run/exabgp/
03:13:55 | 3402   | cli control     |  - /tmp/defaultvenv/run/1001/
03:13:55 | 3402   | cli control     |  - /tmp/defaultvenv/run/
03:13:55 | 3402   | cli control     |  - /tmp/defaultvenv/var/run/exabgp/
03:13:55 | 3402   | cli control     |  - /tmp/defaultvenv/var/run/1001/
03:13:55 | 3402   | cli control     |  - /tmp/defaultvenv/var/run/
03:13:55 | 3402   | cli control     | please make them in one of the folder with the following commands:
03:13:55 | 3402   | cli control     | &gt; mkfifo /home/jenkins/run/exabgp.{in,out}
03:13:55 | 3402   | cli control     | &gt; chmod 600 /home/jenkins/run/exabgp.{in,out}
03:13:55 | 3402   | cli control     | &gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}
03:13:55 | 3402   | configuration   | performing reload of exabgp 4.2.4
03:13:55 | 3402   | configuration   | &gt; neighbor         | '10.30.170.120'
03:13:55 | 3402   | configuration   | . router-id        | '127.0.0.1'
03:13:55 | 3402   | configuration   | . local-address    | '127.0.0.1'
03:13:55 | 3402   | configuration   | . local-as         | '64496'
03:13:55 | 3402   | configuration   | . peer-as          | '64496'
03:13:55 | 3402   | configuration   | &gt; family           | 
03:13:55 | 3402   | configuration   | . ipv4             | 'unicast'
03:13:55 | 3402   | configuration   | &lt; family           | 
03:13:55 | 3402   | configuration   | &lt; neighbor         | 
03:13:55 | 3402   | reactor         | new peer: neighbor 10.30.170.120 local-ip 127.0.0.1 local-as 64496 peer-as 64496 router-id 127.0.0.1 family-allowed in-open
03:13:55 | 3402   | reactor         | loaded new configuration successfully
03:13:55 | 3402   | reactor         | initialising connection to peer-1
03:13:55 | 3402   | outgoing-1      | attempting connection to 10.30.170.120:1790
03:13:55 | 3402   | 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
03:13:55 | 3402   | outgoing-1      | outgoing-1 127.0.0.1-10.30.170.120, closing connection
03:13:55 | 3402   | outgoing-1      | peer reset, message [closing connection] error[Broken TCP connection]
03:13:55 | 3402   | outgoing-1      | outgoing-1 127.0.0.1-10.30.170.120, closing connection
03:13:55 | 3402   | reactor         | initialising connection to peer-1
03:13:55 | 3402   | outgoing-2      | attempting connection to 10.30.170.120:1790
03:13:55 | 3402   | 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
03:13:55 | 3402   | outgoing-2      | outgoing-2 127.0.0.1-10.30.170.120, closing connection
03:13:55 | 3402   | outgoing-2      | peer reset, message [closing connection] error[Broken TCP connection]
03:13:55 | 3402   | outgoing-2      | outgoing-2 127.0.0.1-10.30.170.120, closing connection
03:13:56 | 3402   | reactor         | initialising connection to peer-1
03:13:56 | 3402   | outgoing-3      | attempting connection to 10.30.170.120:1790
03:13:56 | 3402   | 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
03:13:56 | 3402   | outgoing-3      | outgoing-3 127.0.0.1-10.30.170.120, closing connection
03:13:56 | 3402   | outgoing-3      | peer reset, message [closing connection] error[Broken TCP connection]
03:13:56 | 3402   | outgoing-3      | outgoing-3 127.0.0.1-10.30.170.120, closing connection
03:13:58 | 3402   | reactor         | initialising connection to peer-1
03:13:58 | 3402   | outgoing-4      | attempting connection to 10.30.170.120:1790
03:13:58 | 3402   | outgoing-4      | 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
03:13:58 | 3402   | outgoing-4      | outgoing-4 127.0.0.1-10.30.170.120, closing connection
03:13:58 | 3402   | outgoing-4      | peer reset, message [closing connection] error[Broken TCP connection]
03:13:58 | 3402   | outgoing-4      | outgoing-4 127.0.0.1-10.30.170.120, closing connection
03:14:01 | 3402   | reactor         | initialising connection to peer-1
03:14:01 | 3402   | outgoing-5      | attempting connection to 10.30.170.120:1790
03:14:01 | 3402   | outgoing-5      | 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
03:14:01 | 3402   | outgoing-5      | outgoing-5 127.0.0.1-10.30.170.120, closing connection
03:14:01 | 3402   | outgoing-5      | peer reset, message [closing connection] error[Broken TCP connection]
03:14:01 | 3402   | outgoing-5      | outgoing-5 127.0.0.1-10.30.170.120, closing connection
03:14:03 | 3402   | reactor         | ^C received
03:14:03 | 3402   | reactor         | performing shutdown</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:58.207340" elapsed="0.001210"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-04-17T03:14:58.210098" 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-04-17T03:14:58.209144" elapsed="0.001055"/>
</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-04-17T03:14:58.192701" elapsed="0.017624"/>
</kw>
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-04-17T03:14:58.211644" level="INFO">${output} =  </msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-04-17T03:14:58.211351" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:58.212450" level="INFO"> </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:58.212001" elapsed="0.000525"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:14:58.214057" 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-04-17T03:14:58.213399" elapsed="0.000713"/>
</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-04-17T03:14:58.214381" elapsed="0.000354"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-04-17T03:14:58.212894" elapsed="0.001993"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:14:58.246068" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:14:58.246291" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-188-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-04-17T03:14:58.215184" elapsed="0.031167"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:58.247124" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:58.246647" elapsed="0.000555"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:14:58.249855" 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-04-17T03:14:58.248300" elapsed="0.001708"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:14:58.406291" level="INFO">[?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:14:58.406508" level="INFO">${output} = [?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-188-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-04-17T03:14:58.250305" elapsed="0.156232"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:58.407415" level="INFO">[?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:58.407074" elapsed="0.000391"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:58.406669" elapsed="0.000831"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:58.406634" elapsed="0.000894"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-04-17T03:14:58.247655" elapsed="0.159931"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-04-17T03:14:58.210768" elapsed="0.196880"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:14:58.407990" 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-04-17T03:14:58.408180" level="INFO">${Log_Content} = 03:13:55 | 3402   | welcome         | Thank you for using ExaBGP
03:13:55 | 3402   | version         | 4.2.4
03:13:55 | 3402   | interpreter     | 3.10.12 (main, Jan 26 2026, 14:55:28) [GCC 11.4.0]
03...</msg>
<var>${Log_Content}</var>
<arg>${EXABGP2_LOG}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-17T03:14:58.407809" elapsed="0.000400"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:58.408675" level="INFO">03:13:55 | 3402   | welcome         | Thank you for using ExaBGP
03:13:55 | 3402   | version         | 4.2.4
03:13:55 | 3402   | interpreter     | 3.10.12 (main, Jan 26 2026, 14:55:28) [GCC 11.4.0]
03:13:55 | 3402   | os              | Linux releng-26932-188-0-builder-0 5.15.0-171-generic #181-Ubuntu SMP Fri Feb 6 22:44:50 UTC 2026 x86_64
03:13:55 | 3402   | installation    | /tmp/defaultvenv
03:13:55 | 3402   | advice          | environment file missing
03:13:55 | 3402   | advice          | generate it using "exabgp --fi &gt; /tmp/defaultvenv/etc/exabgp/exabgp.env"
03:13:55 | 3402   | cli             | could not find the named pipes (exabgp.in and exabgp.out) required for the cli
03:13:55 | 3402   | cli             | we scanned the following folders (the number is your PID):
03:13:55 | 3402   | cli control     |  - /run/exabgp/
03:13:55 | 3402   | cli control     |  - /run/1001/
03:13:55 | 3402   | cli control     |  - /run/
03:13:55 | 3402   | cli control     |  - /var/run/exabgp/
03:13:55 | 3402   | cli control     |  - /var/run/1001/
03:13:55 | 3402   | cli control     |  - /var/run/
03:13:55 | 3402   | cli control     |  - /tmp/defaultvenv/run/exabgp/
03:13:55 | 3402   | cli control     |  - /tmp/defaultvenv/run/1001/
03:13:55 | 3402   | cli control     |  - /tmp/defaultvenv/run/
03:13:55 | 3402   | cli control     |  - /tmp/defaultvenv/var/run/exabgp/
03:13:55 | 3402   | cli control     |  - /tmp/defaultvenv/var/run/1001/
03:13:55 | 3402   | cli control     |  - /tmp/defaultvenv/var/run/
03:13:55 | 3402   | cli control     | please make them in one of the folder with the following commands:
03:13:55 | 3402   | cli control     | &gt; mkfifo /home/jenkins/run/exabgp.{in,out}
03:13:55 | 3402   | cli control     | &gt; chmod 600 /home/jenkins/run/exabgp.{in,out}
03:13:55 | 3402   | cli control     | &gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}
03:13:55 | 3402   | configuration   | performing reload of exabgp 4.2.4
03:13:55 | 3402   | configuration   | &gt; neighbor         | '10.30.170.120'
03:13:55 | 3402   | configuration   | . router-id        | '127.0.0.1'
03:13:55 | 3402   | configuration   | . local-address    | '127.0.0.1'
03:13:55 | 3402   | configuration   | . local-as         | '64496'
03:13:55 | 3402   | configuration   | . peer-as          | '64496'
03:13:55 | 3402   | configuration   | &gt; family           | 
03:13:55 | 3402   | configuration   | . ipv4             | 'unicast'
03:13:55 | 3402   | configuration   | &lt; family           | 
03:13:55 | 3402   | configuration   | &lt; neighbor         | 
03:13:55 | 3402   | reactor         | new peer: neighbor 10.30.170.120 local-ip 127.0.0.1 local-as 64496 peer-as 64496 router-id 127.0.0.1 family-allowed in-open
03:13:55 | 3402   | reactor         | loaded new configuration successfully
03:13:55 | 3402   | reactor         | initialising connection to peer-1
03:13:55 | 3402   | outgoing-1      | attempting connection to 10.30.170.120:1790
03:13:55 | 3402   | 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
03:13:55 | 3402   | outgoing-1      | outgoing-1 127.0.0.1-10.30.170.120, closing connection
03:13:55 | 3402   | outgoing-1      | peer reset, message [closing connection] error[Broken TCP connection]
03:13:55 | 3402   | outgoing-1      | outgoing-1 127.0.0.1-10.30.170.120, closing connection
03:13:55 | 3402   | reactor         | initialising connection to peer-1
03:13:55 | 3402   | outgoing-2      | attempting connection to 10.30.170.120:1790
03:13:55 | 3402   | 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
03:13:55 | 3402   | outgoing-2      | outgoing-2 127.0.0.1-10.30.170.120, closing connection
03:13:55 | 3402   | outgoing-2      | peer reset, message [closing connection] error[Broken TCP connection]
03:13:55 | 3402   | outgoing-2      | outgoing-2 127.0.0.1-10.30.170.120, closing connection
03:13:56 | 3402   | reactor         | initialising connection to peer-1
03:13:56 | 3402   | outgoing-3      | attempting connection to 10.30.170.120:1790
03:13:56 | 3402   | 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
03:13:56 | 3402   | outgoing-3      | outgoing-3 127.0.0.1-10.30.170.120, closing connection
03:13:56 | 3402   | outgoing-3      | peer reset, message [closing connection] error[Broken TCP connection]
03:13:56 | 3402   | outgoing-3      | outgoing-3 127.0.0.1-10.30.170.120, closing connection
03:13:58 | 3402   | reactor         | initialising connection to peer-1
03:13:58 | 3402   | outgoing-4      | attempting connection to 10.30.170.120:1790
03:13:58 | 3402   | outgoing-4      | 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
03:13:58 | 3402   | outgoing-4      | outgoing-4 127.0.0.1-10.30.170.120, closing connection
03:13:58 | 3402   | outgoing-4      | peer reset, message [closing connection] error[Broken TCP connection]
03:13:58 | 3402   | outgoing-4      | outgoing-4 127.0.0.1-10.30.170.120, closing connection
03:14:01 | 3402   | reactor         | initialising connection to peer-1
03:14:01 | 3402   | outgoing-5      | attempting connection to 10.30.170.120:1790
03:14:01 | 3402   | outgoing-5      | 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
03:14:01 | 3402   | outgoing-5      | outgoing-5 127.0.0.1-10.30.170.120, closing connection
03:14:01 | 3402   | outgoing-5      | peer reset, message [closing connection] error[Broken TCP connection]
03:14:01 | 3402   | outgoing-5      | outgoing-5 127.0.0.1-10.30.170.120, closing connection
03:14:03 | 3402   | reactor         | ^C received
03:14:03 | 3402   | reactor         | performing shutdown</msg>
<arg>${Log_Content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:58.408416" elapsed="0.000409"/>
</kw>
<doc>Save exabgp logs as exaipv6.log, and stop exabgp with ctrl-c bash signal</doc>
<status status="PASS" start="2026-04-17T03:14:58.118054" elapsed="0.290907"/>
</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-04-17T03:14:58.412802" elapsed="0.000264"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:14:58.412517" elapsed="0.000619"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:58.414418" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:58.414289" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:58.414268" elapsed="0.000226"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:58.420120" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:58.419999" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:58.419980" elapsed="0.000215"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:58.421437" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:14:58.420952" elapsed="0.000515"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:14:58.422039" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:14:58.421654" elapsed="0.000426"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:14:58.422138" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:14:58.422347" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:14:58.420503" elapsed="0.001876"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:58.428359" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:58.428245" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:58.428225" elapsed="0.000205"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:58.429701" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:58.429584" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:58.429562" elapsed="0.000209"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:14:58.430258" level="INFO">${karaf_connection_index} = 45</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:14:58.429917" elapsed="0.000368"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:58.430668" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:14:58.430447" elapsed="0.000247"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:14:58.431538" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:14:58.431230" elapsed="0.001064">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:14:58.432489" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:14:58.432537" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:58.430851" elapsed="0.001709"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:14:58.433377" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:14:58.433128" elapsed="0.001008">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:14:58.434327" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:14:58.434374" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:58.432760" elapsed="0.001637"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:14:58.435553" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Reconfigure_ODL_To_Accept_Connections_6"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:14:58.434697" elapsed="0.000921">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Reconfigure_ODL_To_Accept_Connections_6"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:14:58.434473" elapsed="0.001216">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Reconfigure_ODL_To_Accept_Connections_6"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:14:58.434454" elapsed="0.001269">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Reconfigure_ODL_To_Accept_Connections_6"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:58.435983" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:58.436227" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:58.436082" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:58.436063" elapsed="0.000243"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:14:58.436340" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:14:58.439069" elapsed="0.000152"/>
</kw>
<msg time="2026-04-17T03:14:58.439288" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:58.437883" elapsed="0.001537"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:58.439691" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:58.440048" 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-04-17T03:14:58.437225" 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-04-17T03:14:58.436619" elapsed="0.003703"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:14:58.429248" elapsed="0.011160">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Reconfigure_ODL_To_Accept_Connections_6"</status>
</kw>
<msg time="2026-04-17T03:14:58.440512" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:14:58.440556" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Reconfigure_ODL_To_Accept_Connections_6"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:58.428584" elapsed="0.011996"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:14:58.440765" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:58.440657" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:58.440638" elapsed="0.000194"/>
</if>
<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-04-17T03:14:58.441806" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:58.441671" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:58.441651" elapsed="0.000239"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:58.442381" level="INFO">index=15
host=10.30.170.120
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-04-17T03:14:58.442509" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
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-04-17T03:14:58.442231" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:58.443078" level="INFO">{1: 45}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:58.442730" elapsed="0.000399"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:58.443595" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:58.443312" elapsed="0.000333"/>
</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-04-17T03:14:58.444300" elapsed="0.000307"/>
</kw>
<msg time="2026-04-17T03:14:58.444722" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:14:58.444774" level="INFO">${old_connection_index} = 45</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:58.443836" elapsed="0.000963"/>
</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-04-17T03:14:58.446019" elapsed="0.000384"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:14:58.447672" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:14:58.447196" elapsed="0.001551">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:58.446601" elapsed="0.002259"/>
</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-04-17T03:14:58.449637" elapsed="0.000368"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:58.449077" elapsed="0.001013"/>
</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-04-17T03:14:58.445339" elapsed="0.004796"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:58.444887" elapsed="0.005362"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:58.444866" elapsed="0.005412"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:14:58.451239" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:14:58.450885" elapsed="0.000381"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:14:58.451316" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:14:58.451479" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:14:58.450500" elapsed="0.001004"/>
</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-04-17T03:14:58.451660" elapsed="0.000507"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:58.452662" level="INFO">index=46
host=10.30.170.120
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-04-17T03:14:58.452787" level="INFO">${karaf_connection_object} = index=46
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:14:58.452345" elapsed="0.000474"/>
</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-04-17T03:14:58.453014" elapsed="0.002478"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:14:58.455990" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:14:58.457227" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:14:58.455658" elapsed="0.001991">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:14:58.472618" elapsed="0.000570"/>
</kw>
<msg time="2026-04-17T03:14:58.473294" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:58.471097" elapsed="0.002353"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:58.473650" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:58.473817" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:14:58.458531" elapsed="0.015369"/>
</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-04-17T03:14:58.458001" elapsed="0.015965"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:14:58.441310" elapsed="0.032746">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:58.474471" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:14:58.474552" 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="FAIL" start="2026-04-17T03:14:58.427875" elapsed="0.046791">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:14:58.474781" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:14:58.474827" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:58.422775" elapsed="0.052077"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:58.475258" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:58.474957" elapsed="0.000363"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:58.474915" elapsed="0.000431"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:14:58.422630" elapsed="0.052740"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:14:58.422444" elapsed="0.052961"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:14:58.419605" elapsed="0.055862"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:14:58.413962" elapsed="0.061563"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:58.413338" elapsed="0.062287"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:14:58.410034" elapsed="0.065648"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:14:58.476664" 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-04-17T03:14:58.475887" elapsed="0.000807"/>
</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-04-17T03:14:58.513976" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:58.513473" elapsed="0.000542"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:58.514840" 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-04-17T03:14:58.514542" elapsed="0.000375">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-04-17T03:14:58.515039" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:58.514191" elapsed="0.000874"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:58.515636" 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-04-17T03:14:58.515236" elapsed="0.000428"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:14:58.515995" 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-04-17T03:14:58.516175" 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-04-17T03:14:58.515825" elapsed="0.000377"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:58.516612" 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-04-17T03:14:58.516360" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:58.517735" 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-04-17T03:14:58.517447" elapsed="0.000334"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:14:58.518237" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:14:58.517955" elapsed="0.000308"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:58.518968" 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-04-17T03:14:58.518645" elapsed="0.000357"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:58.519752" 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-04-17T03:14:58.519523" elapsed="0.000255"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:58.519831" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:14:58.520025" 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-04-17T03:14:58.519201" 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-04-17T03:14:58.520208" elapsed="0.000244"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">2607:f0d0:1002:0011:0000:0000:0000:0002</var>
<status status="PASS" start="2026-04-17T03:14:58.518508" elapsed="0.001985"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:58.521070" 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-04-17T03:14:58.520740" elapsed="0.000359"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:58.521968" 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-04-17T03:14:58.521727" elapsed="0.000268"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:58.522051" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:14:58.522214" 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-04-17T03:14:58.521347" 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-04-17T03:14:58.522391" elapsed="0.000228"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:14:58.520609" elapsed="0.002051"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:58.523237" 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-04-17T03:14:58.522903" elapsed="0.000360"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:58.525982" 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-04-17T03:14:58.525730" elapsed="0.000281"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:58.526066" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:14:58.526279" 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-04-17T03:14:58.525362" 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-04-17T03:14:58.526465" elapsed="0.000237"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:14:58.522773" elapsed="0.003972"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:58.527410" 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-04-17T03:14:58.527019" elapsed="0.000420"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:58.528250" 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-04-17T03:14:58.527998" elapsed="0.000297"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:58.528361" elapsed="0.000045"/>
</return>
<msg time="2026-04-17T03:14:58.528558" 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-04-17T03:14:58.527647" 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-04-17T03:14:58.528737" elapsed="0.000256"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:14:58.526868" elapsed="0.002182"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:58.529783" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:58.529363" elapsed="0.000448"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:58.530636" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:58.530410" elapsed="0.000252"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:58.530713" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:14:58.530868" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:58.530026" elapsed="0.000867"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:58.531081" elapsed="0.000291"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:58.529204" elapsed="0.002219"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:58.532038" 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-04-17T03:14:58.531686" elapsed="0.000382"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:58.532872" 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-04-17T03:14:58.532647" elapsed="0.000252"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:58.532967" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:14:58.533125" 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-04-17T03:14:58.532279" 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-04-17T03:14:58.533318" elapsed="0.000257"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:14:58.531551" elapsed="0.002086"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:58.534213" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:58.533888" elapsed="0.000364"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:58.535109" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:58.534875" elapsed="0.000261"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:58.535188" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:14:58.535405" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:58.534551" elapsed="0.000887"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:58.535598" elapsed="0.000259"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:58.533754" elapsed="0.002145"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:14:58.536523" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:14:58.536161" elapsed="0.000389"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:14:58.537302" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:14:58.537079" elapsed="0.000260"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:14:58.537391" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:14:58.537577" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:14:58.536740" 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-04-17T03:14:58.537794" elapsed="0.000467"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:14:58.536030" elapsed="0.002274"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:14:58.518319" elapsed="0.020045"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:14:58.538420" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:14:58.538616" 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-04-17T03:14:58.517117" elapsed="0.021527"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:58.516739" elapsed="0.021940"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:58.538864" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:58.538710" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:58.516715" elapsed="0.022244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:14:58.539890" 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-04-17T03:14:58.539106" elapsed="0.000814"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:14:58.539988" 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/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-04-17T03:14:58.512717" elapsed="0.027406"/>
</kw>
<msg time="2026-04-17T03:14:58.540182" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:58.498719" elapsed="0.041518"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:14:58.553755" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/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-04-17T03:14:58.566470" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/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-04-17T03:14:58.579480" elapsed="0.000050"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:58.579762" 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-04-17T03:14:58.579967" 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-04-17T03:14:58.580399" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:58.580247" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:58.580228" 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-04-17T03:14:58.580622" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:58.580789" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:58.580969" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:14:58.580189" elapsed="0.000835"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:14:58.580054" elapsed="0.000996"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:58.581198" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:58.581279" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:14:58.581443" 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-04-17T03:14:58.494032" elapsed="0.087441"/>
</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-04-17T03:14:58.610248" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:58.609774" elapsed="0.000518"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:58.611421" 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-04-17T03:14:58.611062" elapsed="0.000467">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-04-17T03:14:58.611660" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:58.610542" elapsed="0.001152"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:58.612426" 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-04-17T03:14:58.611871" elapsed="0.000591"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:14:58.612864" 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-04-17T03:14:58.613141" 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-04-17T03:14:58.612672" elapsed="0.000501"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:58.613594" 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-04-17T03:14:58.613336" elapsed="0.000443"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-17T03:14:58.614246" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:58.613865" elapsed="0.000443"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:14:58.614855" level="INFO">${mapping_to_use} = {'IP': '2607:f0d0:1002:0011:0000:0000:0000:0002', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:58.614483" elapsed="0.000413"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:58.614335" elapsed="0.000626"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:58.613839" elapsed="0.001156"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:14:58.616355" 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-04-17T03:14:58.615209" elapsed="0.001191"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:14:58.616489" 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/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-04-17T03:14:58.608834" elapsed="0.007849"/>
</kw>
<msg time="2026-04-17T03:14:58.616769" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:58.594610" elapsed="0.022227"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:14:58.632171" elapsed="0.000033"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/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-04-17T03:14:58.645499" 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/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-04-17T03:14:58.658833" elapsed="0.000032"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:58.659080" 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-04-17T03:14:58.659266" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:58.659755" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:58.659558" elapsed="0.000274"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:58.659539" 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-04-17T03:14:58.660082" 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-04-17T03:14:58.660307" 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-04-17T03:14:58.660481" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:14:58.659485" elapsed="0.001050"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:14:58.659351" elapsed="0.001293"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:58.660799" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:58.660881" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:14:58.661075" 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-04-17T03:14:58.591737" elapsed="0.069370"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:14:58.662689" 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-04-17T03:14:58.662352" elapsed="0.000419">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-04-17T03:14:58.662870" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:14:58.661894" elapsed="0.001001"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:58.663298" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:58.662985" elapsed="0.000389"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:14:58.663961" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:58.663628" elapsed="0.000361"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:58.663404" elapsed="0.000622"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:58.662965" elapsed="0.001082"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:58.666605" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:14:58.664203" elapsed="0.002436"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:14:58.666707" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:14:58.666899" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:14:58.661455" elapsed="0.005485"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:58.668552" 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-04-17T03:14:58.668102" elapsed="0.000500"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:58.669005" 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-04-17T03:14:58.668753" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:58.669462" 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-04-17T03:14:58.669215" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:58.669990" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:58.669714" elapsed="0.000322"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:14:58.671111" 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-04-17T03:14:58.670882" elapsed="0.000257"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:14:58.671529" 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-04-17T03:14:58.671343" elapsed="0.000213"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:14:58.671710" elapsed="0.000215"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:58.672362" 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-04-17T03:14:58.672101" elapsed="0.000307"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:14:58.672451" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:14:58.672613" 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-04-17T03:14:58.670397" elapsed="0.002242"/>
</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-04-17T03:14:58.678228" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:14:58.880283" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:14:59.282882" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:14:59.285887" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:14:58.675144" elapsed="0.616066">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:14:58.672712" elapsed="0.618702">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:59.291773" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:59.291475" elapsed="0.000403"/>
</branch>
<status status="FAIL" start="2026-04-17T03:14:58.672694" elapsed="0.619223">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:59.292476" elapsed="0.000032"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:59.292641" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:59.292596" elapsed="0.000097"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:59.292571" elapsed="0.000144"/>
</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-04-17T03:14:59.292903" elapsed="0.000049"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:14:59.293006" elapsed="0.000018"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:14:58.667275" elapsed="0.625864">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:59.293309" elapsed="0.000017"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:14:58.481980" elapsed="0.811434">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:59.293726" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:59.293532" elapsed="0.000265"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:59.293515" elapsed="0.000306"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:14:59.293854" elapsed="0.000014"/>
</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="FAIL" start="2026-04-17T03:14:58.477230" elapsed="0.816745">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Configure BGP peer modules with initiate-connection set to false with short ipv6 address.</doc>
<status status="FAIL" start="2026-04-17T03:14:58.409307" elapsed="0.884958">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:14:59.298063" elapsed="0.000305"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:14:59.297712" 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-04-17T03:14:59.299528" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:59.299399" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:59.299379" elapsed="0.000219"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:59.306037" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:59.305827" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:59.305800" elapsed="0.000338"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:59.307739" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:14:59.307136" elapsed="0.000648"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:14:59.308653" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:14:59.308082" elapsed="0.000620"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:14:59.308792" elapsed="0.000064"/>
</return>
<msg time="2026-04-17T03:14:59.309121" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:14:59.306535" elapsed="0.002633"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:59.315657" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:59.315544" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:59.315524" elapsed="0.000202"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:14:59.316981" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:59.316833" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:59.316815" elapsed="0.000305"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:14:59.317597" level="INFO">${karaf_connection_index} = 46</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:14:59.317277" elapsed="0.000348"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:59.318093" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:14:59.317790" elapsed="0.000331"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:14:59.318996" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:14:59.318679" elapsed="0.001085">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:14:59.319984" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:14:59.320033" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:59.318319" elapsed="0.001738"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:14:59.320835" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:14:59.320581" elapsed="0.000957">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:14:59.321732" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:14:59.321780" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:59.320231" elapsed="0.001572"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:14:59.323111" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Start_Exabgp_3"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:14:59.322213" elapsed="0.000979">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Start_Exabgp_3"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:14:59.321881" elapsed="0.001406">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Start_Exabgp_3"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:14:59.321861" elapsed="0.001461">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Start_Exabgp_3"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:59.323494" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:59.323723" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:59.323582" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:14:59.323565" elapsed="0.000234"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:14:59.323833" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:14:59.326598" elapsed="0.000152"/>
</kw>
<msg time="2026-04-17T03:14:59.326821" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:59.325376" elapsed="0.001596"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:59.327253" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:59.327595" 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-04-17T03:14:59.324691" elapsed="0.003092"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:14:59.324139" elapsed="0.003710"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:14:59.316522" elapsed="0.011430">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Start_Exabgp_3"</status>
</kw>
<msg time="2026-04-17T03:14:59.328059" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:14:59.328103" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Start_Exabgp_3"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:59.315881" elapsed="0.012245"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:14:59.328311" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:59.328202" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:59.328185" elapsed="0.000192"/>
</if>
<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-04-17T03:14:59.329262" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:14:59.329155" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:59.329137" elapsed="0.000232"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:59.329663" level="INFO">index=15
host=10.30.170.120
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-04-17T03:14:59.329772" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
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-04-17T03:14:59.329531" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:59.330276" level="INFO">{1: 46}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:59.329971" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:59.330723" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:59.330476" elapsed="0.000291"/>
</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-04-17T03:14:59.331311" elapsed="0.000267"/>
</kw>
<msg time="2026-04-17T03:14:59.331680" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:14:59.331726" level="INFO">${old_connection_index} = 46</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:59.330941" elapsed="0.000808"/>
</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-04-17T03:14:59.332585" elapsed="0.000197"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:14:59.333878" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:14:59.333475" elapsed="0.001367">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:59.332994" elapsed="0.002008"/>
</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-04-17T03:14:59.336110" elapsed="0.000431"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:59.335292" elapsed="0.001373"/>
</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-04-17T03:14:59.332072" elapsed="0.004662"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:59.331825" elapsed="0.004982"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:59.331807" elapsed="0.005037"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:14:59.338337" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:14:59.337723" elapsed="0.000658"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:14:59.338455" elapsed="0.000050"/>
</return>
<msg time="2026-04-17T03:14:59.338692" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:14:59.337236" elapsed="0.001492"/>
</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-04-17T03:14:59.338974" elapsed="0.000639"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:14:59.339900" level="INFO">index=47
host=10.30.170.120
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-04-17T03:14:59.340027" level="INFO">${karaf_connection_object} = index=47
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:14:59.339788" elapsed="0.000267"/>
</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-04-17T03:14:59.340212" elapsed="0.002394"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:14:59.343058" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:14:59.344247" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:14:59.342773" elapsed="0.001863">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:14:59.360274" elapsed="0.000406"/>
</kw>
<msg time="2026-04-17T03:14:59.360775" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:14:59.358612" elapsed="0.002332"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:59.361111" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:59.361367" elapsed="0.000031"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:14:59.345566" elapsed="0.015914"/>
</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-04-17T03:14:59.344996" elapsed="0.016537"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:14:59.328777" elapsed="0.032845">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:59.362046" elapsed="0.000030"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:14:59.362129" 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="FAIL" start="2026-04-17T03:14:59.315190" elapsed="0.047057">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:14:59.362366" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:14:59.362410" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:59.309960" elapsed="0.052474"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:14:59.362781" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:14:59.362517" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:59.362496" elapsed="0.000364"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:14:59.309637" elapsed="0.053248"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:14:59.309284" elapsed="0.053637"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:14:59.305279" elapsed="0.057841"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:14:59.299086" elapsed="0.064095"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:59.298592" elapsed="0.064640"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:14:59.295177" elapsed="0.068115"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:14:59.363817" level="INFO">${cmd} = exabgp_graceful_restart.cfg &gt; exabgp_graceful_restart.log</msg>
<var>${cmd}</var>
<arg>${EXABGP3_CFG} &gt; ${EXABGP3_LOG}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:59.363470" elapsed="0.000375"/>
</kw>
<kw name="Start_ExaBgp_And_Verify_Connected" owner="ExaBgpLib">
<for flavor="IN RANGE">
<iter>
<kw name="Start_ExaBgp" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:14:59.367814" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exabgp_graceful_restart.cfg &gt; exabgp_graceful_restart.log</msg>
<var>${start_cmd}</var>
<arg>${CMD} ${cfg_file}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:59.367361" elapsed="0.000490"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:59.368374" 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-04-17T03:14:59.368107" elapsed="0.000315"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:14:59.371729" 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-04-17T03:14:59.369085" elapsed="0.002706"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:14:59.377868" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:14:59.378015" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:14:59.371988" elapsed="0.006101"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:59.378872" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:14:59.378527" elapsed="0.000432"/>
</kw>
<status status="PASS" start="2026-04-17T03:14:59.378193" elapsed="0.000808"/>
</branch>
<status status="PASS" start="2026-04-17T03:14:59.378163" elapsed="0.000867"/>
</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-04-17T03:14:59.368666" elapsed="0.010414"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:14:59.381238" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exabgp_graceful_restart.cfg &gt; exabgp_graceful_restart.log</msg>
<msg time="2026-04-17T03:14:59.381337" 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-04-17T03:14:59.379243" elapsed="0.002131"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:14:59.381916" 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-04-17T03:14:59.381625" elapsed="0.000359"/>
</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-04-17T03:14:59.366655" elapsed="0.015447"/>
</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-04-17T03:14:59.384760" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:14:59.384310" elapsed="0.000480"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:14:59.387031" 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-04-17T03:14:59.384975" elapsed="0.002085"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:14:59.389990" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:14:59.592769" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:14:59.995149" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:14:59.997751" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:14:59.387227" elapsed="0.616123">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:15:00.003909" elapsed="0.000092"/>
</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="NOT RUN" start="2026-04-17T03:15:00.004426" elapsed="0.000058"/>
</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-04-17T03:14:59.383678" elapsed="0.621072">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:15:03.009415" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:15:03.008147" elapsed="0.001337"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:15:03.013557" 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-04-17T03:15:03.009773" elapsed="0.003829"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:15:03.017333" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:03.219263" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:03.622046" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:03.624564" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:15:03.013854" elapsed="0.615991">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:15:03.630455" elapsed="0.000078"/>
</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="NOT RUN" start="2026-04-17T03:15:03.631085" elapsed="0.000063"/>
</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-04-17T03:15:03.006026" elapsed="0.625380">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:15:06.633804" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:15:06.633185" elapsed="0.000669"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:15:06.637406" 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-04-17T03:15:06.634145" elapsed="0.003306"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:15:06.641494" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:06.843298" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:07.246176" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:07.248493" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:15:06.637704" elapsed="0.616354">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:15:07.254574" elapsed="0.000063"/>
</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="NOT RUN" start="2026-04-17T03:15:07.255005" elapsed="0.000049"/>
</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-04-17T03:15:06.632281" elapsed="0.623013">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:15:07.255572" level="FAIL">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:14:59.382761" elapsed="7.873105">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:15:07.256209" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:15:07.256316" level="INFO">${value} = Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/...</msg>
<var>${status}</var>
<var>${value}</var>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:14:59.382278" elapsed="7.874094"/>
</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-04-17T03:15:07.258163" level="INFO">[?2004l</msg>
<msg time="2026-04-17T03:15:07.258248" level="INFO">${output} = [?2004l</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-04-17T03:15:07.258016" elapsed="0.000257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:15:07.258733" level="INFO">[?2004l</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:15:07.258428" elapsed="0.000351"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:15:07.259605" 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-04-17T03:15:07.259275" elapsed="0.000358"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-04-17T03:15:07.259848" elapsed="0.000314"/>
</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-04-17T03:15:07.258999" elapsed="0.001226"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:15:07.382195" level="INFO">^C[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:15:07.382438" level="INFO">${output} = ^C[?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:15:07.260391" elapsed="0.122088"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:15:07.383202" level="INFO">^C[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:15:07.382772" elapsed="0.000481"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:15:07.385372" 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-04-17T03:15:07.384027" elapsed="0.001404"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:15:07.386200" level="INFO">[?2004l[?2004h[jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:15:07.386299" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-188-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-04-17T03:15:07.385595" elapsed="0.000731"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:15:07.386960" level="INFO">[?2004l[?2004h[jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:15:07.386683" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-04-17T03:15:07.386405" elapsed="0.000664"/>
</branch>
<status status="PASS" start="2026-04-17T03:15:07.386380" elapsed="0.000716"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-04-17T03:15:07.383560" elapsed="0.003585"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-04-17T03:15:07.257327" elapsed="0.129871"/>
</kw>
<status status="PASS" start="2026-04-17T03:15:07.256662" elapsed="0.130570"/>
</branch>
<status status="PASS" start="2026-04-17T03:15:07.256589" elapsed="0.130693"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="NOT RUN" start="2026-04-17T03:15:07.387474" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:15:07.387350" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-17T03:15:07.387332" elapsed="0.000209"/>
</if>
<var name="${idx}">0</var>
<status status="PASS" start="2026-04-17T03:14:59.366472" elapsed="8.021093"/>
</iter>
<iter>
<kw name="Start_ExaBgp" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:15:07.388646" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exabgp_graceful_restart.cfg &gt; exabgp_graceful_restart.log</msg>
<var>${start_cmd}</var>
<arg>${CMD} ${cfg_file}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:15:07.388312" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:15:07.389099" 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-04-17T03:15:07.388830" elapsed="0.000314"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:15:07.391260" 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-04-17T03:15:07.389746" elapsed="0.001575"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:15:07.395735" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:15:07.395858" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:15:07.391480" elapsed="0.004409"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:15:07.396733" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:15:07.396287" elapsed="0.000493"/>
</kw>
<status status="PASS" start="2026-04-17T03:15:07.396000" elapsed="0.000814"/>
</branch>
<status status="PASS" start="2026-04-17T03:15:07.395970" elapsed="0.000869"/>
</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-04-17T03:15:07.389385" elapsed="0.007499"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:15:07.399141" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exabgp_graceful_restart.cfg &gt; exabgp_graceful_restart.log</msg>
<msg time="2026-04-17T03:15:07.399273" 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-04-17T03:15:07.397084" elapsed="0.002236"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:15:07.399773" 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-04-17T03:15:07.399499" elapsed="0.000321"/>
</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-04-17T03:15:07.387969" elapsed="0.011906"/>
</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-04-17T03:15:07.401913" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:15:07.401542" elapsed="0.000418"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:15:07.404489" 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-04-17T03:15:07.402127" elapsed="0.002391"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:15:07.407451" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:07.608893" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:08.012156" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:08.014984" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:15:07.404753" elapsed="0.615222">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:15:08.020477" elapsed="0.000057"/>
</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="NOT RUN" start="2026-04-17T03:15:08.020843" elapsed="0.000044"/>
</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-04-17T03:15:07.401023" elapsed="0.620111">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:15:11.027045" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:15:11.026362" elapsed="0.000731"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:15:11.031095" 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-04-17T03:15:11.027424" elapsed="0.003716"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:15:11.035066" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:11.236648" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:11.639767" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:11.642379" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:15:11.031384" elapsed="0.616124">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:15:11.647879" elapsed="0.000051"/>
</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="NOT RUN" start="2026-04-17T03:15:11.648168" elapsed="0.000031"/>
</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-04-17T03:15:11.025384" elapsed="0.622978">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:15:14.651596" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:15:14.650791" elapsed="0.000872"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:15:14.654822" 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-04-17T03:15:14.652225" elapsed="0.002638"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:15:14.659048" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:14.862547" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:15.265108" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:15.267770" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:15:14.655071" elapsed="0.617957">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:15:15.273425" elapsed="0.000047"/>
</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="NOT RUN" start="2026-04-17T03:15:15.273689" elapsed="0.000031"/>
</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-04-17T03:15:14.649374" elapsed="0.624507">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:15:15.274101" level="FAIL">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:15:07.400461" elapsed="7.873790">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:15:15.274456" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:15:15.274522" level="INFO">${value} = Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/...</msg>
<var>${status}</var>
<var>${value}</var>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:15:07.400059" elapsed="7.874499"/>
</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-04-17T03:15:15.275911" level="INFO">[?2004l</msg>
<msg time="2026-04-17T03:15:15.276054" level="INFO">${output} = [?2004l</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-04-17T03:15:15.275726" elapsed="0.000363"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:15:15.276716" level="INFO">[?2004l</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:15:15.276302" elapsed="0.000479"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:15:15.278002" 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-04-17T03:15:15.277523" elapsed="0.000520"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-04-17T03:15:15.278291" elapsed="0.000406"/>
</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-04-17T03:15:15.277084" elapsed="0.001742"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:15:15.398866" level="INFO">^C[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:15:15.399125" level="INFO">${output} = ^C[?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:15:15.279070" elapsed="0.120086"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:15:15.399788" level="INFO">^C[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:15:15.399415" elapsed="0.000425"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:15:15.401798" 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-04-17T03:15:15.400607" elapsed="0.001390"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:15:15.402976" level="INFO">[?2004l[?2004h[jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:15:15.403073" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-188-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-04-17T03:15:15.402168" elapsed="0.000933"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:15:15.403722" level="INFO">[?2004l[?2004h[jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:15:15.403458" elapsed="0.000313"/>
</kw>
<status status="PASS" start="2026-04-17T03:15:15.403183" elapsed="0.000621"/>
</branch>
<status status="PASS" start="2026-04-17T03:15:15.403158" elapsed="0.000674"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-04-17T03:15:15.400191" elapsed="0.003691"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-04-17T03:15:15.275186" elapsed="0.128766"/>
</kw>
<status status="PASS" start="2026-04-17T03:15:15.274706" elapsed="0.129275"/>
</branch>
<status status="PASS" start="2026-04-17T03:15:15.274668" elapsed="0.129337"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="NOT RUN" start="2026-04-17T03:15:15.404205" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:15:15.404064" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-17T03:15:15.404048" elapsed="0.000224"/>
</if>
<var name="${idx}">1</var>
<status status="PASS" start="2026-04-17T03:15:07.387752" elapsed="8.016545"/>
</iter>
<iter>
<kw name="Start_ExaBgp" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:15:15.405369" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exabgp_graceful_restart.cfg &gt; exabgp_graceful_restart.log</msg>
<var>${start_cmd}</var>
<arg>${CMD} ${cfg_file}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:15:15.405031" elapsed="0.000368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:15:15.407743" 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-04-17T03:15:15.405556" elapsed="0.002238"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:15:15.410019" 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-04-17T03:15:15.408493" elapsed="0.001587"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:15:15.414631" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:15:15.414727" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:15:15.410239" elapsed="0.004514"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:15:15.415374" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:15:15.415116" elapsed="0.000307"/>
</kw>
<status status="PASS" start="2026-04-17T03:15:15.414824" elapsed="0.000657"/>
</branch>
<status status="PASS" start="2026-04-17T03:15:15.414805" elapsed="0.000713"/>
</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-04-17T03:15:15.408067" elapsed="0.007503"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:15:15.418031" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exabgp_graceful_restart.cfg &gt; exabgp_graceful_restart.log</msg>
<msg time="2026-04-17T03:15:15.418126" 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-04-17T03:15:15.415725" elapsed="0.002428"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:15:15.418570" 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-04-17T03:15:15.418314" elapsed="0.000304"/>
</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-04-17T03:15:15.404680" elapsed="0.013994"/>
</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-04-17T03:15:15.420752" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:15:15.420388" elapsed="0.000391"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:15:15.423091" 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-04-17T03:15:15.420981" elapsed="0.002139"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:15:15.426252" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:15.627796" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:16.030242" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:16.033228" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:15:15.423285" elapsed="0.614335">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:15:16.038029" elapsed="0.000044"/>
</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="NOT RUN" start="2026-04-17T03:15:16.038292" elapsed="0.000047"/>
</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-04-17T03:15:15.419876" elapsed="0.618664">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:15:19.042861" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:15:19.041774" elapsed="0.001195"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:15:19.048061" 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-04-17T03:15:19.043388" elapsed="0.004721"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:15:19.052268" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:19.254344" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:19.658384" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:19.661665" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:15:19.048369" elapsed="0.617037">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:15:19.665836" elapsed="0.000054"/>
</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="NOT RUN" start="2026-04-17T03:15:19.666146" elapsed="0.000032"/>
</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-04-17T03:15:19.039972" elapsed="0.626390">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:15:22.668578" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:15:22.667979" elapsed="0.000647"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:15:22.671827" 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-04-17T03:15:22.668874" elapsed="0.002994"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:15:22.676992" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:22.878491" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:23.280869" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:23.283613" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:15:22.672120" elapsed="0.617608">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:15:23.290237" elapsed="0.000051"/>
</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="NOT RUN" start="2026-04-17T03:15:23.290610" elapsed="0.000052"/>
</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-04-17T03:15:22.667066" elapsed="0.623848">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:15:23.291182" level="FAIL">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:15:15.419339" elapsed="7.872063">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:15:23.291683" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:15:23.291785" level="INFO">${value} = Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/...</msg>
<var>${status}</var>
<var>${value}</var>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:15:15.418901" elapsed="7.872941"/>
</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-04-17T03:15:23.293730" level="INFO">[?2004l</msg>
<msg time="2026-04-17T03:15:23.293910" level="INFO">${output} = [?2004l</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-04-17T03:15:23.293456" elapsed="0.000536"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:15:23.295527" level="INFO">[?2004l</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:15:23.294324" elapsed="0.001300"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:15:23.297820" 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-04-17T03:15:23.296649" elapsed="0.001223"/>
</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-04-17T03:15:23.298165" elapsed="0.000434"/>
</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-04-17T03:15:23.296084" elapsed="0.002588"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:15:23.419491" level="INFO">^C[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:15:23.419773" level="INFO">${output} = ^C[?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:15:23.298853" elapsed="0.120972"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:15:23.420687" level="INFO">^C[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:15:23.420188" elapsed="0.000554"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:15:23.422721" 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-04-17T03:15:23.421670" elapsed="0.001128"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:15:23.423762" level="INFO">[?2004l[?2004h[jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:15:23.423861" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-188-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-04-17T03:15:23.423010" elapsed="0.000878"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:15:23.424582" level="INFO">[?2004l[?2004h[jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:15:23.424289" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-04-17T03:15:23.423989" elapsed="0.000678"/>
</branch>
<status status="PASS" start="2026-04-17T03:15:23.423962" elapsed="0.000735"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-04-17T03:15:23.421120" elapsed="0.003634"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-04-17T03:15:23.292725" elapsed="0.132116"/>
</kw>
<status status="PASS" start="2026-04-17T03:15:23.292088" elapsed="0.132785"/>
</branch>
<status status="PASS" start="2026-04-17T03:15:23.292037" elapsed="0.132862"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="NOT RUN" start="2026-04-17T03:15:23.425205" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:15:23.425075" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-17T03:15:23.425056" elapsed="0.000245"/>
</if>
<var name="${idx}">2</var>
<status status="PASS" start="2026-04-17T03:15:15.404482" elapsed="8.020847"/>
</iter>
<var>${idx}</var>
<value>${connection_retries}</value>
<status status="PASS" start="2026-04-17T03:14:59.366235" elapsed="24.059133"/>
</for>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:15:23.425913" level="FAIL">Unable to connect ExaBgp to ODL</msg>
<arg>Unable to connect ExaBgp to ODL</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:15:23.425590" elapsed="0.000427">Unable to connect ExaBgp to ODL</status>
</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="FAIL" start="2026-04-17T03:14:59.364179" elapsed="24.061954">Unable to connect ExaBgp to ODL</status>
</kw>
<doc>Start exabgp with</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:14:59.294526" elapsed="24.131814">Unable to connect ExaBgp to ODL</status>
</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-04-17T03:15:23.430262" elapsed="0.000266"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:15:23.429951" 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-04-17T03:15:23.431757" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:15:23.431627" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-17T03:15:23.431605" elapsed="0.000226"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:15:23.437771" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:15:23.437651" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-17T03:15:23.437630" elapsed="0.000228"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:15:23.439084" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:15:23.438619" elapsed="0.000494"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:15:23.439614" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:15:23.439277" elapsed="0.000370"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:15:23.439694" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:15:23.439873" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:15:23.438159" elapsed="0.001747"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:15:23.446380" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:15:23.446263" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-17T03:15:23.446242" elapsed="0.000210"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:15:23.447708" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:15:23.447598" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-17T03:15:23.447579" elapsed="0.000210"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:15:23.448319" level="INFO">${karaf_connection_index} = 47</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:15:23.447970" elapsed="0.000380"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:15:23.448753" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:15:23.448521" elapsed="0.000265"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:15:23.449796" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:15:23.449413" elapsed="0.001246">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:15:23.450909" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:15:23.450994" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:15:23.449008" elapsed="0.002018"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:15:23.452024" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:15:23.451700" elapsed="0.000995">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:15:23.452971" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:15:23.453033" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:15:23.451247" elapsed="0.001816"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:15:23.454660" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Stop_All_Exabgps_3"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:15:23.453596" elapsed="0.001143">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Stop_All_Exabgps_3"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:15:23.453251" elapsed="0.001582">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Stop_All_Exabgps_3"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:15:23.453221" elapsed="0.001657">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Stop_All_Exabgps_3"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:15:23.455129" elapsed="0.000032"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:15:23.455443" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:15:23.455248" elapsed="0.000270"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:15:23.455225" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:15:23.455602" 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-04-17T03:15:23.459043" elapsed="0.000166"/>
</kw>
<msg time="2026-04-17T03:15:23.459282" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:15:23.457810" 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-04-17T03:15:23.459737" elapsed="0.000104"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:15:23.460203" 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-04-17T03:15:23.457051" elapsed="0.003344"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:15:23.456249" elapsed="0.004213"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:15:23.447284" elapsed="0.013270">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Stop_All_Exabgps_3"</status>
</kw>
<msg time="2026-04-17T03:15:23.460666" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:15:23.460710" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Stop_All_Exabgps_3"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:15:23.446606" elapsed="0.014128"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:15:23.460951" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:15:23.460817" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-17T03:15:23.460795" elapsed="0.000229"/>
</if>
<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-04-17T03:15:23.461986" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:15:23.461823" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-17T03:15:23.461802" elapsed="0.000256"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:15:23.462359" level="INFO">index=15
host=10.30.170.120
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-04-17T03:15:23.462470" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
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-04-17T03:15:23.462220" elapsed="0.000277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:15:23.463024" level="INFO">{1: 47}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:15:23.462681" elapsed="0.000392"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:15:23.463480" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:15:23.463227" elapsed="0.000299"/>
</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-04-17T03:15:23.464079" elapsed="0.000275"/>
</kw>
<msg time="2026-04-17T03:15:23.464456" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:15:23.464503" level="INFO">${old_connection_index} = 47</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:15:23.463687" elapsed="0.000839"/>
</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-04-17T03:15:23.465362" elapsed="0.000239"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:15:23.466833" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:15:23.466405" elapsed="0.001441">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:15:23.465773" elapsed="0.002252"/>
</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-04-17T03:15:23.468737" elapsed="0.000314"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:15:23.468230" elapsed="0.000924"/>
</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-04-17T03:15:23.464827" elapsed="0.004377"/>
</kw>
<status status="PASS" start="2026-04-17T03:15:23.464604" elapsed="0.004665"/>
</branch>
<status status="PASS" start="2026-04-17T03:15:23.464584" elapsed="0.004726"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:15:23.470548" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:15:23.470220" elapsed="0.000357"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:15:23.470629" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:15:23.470789" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:15:23.469605" elapsed="0.001209"/>
</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-04-17T03:15:23.471004" elapsed="0.000486"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:15:23.471992" level="INFO">index=48
host=10.30.170.120
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-04-17T03:15:23.472102" level="INFO">${karaf_connection_object} = index=48
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:15:23.471661" elapsed="0.000468"/>
</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-04-17T03:15:23.472280" elapsed="0.002706"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:15:23.475433" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:15:23.476580" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:15:23.475161" elapsed="0.001867">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:15:23.492349" elapsed="0.000427"/>
</kw>
<msg time="2026-04-17T03:15:23.493122" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:15:23.490634" elapsed="0.002691"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:15:23.493497" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:15:23.493729" elapsed="0.000030"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:15:23.478251" elapsed="0.015585"/>
</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-04-17T03:15:23.477381" elapsed="0.016517"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:15:23.461447" elapsed="0.032568">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:15:23.494445" elapsed="0.000030"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:15:23.494529" elapsed="0.000023"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:15:23.445700" elapsed="0.048953">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:15:23.494774" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:15:23.494825" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:15:23.440363" elapsed="0.054504"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:15:23.495471" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:15:23.495141" elapsed="0.000465"/>
</branch>
<status status="PASS" start="2026-04-17T03:15:23.494959" elapsed="0.000675"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:15:23.440199" elapsed="0.055463"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:15:23.439999" elapsed="0.055700"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:15:23.437212" elapsed="0.058548"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:15:23.431295" elapsed="0.064569"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:15:23.430796" elapsed="0.065367"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:15:23.427323" elapsed="0.068907"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:15:23.506009" level="INFO">Executing command 'cat exabgp_graceful_restart.log'.</msg>
<msg time="2026-04-17T03:15:23.518377" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:15:23.518641" level="INFO">${output_log} = 03:15:15 | 3438   | welcome         | Thank you for using ExaBGP
03:15:15 | 3438   | version         | 4.2.4
03:15:15 | 3438   | interpreter     | 3.10.12 (main, Jan 26 2026, 14:55:28) [GCC 11.4.0]
03...</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-04-17T03:15:23.505825" elapsed="0.012881"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:15:23.519921" level="INFO">03:15:15 | 3438   | welcome         | Thank you for using ExaBGP
03:15:15 | 3438   | version         | 4.2.4
03:15:15 | 3438   | interpreter     | 3.10.12 (main, Jan 26 2026, 14:55:28) [GCC 11.4.0]
03:15:15 | 3438   | os              | Linux releng-26932-188-0-builder-0 5.15.0-171-generic #181-Ubuntu SMP Fri Feb 6 22:44:50 UTC 2026 x86_64
03:15:15 | 3438   | installation    | /tmp/defaultvenv
03:15:15 | 3438   | advice          | environment file missing
03:15:15 | 3438   | advice          | generate it using "exabgp --fi &gt; /tmp/defaultvenv/etc/exabgp/exabgp.env"
03:15:15 | 3438   | cli             | could not find the named pipes (exabgp.in and exabgp.out) required for the cli
03:15:15 | 3438   | cli             | we scanned the following folders (the number is your PID):
03:15:15 | 3438   | cli control     |  - /run/exabgp/
03:15:15 | 3438   | cli control     |  - /run/1001/
03:15:15 | 3438   | cli control     |  - /run/
03:15:15 | 3438   | cli control     |  - /var/run/exabgp/
03:15:15 | 3438   | cli control     |  - /var/run/1001/
03:15:15 | 3438   | cli control     |  - /var/run/
03:15:15 | 3438   | cli control     |  - /tmp/defaultvenv/run/exabgp/
03:15:15 | 3438   | cli control     |  - /tmp/defaultvenv/run/1001/
03:15:15 | 3438   | cli control     |  - /tmp/defaultvenv/run/
03:15:15 | 3438   | cli control     |  - /tmp/defaultvenv/var/run/exabgp/
03:15:15 | 3438   | cli control     |  - /tmp/defaultvenv/var/run/1001/
03:15:15 | 3438   | cli control     |  - /tmp/defaultvenv/var/run/
03:15:15 | 3438   | cli control     | please make them in one of the folder with the following commands:
03:15:15 | 3438   | cli control     | &gt; mkfifo /home/jenkins/run/exabgp.{in,out}
03:15:15 | 3438   | cli control     | &gt; chmod 600 /home/jenkins/run/exabgp.{in,out}
03:15:15 | 3438   | cli control     | &gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}
03:15:15 | 3438   | configuration   | performing reload of exabgp 4.2.4
03:15:15 | 3438   | configuration   | &gt; neighbor         | '::1'
03:15:15 | 3438   | configuration   | . router-id        | '1.2.3.4'
03:15:15 | 3438   | configuration   | . local-address    | '2607:f0d0:1002:0011:0000:0000:0000:0002'
03:15:15 | 3438   | configuration   | . local-as         | '64496'
03:15:15 | 3438   | configuration   | . peer-as          | '64496'
03:15:15 | 3438   | configuration   | &gt; capability       | 
03:15:15 | 3438   | configuration   | . graceful-restart | '40'
03:15:15 | 3438   | configuration   | &lt; capability       | 
03:15:15 | 3438   | configuration   | &gt; family           | 
03:15:15 | 3438   | configuration   | . ipv6             | 'unicast'
03:15:15 | 3438   | configuration   | &lt; family           | 
03:15:15 | 3438   | configuration   | &gt; static           | 
03:15:15 | 3438   | configuration   | . route            | '2a04:6d80::1/128' 'next-hop' 'self'
03:15:15 | 3438   | configuration   | &lt; static           | 
03:15:15 | 3438   | configuration   | &lt; neighbor         | 
03:15:15 | 3438   | 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
03:15:15 | 3438   | reactor         | loaded new configuration successfully
03:15:15 | 3438   | reactor         | initialising connection to peer-1
03:15:15 | 3438   | outgoing-1      | attempting connection to ::1:1790
03:15:15 | 3438   | 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
03:15:15 | 3438   | outgoing-1      | outgoing-1 2607:f0d0:1002:0011:0000:0000:0000:0002-::1, closing connection
03:15:15 | 3438   | outgoing-1      | peer reset, message [closing connection] error[Broken TCP connection]
03:15:15 | 3438   | outgoing-1      | outgoing-1 2607:f0d0:1002:0011:0000:0000:0000:0002-::1, closing connection
03:15:15 | 3438   | reactor         | initialising connection to peer-1
03:15:15 | 3438   | outgoing-2      | attempting connection to ::1:1790
03:15:15 | 3438   | 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
03:15:15 | 3438   | outgoing-2      | outgoing-2 2607:f0d0:1002:0011:0000:0000:0000:0002-::1, closing connection
03:15:15 | 3438   | outgoing-2      | peer reset, message [closing connection] error[Broken TCP connection]
03:15:15 | 3438   | outgoing-2      | outgoing-2 2607:f0d0:1002:0011:0000:0000:0000:0002-::1, closing connection
03:15:16 | 3438   | reactor         | initialising connection to peer-1
03:15:16 | 3438   | outgoing-3      | attempting connection to ::1:1790
03:15:16 | 3438   | outgoing-3      | 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
03:15:16 | 3438   | outgoing-3      | outgoing-3 2607:f0d0:1002:0011:0000:0000:0000:0002-::1, closing connection
03:15:16 | 3438   | outgoing-3      | peer reset, message [closing connection] error[Broken TCP connection]
03:15:16 | 3438   | outgoing-3      | outgoing-3 2607:f0d0:1002:0011:0000:0000:0000:0002-::1, closing connection
03:15:18 | 3438   | reactor         | initialising connection to peer-1
03:15:18 | 3438   | outgoing-4      | attempting connection to ::1:1790
03:15:18 | 3438   | outgoing-4      | 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
03:15:18 | 3438   | outgoing-4      | outgoing-4 2607:f0d0:1002:0011:0000:0000:0000:0002-::1, closing connection
03:15:18 | 3438   | outgoing-4      | peer reset, message [closing connection] error[Broken TCP connection]
03:15:18 | 3438   | outgoing-4      | outgoing-4 2607:f0d0:1002:0011:0000:0000:0000:0002-::1, closing connection
03:15:21 | 3438   | reactor         | initialising connection to peer-1
03:15:21 | 3438   | outgoing-5      | attempting connection to ::1:1790
03:15:21 | 3438   | outgoing-5      | 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
03:15:21 | 3438   | outgoing-5      | outgoing-5 2607:f0d0:1002:0011:0000:0000:0000:0002-::1, closing connection
03:15:21 | 3438   | outgoing-5      | peer reset, message [closing connection] error[Broken TCP connection]
03:15:21 | 3438   | outgoing-5      | outgoing-5 2607:f0d0:1002:0011:0000:0000:0000:0002-::1, closing connection
03:15:23 | 3438   | reactor         | ^C received
03:15:23 | 3438   | reactor         | performing shutdown</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:15:23.519204" elapsed="0.001118"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-04-17T03:15:23.521841" 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-04-17T03:15:23.520861" elapsed="0.001159"/>
</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-04-17T03:15:23.505340" elapsed="0.016838"/>
</kw>
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-04-17T03:15:23.523526" level="INFO">${output} =  </msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-04-17T03:15:23.523279" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:15:23.524225" level="INFO"> </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:15:23.523777" elapsed="0.000540"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:15:23.525652" 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-04-17T03:15:23.525099" elapsed="0.000617"/>
</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-04-17T03:15:23.525960" elapsed="0.000305"/>
</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-04-17T03:15:23.524614" elapsed="0.001746"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:15:23.557279" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:15:23.557533" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-188-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-04-17T03:15:23.526606" elapsed="0.030992"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:15:23.558644" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:15:23.558040" elapsed="0.000689"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:15:23.561008" 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-04-17T03:15:23.559775" elapsed="0.001318"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:15:23.719081" level="INFO">[?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:15:23.719284" level="INFO">${output} = [?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-188-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-04-17T03:15:23.561331" elapsed="0.157984"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:15:23.720536" level="INFO">[?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:15:23.719794" elapsed="0.000797"/>
</kw>
<status status="PASS" start="2026-04-17T03:15:23.719435" elapsed="0.001193"/>
</branch>
<status status="PASS" start="2026-04-17T03:15:23.719404" elapsed="0.001252"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-04-17T03:15:23.559164" elapsed="0.161548"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-04-17T03:15:23.522805" elapsed="0.197963"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<msg time="2026-04-17T03:16:03.721662" level="INFO">Slept 40 seconds.</msg>
<arg>40s</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="PASS" start="2026-04-17T03:15:23.721019" elapsed="40.001143"/>
</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-04-17T03:16:03.724960" elapsed="0.000044"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:03.724632" elapsed="0.000454"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:03.724582" elapsed="0.000561"/>
</if>
<for flavor="IN RANGE">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:16:03.726840" level="INFO">${cmd} = sed '1,/ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Stop_All_Exabgps_3/d' /tmp/karaf-0.23.1-SNAPSHOT/data/log/karaf.log</msg>
<var>${cmd}</var>
<arg>sed '1,/ROBOT MESSAGE: Starting test ${test_name}/d' ${log_file}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:16:03.726292" elapsed="0.000588"/>
</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-04-17T03:16:03.733302" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:03.733147" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:03.733120" elapsed="0.000277"/>
</if>
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:03.736453" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:16:03.736074" elapsed="0.000459"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:03.736048" elapsed="0.000518"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:16:03.737026" level="INFO">index=15
host=10.30.170.120
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-04-17T03:16:03.737188" level="INFO">${current_ssh_connection} = index=15
host=10.30.170.120
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-04-17T03:16:03.736775" elapsed="0.000492"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:03.738112" 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.1-SNAPSHOT/data/log/karaf.log" on remote system "10.30.170.120" 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-04-17T03:16:03.737505" elapsed="0.000754"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:16:03.738823" level="INFO">${conn_id} = 49</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-04-17T03:16:03.738422" elapsed="0.000428"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-17T03:16:03.739780" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:16:03.739861" 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-04-17T03:16:03.739490" elapsed="0.000395"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:16:03.740062" elapsed="0.000325"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:16:03.741255" level="INFO">Logging into '10.30.170.120:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:16:04.378426" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 17 03:16:03 UTC 2026

  System load:  0.08               Processes:             120
  Usage of /:   10.4% of 77.35GB   Users logged in:       1
  Memory usage: 2%                 IPv4 address for ens3: 10.30.170.120
  Swap usage:   0%                 IPv6 address for ens3: 2607:f0d0:1002:11::2


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:10:49 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:16:03.740915" elapsed="0.637665"/>
</kw>
<msg time="2026-04-17T03:16:04.378667" 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-04-17T03:16:03.740557" elapsed="0.638204"/>
</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-04-17T03:16:03.739086" elapsed="0.639789"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:16:04.379401" 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.1-SNAPSHOT/data/log/karaf.log'.</msg>
<msg time="2026-04-17T03:16:04.392347" level="INFO">Command exited with return code 2.</msg>
<msg time="2026-04-17T03:16:04.392661" level="INFO">${stdout} = </msg>
<msg time="2026-04-17T03:16:04.392795" level="INFO">${stderr} = sed: can't read /tmp/karaf-0.23.1-SNAPSHOT/data/log/karaf.log: No such file or directory</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-04-17T03:16:04.379143" elapsed="0.013731"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:16:04.393485" elapsed="0.000591"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:04.395282" level="INFO">sed: can't read /tmp/karaf-0.23.1-SNAPSHOT/data/log/karaf.log: No such file or directory</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:04.394595" elapsed="0.000792"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-17T03:16:04.395848" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:04.395556" elapsed="0.000432"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:04.395507" elapsed="0.000534"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:16:04.396406" elapsed="0.000065"/>
</return>
<status status="PASS" start="2026-04-17T03:16:04.396164" elapsed="0.000380"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:04.396130" elapsed="0.000466"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-17T03:16:04.396672" elapsed="0.000031"/>
</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-04-17T03:16:04.402564" elapsed="0.000204"/>
</kw>
<msg time="2026-04-17T03:16:04.402830" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:16:04.401620" elapsed="0.001302"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:04.403176" elapsed="0.000031"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:04.403402" elapsed="0.000028"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:16:04.397402" elapsed="0.006115"/>
</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-04-17T03:16:03.735296" elapsed="0.668348"/>
</kw>
<msg time="2026-04-17T03:16:04.403797" 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-04-17T03:16:03.734482" elapsed="0.669385"/>
</kw>
<msg time="2026-04-17T03:16:04.404044" 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-04-17T03:16:03.733637" elapsed="0.670443"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-04-17T03:16:04.404766" 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-04-17T03:16:04.404359" elapsed="0.000449"/>
</kw>
<return>
<value>${log_lines}</value>
<status status="PASS" start="2026-04-17T03:16:04.404877" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:16:04.405127" 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.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-04-17T03:16:03.732375" elapsed="0.672794"/>
</kw>
<kw name="Verify Exceptions" owner="excepts">
<msg time="2026-04-17T03:16:04.405897" level="INFO">${exlist} = []</msg>
<msg time="2026-04-17T03:16:04.406001" 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-04-17T03:16:04.405540" elapsed="0.000496"/>
</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-04-17T03:16:04.406337" elapsed="0.000559"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-17T03:16:04.407436" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:16:04.407513" 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-04-17T03:16:04.407147" elapsed="0.000389"/>
</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-04-17T03:16:04.408007" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:16:04.407608" elapsed="0.000464"/>
</branch>
<branch type="ELSE">
<kw name="Log List" owner="Collections">
<msg time="2026-04-17T03:16:04.408376" 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-04-17T03:16:04.408237" elapsed="0.000184"/>
</kw>
<status status="PASS" start="2026-04-17T03:16:04.408097" elapsed="0.000357"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:04.407589" elapsed="0.000887"/>
</if>
<var name="${i}">1</var>
<status status="PASS" start="2026-04-17T03:16:03.725979" elapsed="0.682523"/>
</iter>
<var>${i}</var>
<value>1</value>
<value>${NUM_ODL_SYSTEM} + 1</value>
<status status="PASS" start="2026-04-17T03:16:03.725245" elapsed="0.683291"/>
</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-04-17T03:16:03.723414" elapsed="0.685183"/>
</kw>
<doc>Save exabgp logs as exabgp_graceful_restart.log, and stop exabgp with ctrl-c bash signal</doc>
<status status="PASS" start="2026-04-17T03:15:23.426606" elapsed="40.982114"/>
</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-04-17T03:16:04.413003" elapsed="0.000265"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:16:04.412688" 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-04-17T03:16:04.414453" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:04.414322" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:04.414300" elapsed="0.000226"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:16:04.419843" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:04.419706" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:04.419688" elapsed="0.000224"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:16:04.420987" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:16:04.420557" elapsed="0.000459"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:16:04.421489" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:16:04.421178" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:16:04.421560" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:16:04.421725" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:16:04.420171" elapsed="0.001580"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:16:04.427713" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:04.427601" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:04.427582" 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-04-17T03:16:04.429018" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:04.428881" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:04.428863" elapsed="0.000225"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:16:04.429546" level="INFO">${karaf_connection_index} = 48</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:16:04.429236" elapsed="0.000338"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:16:04.429975" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:16:04.429733" elapsed="0.000269"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:16:04.431002" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:16:04.430548" elapsed="0.001408">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:16:04.432255" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:16:04.432325" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:04.430160" elapsed="0.002204"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:16:04.433570" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:16:04.433216" elapsed="0.001564">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:16:04.435081" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:16:04.435137" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:04.432648" elapsed="0.002512"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:16:04.436121" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Start_Exabgp_4"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:16:04.435464" elapsed="0.000722">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Start_Exabgp_4"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:16:04.435237" elapsed="0.001038">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Start_Exabgp_4"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:16:04.435218" elapsed="0.001098">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Start_Exabgp_4"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:04.436522" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:04.436819" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:16:04.436633" elapsed="0.000254"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:16:04.436610" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:16:04.436984" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:16:04.440184" elapsed="0.000152"/>
</kw>
<msg time="2026-04-17T03:16:04.440406" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:16:04.438581" elapsed="0.001957"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:04.440818" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:04.441210" 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-04-17T03:16:04.437828" elapsed="0.003577"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:16:04.437271" elapsed="0.004200"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:16:04.428571" elapsed="0.012987">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Start_Exabgp_4"</status>
</kw>
<msg time="2026-04-17T03:16:04.441663" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:16:04.441710" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Start_Exabgp_4"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:04.427949" elapsed="0.013785"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:16:04.441989" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:04.441851" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:04.441832" elapsed="0.000226"/>
</if>
<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-04-17T03:16:04.443067" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:04.442829" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:04.442811" elapsed="0.000332"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:16:04.443458" level="INFO">index=15
host=10.30.170.120
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-04-17T03:16:04.443567" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
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-04-17T03:16:04.443328" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:04.444036" level="INFO">{1: 48}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:04.443749" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:04.444477" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:04.444232" elapsed="0.000289"/>
</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-04-17T03:16:04.445055" elapsed="0.000266"/>
</kw>
<msg time="2026-04-17T03:16:04.445421" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:16:04.445467" level="INFO">${old_connection_index} = 48</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:04.444677" elapsed="0.000813"/>
</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-04-17T03:16:04.446332" elapsed="0.000200"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:16:04.447835" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:16:04.447227" elapsed="0.001496">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:04.446699" elapsed="0.002127"/>
</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-04-17T03:16:04.449493" elapsed="0.000284"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:04.449018" elapsed="0.000845"/>
</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-04-17T03:16:04.445785" elapsed="0.004124"/>
</kw>
<status status="PASS" start="2026-04-17T03:16:04.445566" elapsed="0.004411"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:04.445548" elapsed="0.004455"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:16:04.450900" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:16:04.450583" elapsed="0.000376"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:16:04.451019" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:16:04.451180" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:16:04.450214" elapsed="0.000991"/>
</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-04-17T03:16:04.451484" elapsed="0.000422"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:16:04.452203" level="INFO">index=50
host=10.30.170.120
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-04-17T03:16:04.452304" level="INFO">${karaf_connection_object} = index=50
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:16:04.452094" elapsed="0.000236"/>
</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-04-17T03:16:04.452479" elapsed="0.002424"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:16:04.455386" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:16:04.456763" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:16:04.455125" elapsed="0.002030">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:16:04.471524" elapsed="0.000416"/>
</kw>
<msg time="2026-04-17T03:16:04.472052" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:16:04.470094" elapsed="0.002120"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:04.472379" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:04.472546" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:16:04.457952" elapsed="0.014680"/>
</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-04-17T03:16:04.457430" elapsed="0.015250"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:16:04.442511" elapsed="0.030253">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:04.473127" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:16:04.473204" elapsed="0.000024"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:16:04.427250" elapsed="0.046084">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:16:04.473444" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:16:04.473488" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:04.422309" elapsed="0.051202"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:04.473855" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:16:04.473592" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:04.473573" elapsed="0.000688"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:16:04.422093" elapsed="0.052197"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:16:04.421812" elapsed="0.052511"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:16:04.419288" elapsed="0.055094"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:16:04.413968" elapsed="0.060471"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:04.413492" elapsed="0.060992"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:16:04.409632" elapsed="0.064907"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:16:04.475068" level="INFO">${cmd} = exabgp_graceful_restart.cfg &gt; exabgp_graceful_restart.log</msg>
<var>${cmd}</var>
<arg>${EXABGP3_CFG} &gt; ${EXABGP3_LOG}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:16:04.474711" elapsed="0.000386"/>
</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-04-17T03:16:04.478643" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exabgp_graceful_restart.cfg &gt; exabgp_graceful_restart.log</msg>
<var>${start_cmd}</var>
<arg>${CMD} ${cfg_file}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:16:04.478317" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:04.479247" 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-04-17T03:16:04.478827" elapsed="0.000471"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:16:04.482159" 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-04-17T03:16:04.479892" elapsed="0.002327"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:16:04.486803" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:16:04.486900" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:16:04.482399" elapsed="0.004547"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:04.487535" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:04.487282" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-04-17T03:16:04.487021" elapsed="0.000595"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:04.487001" elapsed="0.000639"/>
</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-04-17T03:16:04.479536" elapsed="0.008195"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:16:04.490506" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exabgp_graceful_restart.cfg &gt; exabgp_graceful_restart.log</msg>
<msg time="2026-04-17T03:16:04.490599" 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-04-17T03:16:04.487883" elapsed="0.002743"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:04.491052" 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-04-17T03:16:04.490785" elapsed="0.000326"/>
</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-04-17T03:16:04.477977" elapsed="0.013220"/>
</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-04-17T03:16:04.493270" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:16:04.492857" elapsed="0.000441"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:16:04.495628" 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-04-17T03:16:04.493481" elapsed="0.002176"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:16:04.498734" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:04.704420" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:05.106825" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:05.109537" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:16:04.495822" elapsed="0.619198">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:05.115370" elapsed="0.000031"/>
</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="NOT RUN" start="2026-04-17T03:16:05.115563" elapsed="0.000022"/>
</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-04-17T03:16:04.492312" elapsed="0.623393">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:16:08.123404" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:16:08.122441" elapsed="0.001035"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:16:08.126708" 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-04-17T03:16:08.123859" elapsed="0.002877"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:16:08.129759" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:08.331381" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:08.734248" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:08.737089" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:16:08.126902" elapsed="0.613632">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:08.740906" elapsed="0.000066"/>
</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="NOT RUN" start="2026-04-17T03:16:08.741188" elapsed="0.000030"/>
</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-04-17T03:16:08.116833" elapsed="0.624560">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:16:11.745303" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:16:11.744073" elapsed="0.001329"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:16:11.748776" 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-04-17T03:16:11.745757" elapsed="0.003063"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:16:11.753021" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:11.956308" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:12.358775" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:12.360620" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:16:11.749076" elapsed="0.614818">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:12.364285" elapsed="0.000036"/>
</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="NOT RUN" start="2026-04-17T03:16:12.364481" elapsed="0.000022"/>
</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-04-17T03:16:11.742654" elapsed="0.621975">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:16:12.364746" level="FAIL">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:16:04.491748" elapsed="7.873100">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:16:12.365020" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:16:12.365069" level="INFO">${value} = Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/...</msg>
<var>${status}</var>
<var>${value}</var>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:04.491359" elapsed="7.873735"/>
</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-04-17T03:16:12.366474" level="INFO">[?2004l</msg>
<msg time="2026-04-17T03:16:12.366560" level="INFO">${output} = [?2004l</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-04-17T03:16:12.366323" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:12.367134" level="INFO">[?2004l</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:12.366805" elapsed="0.000378"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:16:12.368368" 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-04-17T03:16:12.367878" elapsed="0.000529"/>
</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-04-17T03:16:12.368627" elapsed="0.000368"/>
</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-04-17T03:16:12.367410" elapsed="0.001684"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:16:12.489816" level="INFO">^C[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:16:12.490100" level="INFO">${output} = ^C[?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:16:12.369308" elapsed="0.120824"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:12.490783" level="INFO">^C[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:12.490412" elapsed="0.000422"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:16:12.492830" 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-04-17T03:16:12.491582" elapsed="0.001303"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:16:12.493823" level="INFO">[?2004l[?2004h[jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:16:12.493909" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-188-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-04-17T03:16:12.493110" elapsed="0.000828"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:12.494555" level="INFO">[?2004l[?2004h[jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:12.494300" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-04-17T03:16:12.494031" elapsed="0.000605"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:12.494008" elapsed="0.000655"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-04-17T03:16:12.491151" elapsed="0.003561"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-04-17T03:16:12.365596" elapsed="0.129168"/>
</kw>
<status status="PASS" start="2026-04-17T03:16:12.365240" elapsed="0.129553"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:12.365179" elapsed="0.129638"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="NOT RUN" start="2026-04-17T03:16:12.495021" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:12.494884" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:12.494866" elapsed="0.000221"/>
</if>
<var name="${idx}">0</var>
<status status="PASS" start="2026-04-17T03:16:04.477785" elapsed="8.017325"/>
</iter>
<iter>
<kw name="Start_ExaBgp" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:16:12.496177" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exabgp_graceful_restart.cfg &gt; exabgp_graceful_restart.log</msg>
<var>${start_cmd}</var>
<arg>${CMD} ${cfg_file}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:16:12.495823" elapsed="0.000382"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:12.496610" 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-04-17T03:16:12.496362" elapsed="0.000293"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:16:12.498790" 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-04-17T03:16:12.497307" elapsed="0.001539"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:16:12.503325" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:16:12.503416" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:16:12.499022" elapsed="0.004420"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:12.504041" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:12.503767" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-17T03:16:12.503513" elapsed="0.000611"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:12.503493" elapsed="0.000656"/>
</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-04-17T03:16:12.496905" elapsed="0.007291"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:16:12.506654" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exabgp_graceful_restart.cfg &gt; exabgp_graceful_restart.log</msg>
<msg time="2026-04-17T03:16:12.506744" 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-04-17T03:16:12.504347" elapsed="0.002424"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:12.507194" 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-04-17T03:16:12.506932" elapsed="0.000308"/>
</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-04-17T03:16:12.495493" elapsed="0.011803"/>
</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-04-17T03:16:12.509422" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:16:12.509038" elapsed="0.000460"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:16:12.512316" 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-04-17T03:16:12.509672" elapsed="0.002673"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:16:12.515283" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:12.716732" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:13.119226" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:13.121275" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:16:12.512516" elapsed="0.611826">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:13.124717" elapsed="0.000043"/>
</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="NOT RUN" start="2026-04-17T03:16:13.124994" elapsed="0.000034"/>
</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-04-17T03:16:12.508401" elapsed="0.616796">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:16:16.128290" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:16:16.127534" elapsed="0.000823"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:16:16.133074" 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-04-17T03:16:16.128726" elapsed="0.004416"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:16:16.136994" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:16.339236" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:16.742372" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:16.744578" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:16:16.133530" elapsed="0.614679">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:16.748609" elapsed="0.000045"/>
</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="NOT RUN" start="2026-04-17T03:16:16.748869" elapsed="0.000030"/>
</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-04-17T03:16:16.126357" elapsed="0.622734">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:16:19.751770" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:16:19.751073" elapsed="0.000758"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:16:19.755628" 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-04-17T03:16:19.752161" elapsed="0.003515"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:16:19.759811" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:19.962289" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:20.365496" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:20.367604" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:16:19.755983" elapsed="0.615228">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:20.371601" elapsed="0.000048"/>
</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="NOT RUN" start="2026-04-17T03:16:20.371882" elapsed="0.000033"/>
</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-04-17T03:16:19.750061" elapsed="0.622049">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:16:20.372313" level="FAIL">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:16:12.507852" elapsed="7.864632">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:16:20.372702" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:16:20.372771" level="INFO">${value} = Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/...</msg>
<var>${status}</var>
<var>${value}</var>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:12.507457" elapsed="7.865353"/>
</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-04-17T03:16:20.374230" level="INFO">[?2004l</msg>
<msg time="2026-04-17T03:16:20.374359" level="INFO">${output} = [?2004l</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-04-17T03:16:20.374027" elapsed="0.000369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:20.375084" level="INFO">[?2004l</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:20.374629" elapsed="0.000526"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:16:20.376444" 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-04-17T03:16:20.375923" elapsed="0.000563"/>
</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-04-17T03:16:20.376716" elapsed="0.000476"/>
</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-04-17T03:16:20.375508" elapsed="0.001802"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:16:20.500901" level="INFO">^C[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:16:20.501166" level="INFO">${output} = ^C[?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:16:20.377676" elapsed="0.123523"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:20.501917" level="INFO">^C[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:20.501555" elapsed="0.000438"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:16:20.504467" 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-04-17T03:16:20.502788" elapsed="0.001742"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:16:20.505652" level="INFO">[?2004l[?2004h[jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:16:20.505758" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-188-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-04-17T03:16:20.504701" elapsed="0.001086"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:20.506478" level="INFO">[?2004l[?2004h[jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:20.506201" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-17T03:16:20.505876" elapsed="0.000698"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:20.505848" elapsed="0.000777"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-04-17T03:16:20.502359" elapsed="0.004326"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-04-17T03:16:20.373527" elapsed="0.133212"/>
</kw>
<status status="PASS" start="2026-04-17T03:16:20.372992" elapsed="0.133775"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:20.372925" elapsed="0.133867"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="NOT RUN" start="2026-04-17T03:16:20.506996" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:20.506852" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:20.506835" elapsed="0.000252"/>
</if>
<var name="${idx}">1</var>
<status status="PASS" start="2026-04-17T03:16:12.495296" elapsed="8.011814"/>
</iter>
<iter>
<kw name="Start_ExaBgp" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:16:20.508233" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exabgp_graceful_restart.cfg &gt; exabgp_graceful_restart.log</msg>
<var>${start_cmd}</var>
<arg>${CMD} ${cfg_file}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:16:20.507870" elapsed="0.000392"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:20.508744" 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-04-17T03:16:20.508423" elapsed="0.000370"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:16:20.511577" 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-04-17T03:16:20.509720" elapsed="0.001927"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:16:20.515809" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:16:20.515920" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:16:20.511866" elapsed="0.004105"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:20.516615" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:20.516328" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-04-17T03:16:20.516054" elapsed="0.000661"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:20.516032" elapsed="0.000723"/>
</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-04-17T03:16:20.509059" elapsed="0.007774"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:16:20.519394" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exabgp_graceful_restart.cfg &gt; exabgp_graceful_restart.log</msg>
<msg time="2026-04-17T03:16:20.519490" 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-04-17T03:16:20.517035" elapsed="0.002482"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:20.519963" 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-04-17T03:16:20.519679" elapsed="0.000335"/>
</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-04-17T03:16:20.507508" elapsed="0.012563"/>
</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-04-17T03:16:20.522103" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:16:20.521713" elapsed="0.000418"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:16:20.524535" 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-04-17T03:16:20.522328" elapsed="0.002235"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:16:20.527363" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:20.728645" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:21.131568" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:21.134068" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:16:20.524729" elapsed="0.612807">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:21.138021" elapsed="0.000045"/>
</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="NOT RUN" start="2026-04-17T03:16:21.138287" elapsed="0.000031"/>
</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-04-17T03:16:20.521218" elapsed="0.617268">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:16:24.141337" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:16:24.140664" elapsed="0.000727"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:16:24.146087" 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-04-17T03:16:24.141956" elapsed="0.004177"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:16:24.149922" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:24.351654" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:24.754649" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:24.757402" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:16:24.146390" elapsed="0.616905">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:24.763865" elapsed="0.000033"/>
</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="NOT RUN" start="2026-04-17T03:16:24.764070" elapsed="0.000022"/>
</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-04-17T03:16:24.139600" elapsed="0.624615">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:16:27.766443" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:16:27.765815" elapsed="0.000674"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:16:27.769758" 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-04-17T03:16:27.766752" elapsed="0.003052"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:16:27.773679" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:27.975659" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:28.378576" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:28.381841" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:16:27.770078" elapsed="0.617359">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:28.387958" elapsed="0.000068"/>
</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="NOT RUN" start="2026-04-17T03:16:28.388267" elapsed="0.000032"/>
</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-04-17T03:16:27.764987" elapsed="0.623509">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:16:28.388688" level="FAIL">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:16:20.520648" elapsed="7.868202">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:16:28.389146" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:16:28.389222" level="INFO">${value} = Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/...</msg>
<var>${status}</var>
<var>${value}</var>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:20.520239" elapsed="7.869022"/>
</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-04-17T03:16:28.391605" level="INFO">[?2004l</msg>
<msg time="2026-04-17T03:16:28.391734" level="INFO">${output} = [?2004l</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-04-17T03:16:28.390718" elapsed="0.001053"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:28.392694" level="INFO">[?2004l</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:28.392099" elapsed="0.000667"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:16:28.394150" 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-04-17T03:16:28.393576" elapsed="0.000616"/>
</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-04-17T03:16:28.394462" elapsed="0.000589"/>
</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-04-17T03:16:28.393107" elapsed="0.002052"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:16:28.516317" level="INFO">^C[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:16:28.516576" level="INFO">${output} = ^C[?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:16:28.395391" elapsed="0.121221"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:28.517351" level="INFO">^C[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:28.516922" elapsed="0.000491"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:16:28.519416" 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-04-17T03:16:28.518288" elapsed="0.001200"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:16:28.520706" level="INFO">[?2004l[?2004h[jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:16:28.520834" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-188-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-04-17T03:16:28.519674" elapsed="0.001188"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:28.521803" level="INFO">[?2004l[?2004h[jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:28.521344" elapsed="0.000527"/>
</kw>
<status status="PASS" start="2026-04-17T03:16:28.520981" elapsed="0.000966"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:28.520929" elapsed="0.001060"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-04-17T03:16:28.517738" elapsed="0.004410"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-04-17T03:16:28.390143" elapsed="0.132079"/>
</kw>
<status status="PASS" start="2026-04-17T03:16:28.389457" elapsed="0.132802"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:28.389406" elapsed="0.132889"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="NOT RUN" start="2026-04-17T03:16:28.522512" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:28.522377" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:28.522357" elapsed="0.000227"/>
</if>
<var name="${idx}">2</var>
<status status="PASS" start="2026-04-17T03:16:20.507304" elapsed="8.015306"/>
</iter>
<var>${idx}</var>
<value>${connection_retries}</value>
<status status="PASS" start="2026-04-17T03:16:04.477563" elapsed="24.045085"/>
</for>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:16:28.523263" level="FAIL">Unable to connect ExaBgp to ODL</msg>
<arg>Unable to connect ExaBgp to ODL</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:16:28.522833" elapsed="0.000535">Unable to connect ExaBgp to ODL</status>
</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="FAIL" start="2026-04-17T03:16:04.475450" elapsed="24.048043">Unable to connect ExaBgp to ODL</status>
</kw>
<doc>Start exabgp with</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:16:04.409034" elapsed="24.114700">Unable to connect ExaBgp to ODL</status>
</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-04-17T03:16:28.527680" elapsed="0.000304"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:16:28.527354" elapsed="0.000700"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:16:28.529351" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:28.529152" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:28.529118" elapsed="0.000331"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:16:28.536219" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:28.536038" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:28.535999" elapsed="0.000305"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:16:28.537849" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:16:28.537077" elapsed="0.000846"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:16:28.538473" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:16:28.538137" elapsed="0.000378"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:16:28.538638" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:16:28.538875" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:16:28.536620" elapsed="0.002381"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:16:28.546713" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:28.546523" elapsed="0.000259"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:28.546495" elapsed="0.000312"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:16:28.548785" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:28.548664" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:28.548645" elapsed="0.000216"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:16:28.549654" level="INFO">${karaf_connection_index} = 50</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:16:28.549052" elapsed="0.000678"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:16:28.550156" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:16:28.549902" elapsed="0.000282"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:16:28.551103" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:16:28.550741" elapsed="0.001398">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:16:28.552416" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:16:28.552481" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:28.550349" elapsed="0.002184"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:16:28.553743" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:16:28.553374" elapsed="0.001144">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:16:28.554854" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:16:28.554906" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:28.552790" elapsed="0.002158"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:16:28.556418" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Bgp_Peer_Configuration_6"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:16:28.555311" elapsed="0.001221">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Bgp_Peer_Configuration_6"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:16:28.555048" elapsed="0.001565">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Bgp_Peer_Configuration_6"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:16:28.555019" elapsed="0.001632">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Bgp_Peer_Configuration_6"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:28.556825" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:28.557112" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:16:28.556955" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:16:28.556910" elapsed="0.000286"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:16:28.557244" 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-04-17T03:16:28.560670" elapsed="0.000186"/>
</kw>
<msg time="2026-04-17T03:16:28.560958" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:16:28.559178" elapsed="0.001962"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:28.561511" elapsed="0.000080"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:28.561860" elapsed="0.000117"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:16:28.558459" elapsed="0.003672"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:16:28.557692" elapsed="0.004525"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:16:28.548303" elapsed="0.014044">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Bgp_Peer_Configuration_6"</status>
</kw>
<msg time="2026-04-17T03:16:28.562507" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:16:28.562586" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Delete_Bgp_Peer_Configuration_6"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:28.547086" elapsed="0.015547"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:16:28.563028" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:28.562802" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:28.562764" elapsed="0.000368"/>
</if>
<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-04-17T03:16:28.564413" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:28.564274" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:28.564250" elapsed="0.000234"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:16:28.564856" level="INFO">index=15
host=10.30.170.120
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-04-17T03:16:28.565005" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
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-04-17T03:16:28.564690" elapsed="0.000555"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:28.565745" level="INFO">{1: 50}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:28.565414" elapsed="0.000377"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:28.566243" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:28.565967" elapsed="0.000333"/>
</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-04-17T03:16:28.566900" elapsed="0.000317"/>
</kw>
<msg time="2026-04-17T03:16:28.567335" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:16:28.567386" level="INFO">${old_connection_index} = 50</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:28.566465" elapsed="0.000945"/>
</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-04-17T03:16:28.568639" elapsed="0.000227"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:16:28.570073" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:16:28.569597" elapsed="0.001745">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:28.569058" elapsed="0.002429"/>
</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-04-17T03:16:28.572526" elapsed="0.000309"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:28.571682" elapsed="0.001262"/>
</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-04-17T03:16:28.567800" elapsed="0.005200"/>
</kw>
<status status="PASS" start="2026-04-17T03:16:28.567542" elapsed="0.005521"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:28.567522" elapsed="0.005577"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:16:28.574308" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:16:28.573757" elapsed="0.000582"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:16:28.574393" elapsed="0.000048"/>
</return>
<msg time="2026-04-17T03:16:28.574577" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:16:28.573370" elapsed="0.001233"/>
</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-04-17T03:16:28.574769" elapsed="0.000504"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:16:28.576002" level="INFO">index=51
host=10.30.170.120
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-04-17T03:16:28.576121" level="INFO">${karaf_connection_object} = index=51
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:16:28.575508" elapsed="0.000641"/>
</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-04-17T03:16:28.576319" elapsed="0.002510"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:16:28.579407" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:16:28.580808" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:16:28.579063" elapsed="0.002242">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:16:28.599413" elapsed="0.001069"/>
</kw>
<msg time="2026-04-17T03:16:28.600657" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:16:28.596744" elapsed="0.004207"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:28.601262" elapsed="0.000042"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:28.601522" elapsed="0.000030"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:16:28.582511" elapsed="0.019162"/>
</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-04-17T03:16:28.581740" elapsed="0.020003"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:16:28.563744" elapsed="0.038171">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:28.602607" elapsed="0.000040"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:16:28.602719" 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="FAIL" start="2026-04-17T03:16:28.545997" elapsed="0.056901">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:16:28.603101" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:16:28.603167" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:28.539684" elapsed="0.063629"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:28.604293" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:16:28.603443" elapsed="0.000953"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:28.603411" elapsed="0.001026"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:16:28.539523" elapsed="0.064953"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:16:28.539096" elapsed="0.065430"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:16:28.535275" elapsed="0.069366"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:16:28.528739" elapsed="0.075989"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:28.528215" elapsed="0.076609"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:16:28.524649" elapsed="0.080275"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:16:28.606532" 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-04-17T03:16:28.605329" elapsed="0.001252"/>
</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-04-17T03:16:28.669604" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/graceful_restart.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:16:28.669021" elapsed="0.000621"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:16:28.670566" 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-04-17T03:16:28.670228" elapsed="0.000435">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-04-17T03:16:28.670811" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:16:28.669836" elapsed="0.001006"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:16:28.671590" 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-04-17T03:16:28.671109" elapsed="0.000510"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:16:28.672127" 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-04-17T03:16:28.672364" 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-04-17T03:16:28.671808" elapsed="0.000587"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:28.672952" 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-04-17T03:16:28.672614" elapsed="0.000400"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:28.674510" 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-04-17T03:16:28.674009" elapsed="0.000555"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:16:28.675248" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:16:28.674733" elapsed="0.000547"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:16:28.676068" 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-04-17T03:16:28.675692" elapsed="0.000404"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:16:28.677143" 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-04-17T03:16:28.676696" elapsed="0.000475"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:16:28.677236" elapsed="0.000054"/>
</return>
<msg time="2026-04-17T03:16:28.677453" 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-04-17T03:16:28.676339" elapsed="0.001145"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:16:28.677666" elapsed="0.000313"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">2607:f0d0:1002:0011:0000:0000:0000:0002</var>
<status status="PASS" start="2026-04-17T03:16:28.675549" elapsed="0.002476"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:16:28.678684" 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-04-17T03:16:28.678332" elapsed="0.000379"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:16:28.679581" 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-04-17T03:16:28.679340" elapsed="0.000268"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:16:28.679660" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:16:28.679842" 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-04-17T03:16:28.678982" 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-04-17T03:16:28.680111" elapsed="0.000273"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:16:28.678168" elapsed="0.002270"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:16:28.681104" 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-04-17T03:16:28.680708" elapsed="0.000424"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:16:28.682008" 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-04-17T03:16:28.681734" elapsed="0.000302"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:16:28.682089" elapsed="0.000049"/>
</return>
<msg time="2026-04-17T03:16:28.682289" 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-04-17T03:16:28.681371" 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-04-17T03:16:28.682500" elapsed="0.000591"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:16:28.680561" elapsed="0.002586"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:16:28.683805" 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-04-17T03:16:28.683436" elapsed="0.000398"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:16:28.684901" 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-04-17T03:16:28.684645" elapsed="0.000301"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:16:28.685012" elapsed="0.000049"/>
</return>
<msg time="2026-04-17T03:16:28.685210" 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-04-17T03:16:28.684131" elapsed="0.001107"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:16:28.685403" elapsed="0.000260"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:16:28.683291" elapsed="0.002415"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:16:28.686374" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:16:28.685997" elapsed="0.000415"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:16:28.687245" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:16:28.687000" elapsed="0.000280"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:16:28.687334" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:16:28.687525" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:16:28.686631" 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-04-17T03:16:28.687720" elapsed="0.000459"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:16:28.685832" elapsed="0.002413"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:16:28.688902" 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-04-17T03:16:28.688544" elapsed="0.000414"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:16:28.689973" 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-04-17T03:16:28.689690" elapsed="0.000312"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:16:28.690057" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:16:28.690255" 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-04-17T03:16:28.689209" 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-04-17T03:16:28.690444" elapsed="0.000252"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:16:28.688376" elapsed="0.002362"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:16:28.691468" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:16:28.691069" elapsed="0.000449"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:16:28.692442" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:16:28.692181" elapsed="0.000288"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:16:28.692522" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:16:28.692693" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:16:28.691756" elapsed="0.000962"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:16:28.692873" elapsed="0.000280"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:16:28.690879" elapsed="0.002316"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:16:28.693831" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:16:28.693480" elapsed="0.000379"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:16:28.694669" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:16:28.694441" elapsed="0.000255"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:16:28.694749" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:16:28.694946" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:16:28.694091" 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-04-17T03:16:28.695162" elapsed="0.000263"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:16:28.693330" elapsed="0.002147"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:16:28.675344" elapsed="0.020173"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:16:28.695568" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:16:28.695763" 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-04-17T03:16:28.673587" elapsed="0.022204"/>
</kw>
<status status="PASS" start="2026-04-17T03:16:28.673119" elapsed="0.022718"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:28.696125" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:16:28.695870" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:28.673085" elapsed="0.023133"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:16:28.699364" 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-04-17T03:16:28.696370" elapsed="0.003043"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:16:28.699493" elapsed="0.000050"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:16:28.667655" elapsed="0.032008"/>
</kw>
<msg time="2026-04-17T03:16:28.699729" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:16:28.652019" elapsed="0.047765"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:16:28.715100" 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/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-04-17T03:16:28.731424" elapsed="0.000072"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:16:28.747576" elapsed="0.000068"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:28.747920" elapsed="0.000052"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:28.748184" elapsed="0.000038"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:28.748768" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:16:28.748540" elapsed="0.000291"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:16:28.748521" 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-04-17T03:16:28.749050" 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-04-17T03:16:28.749260" 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-04-17T03:16:28.749452" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:16:28.748477" elapsed="0.001031"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:16:28.748296" elapsed="0.001242"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:28.749703" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:16:28.749807" elapsed="0.000025"/>
</return>
<msg time="2026-04-17T03:16:28.750029" 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-04-17T03:16:28.644903" elapsed="0.105170"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:28.751983" 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-04-17T03:16:28.751535" elapsed="0.000517"/>
</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-04-17T03:16:28.759758" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:16:28.962376" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:16:29.366019" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:16:29.369368" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:16:28.755680" elapsed="0.617796">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:16:28.752193" elapsed="0.621533">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:16:29.374289" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:16:29.373831" elapsed="0.000571"/>
</branch>
<status status="FAIL" start="2026-04-17T03:16:28.752119" elapsed="0.622320">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:16:29.375232" elapsed="0.000045"/>
</kw>
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:16:29.375359" elapsed="0.000036"/>
</return>
<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-04-17T03:16:28.750495" elapsed="0.625060">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:16:29.375653" 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="FAIL" start="2026-04-17T03:16:28.607028" elapsed="0.768767">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="FAIL" start="2026-04-17T03:16:28.524014" elapsed="0.852156">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:16:29.382229" elapsed="0.000514"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:16:29.381782" elapsed="0.001057"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:16:29.384118" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:29.383982" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:29.383958" elapsed="0.000277"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:16:29.389909" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:29.389768" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:29.389729" elapsed="0.000344"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:16:29.391394" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:16:29.390857" elapsed="0.000580"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:16:29.391965" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:16:29.391607" elapsed="0.000387"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:16:29.392056" elapsed="0.000048"/>
</return>
<msg time="2026-04-17T03:16:29.392244" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:16:29.390345" elapsed="0.001925"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:16:29.398484" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:29.398365" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:29.398311" 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-04-17T03:16:29.399915" elapsed="0.000047"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:29.399798" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:29.399777" elapsed="0.000241"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:16:29.400523" level="INFO">${karaf_connection_index} = 51</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:16:29.400182" elapsed="0.000370"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:16:29.401033" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:16:29.400735" elapsed="0.000326"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:16:29.401954" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:16:29.401596" elapsed="0.001421">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:16:29.403234" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:16:29.403282" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:29.401224" elapsed="0.002081"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:16:29.404142" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:16:29.403858" elapsed="0.000991">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:16:29.405105" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:16:29.405153" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:29.403478" elapsed="0.001698"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:16:29.406174" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Stop_All_Exabgps_4"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:16:29.405490" elapsed="0.000747">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Stop_All_Exabgps_4"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:16:29.405255" elapsed="0.001057">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Stop_All_Exabgps_4"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:16:29.405235" elapsed="0.001112">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Stop_All_Exabgps_4"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:29.406515" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:29.406838" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:16:29.406604" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:16:29.406586" elapsed="0.000337"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:16:29.406973" elapsed="0.000018"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:16:29.409751" elapsed="0.000159"/>
</kw>
<msg time="2026-04-17T03:16:29.410003" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:16:29.408542" 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-04-17T03:16:29.410478" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:29.411007" 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-04-17T03:16:29.407844" elapsed="0.003379"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:16:29.407267" elapsed="0.004026"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:16:29.399471" elapsed="0.011915">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Stop_All_Exabgps_4"</status>
</kw>
<msg time="2026-04-17T03:16:29.411501" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:16:29.411546" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Stop_All_Exabgps_4"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:29.398785" elapsed="0.012787"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:16:29.411769" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:29.411654" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:29.411634" elapsed="0.000203"/>
</if>
<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-04-17T03:16:29.412779" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:29.412664" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:29.412647" elapsed="0.000200"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:16:29.413240" level="INFO">index=15
host=10.30.170.120
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-04-17T03:16:29.413347" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
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-04-17T03:16:29.413103" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:29.413809" level="INFO">{1: 51}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:29.413529" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:29.414275" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:29.414027" elapsed="0.000292"/>
</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-04-17T03:16:29.414924" elapsed="0.000297"/>
</kw>
<msg time="2026-04-17T03:16:29.415321" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:16:29.415367" level="INFO">${old_connection_index} = 51</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:29.414479" elapsed="0.000910"/>
</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-04-17T03:16:29.416380" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:16:29.418314" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:16:29.417693" elapsed="0.002203">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:29.416885" elapsed="0.003184"/>
</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-04-17T03:16:29.421046" elapsed="0.000396"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:29.420319" elapsed="0.001258"/>
</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-04-17T03:16:29.415692" elapsed="0.005955"/>
</kw>
<status status="PASS" start="2026-04-17T03:16:29.415466" elapsed="0.006252"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:29.415446" elapsed="0.006308"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:16:29.423297" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:16:29.422636" elapsed="0.000701"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:16:29.423408" elapsed="0.000045"/>
</return>
<msg time="2026-04-17T03:16:29.423628" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:16:29.422150" elapsed="0.001513"/>
</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-04-17T03:16:29.423897" elapsed="0.000498"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:16:29.424702" level="INFO">index=52
host=10.30.170.120
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-04-17T03:16:29.424886" level="INFO">${karaf_connection_object} = index=52
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:16:29.424579" elapsed="0.000336"/>
</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-04-17T03:16:29.425139" elapsed="0.002529"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:16:29.428139" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:16:29.429490" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:16:29.427838" elapsed="0.002062">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:16:29.445364" elapsed="0.000416"/>
</kw>
<msg time="2026-04-17T03:16:29.445874" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:16:29.443542" elapsed="0.002520"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:29.446230" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:29.446393" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:16:29.430742" elapsed="0.015745"/>
</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-04-17T03:16:29.430208" elapsed="0.016328"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:16:29.412359" elapsed="0.034270">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:29.447139" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:16:29.447221" 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="FAIL" start="2026-04-17T03:16:29.397888" elapsed="0.049446">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:16:29.447448" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:16:29.447492" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:29.392687" elapsed="0.054829"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:29.447868" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:16:29.447601" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:29.447580" elapsed="0.000507"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:16:29.392537" elapsed="0.055579"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:16:29.392341" elapsed="0.055812"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:16:29.389317" elapsed="0.058900"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:16:29.383638" elapsed="0.064642"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:29.383090" elapsed="0.065238"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:16:29.377626" elapsed="0.070759"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:16:29.458648" level="INFO">Executing command 'cat exabgp_graceful_restart.log'.</msg>
<msg time="2026-04-17T03:16:29.472148" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:16:29.472638" level="INFO">${output_log} = 03:16:20 | 3545   | welcome         | Thank you for using ExaBGP
03:16:20 | 3545   | version         | 4.2.4
03:16:20 | 3545   | interpreter     | 3.10.12 (main, Jan 26 2026, 14:55:28) [GCC 11.4.0]
03...</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-04-17T03:16:29.458483" elapsed="0.014197"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:29.473717" level="INFO">03:16:20 | 3545   | welcome         | Thank you for using ExaBGP
03:16:20 | 3545   | version         | 4.2.4
03:16:20 | 3545   | interpreter     | 3.10.12 (main, Jan 26 2026, 14:55:28) [GCC 11.4.0]
03:16:20 | 3545   | os              | Linux releng-26932-188-0-builder-0 5.15.0-171-generic #181-Ubuntu SMP Fri Feb 6 22:44:50 UTC 2026 x86_64
03:16:20 | 3545   | installation    | /tmp/defaultvenv
03:16:20 | 3545   | advice          | environment file missing
03:16:20 | 3545   | advice          | generate it using "exabgp --fi &gt; /tmp/defaultvenv/etc/exabgp/exabgp.env"
03:16:20 | 3545   | cli             | could not find the named pipes (exabgp.in and exabgp.out) required for the cli
03:16:20 | 3545   | cli             | we scanned the following folders (the number is your PID):
03:16:20 | 3545   | cli control     |  - /run/exabgp/
03:16:20 | 3545   | cli control     |  - /run/1001/
03:16:20 | 3545   | cli control     |  - /run/
03:16:20 | 3545   | cli control     |  - /var/run/exabgp/
03:16:20 | 3545   | cli control     |  - /var/run/1001/
03:16:20 | 3545   | cli control     |  - /var/run/
03:16:20 | 3545   | cli control     |  - /tmp/defaultvenv/run/exabgp/
03:16:20 | 3545   | cli control     |  - /tmp/defaultvenv/run/1001/
03:16:20 | 3545   | cli control     |  - /tmp/defaultvenv/run/
03:16:20 | 3545   | cli control     |  - /tmp/defaultvenv/var/run/exabgp/
03:16:20 | 3545   | cli control     |  - /tmp/defaultvenv/var/run/1001/
03:16:20 | 3545   | cli control     |  - /tmp/defaultvenv/var/run/
03:16:20 | 3545   | cli control     | please make them in one of the folder with the following commands:
03:16:20 | 3545   | cli control     | &gt; mkfifo /home/jenkins/run/exabgp.{in,out}
03:16:20 | 3545   | cli control     | &gt; chmod 600 /home/jenkins/run/exabgp.{in,out}
03:16:20 | 3545   | cli control     | &gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}
03:16:20 | 3545   | configuration   | performing reload of exabgp 4.2.4
03:16:20 | 3545   | configuration   | &gt; neighbor         | '::1'
03:16:20 | 3545   | configuration   | . router-id        | '1.2.3.4'
03:16:20 | 3545   | configuration   | . local-address    | '2607:f0d0:1002:0011:0000:0000:0000:0002'
03:16:20 | 3545   | configuration   | . local-as         | '64496'
03:16:20 | 3545   | configuration   | . peer-as          | '64496'
03:16:20 | 3545   | configuration   | &gt; capability       | 
03:16:20 | 3545   | configuration   | . graceful-restart | '40'
03:16:20 | 3545   | configuration   | &lt; capability       | 
03:16:20 | 3545   | configuration   | &gt; family           | 
03:16:20 | 3545   | configuration   | . ipv6             | 'unicast'
03:16:20 | 3545   | configuration   | &lt; family           | 
03:16:20 | 3545   | configuration   | &gt; static           | 
03:16:20 | 3545   | configuration   | . route            | '2a04:6d80::1/128' 'next-hop' 'self'
03:16:20 | 3545   | configuration   | &lt; static           | 
03:16:20 | 3545   | configuration   | &lt; neighbor         | 
03:16:20 | 3545   | 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
03:16:20 | 3545   | reactor         | loaded new configuration successfully
03:16:20 | 3545   | reactor         | initialising connection to peer-1
03:16:20 | 3545   | outgoing-1      | attempting connection to ::1:1790
03:16:20 | 3545   | 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
03:16:20 | 3545   | outgoing-1      | outgoing-1 2607:f0d0:1002:0011:0000:0000:0000:0002-::1, closing connection
03:16:20 | 3545   | outgoing-1      | peer reset, message [closing connection] error[Broken TCP connection]
03:16:20 | 3545   | outgoing-1      | outgoing-1 2607:f0d0:1002:0011:0000:0000:0000:0002-::1, closing connection
03:16:20 | 3545   | reactor         | initialising connection to peer-1
03:16:20 | 3545   | outgoing-2      | attempting connection to ::1:1790
03:16:20 | 3545   | 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
03:16:20 | 3545   | outgoing-2      | outgoing-2 2607:f0d0:1002:0011:0000:0000:0000:0002-::1, closing connection
03:16:20 | 3545   | outgoing-2      | peer reset, message [closing connection] error[Broken TCP connection]
03:16:20 | 3545   | outgoing-2      | outgoing-2 2607:f0d0:1002:0011:0000:0000:0000:0002-::1, closing connection
03:16:21 | 3545   | reactor         | initialising connection to peer-1
03:16:21 | 3545   | outgoing-3      | attempting connection to ::1:1790
03:16:21 | 3545   | outgoing-3      | 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
03:16:21 | 3545   | outgoing-3      | outgoing-3 2607:f0d0:1002:0011:0000:0000:0000:0002-::1, closing connection
03:16:21 | 3545   | outgoing-3      | peer reset, message [closing connection] error[Broken TCP connection]
03:16:21 | 3545   | outgoing-3      | outgoing-3 2607:f0d0:1002:0011:0000:0000:0000:0002-::1, closing connection
03:16:23 | 3545   | reactor         | initialising connection to peer-1
03:16:23 | 3545   | outgoing-4      | attempting connection to ::1:1790
03:16:23 | 3545   | outgoing-4      | 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
03:16:23 | 3545   | outgoing-4      | outgoing-4 2607:f0d0:1002:0011:0000:0000:0000:0002-::1, closing connection
03:16:23 | 3545   | outgoing-4      | peer reset, message [closing connection] error[Broken TCP connection]
03:16:23 | 3545   | outgoing-4      | outgoing-4 2607:f0d0:1002:0011:0000:0000:0000:0002-::1, closing connection
03:16:26 | 3545   | reactor         | initialising connection to peer-1
03:16:26 | 3545   | outgoing-5      | attempting connection to ::1:1790
03:16:26 | 3545   | outgoing-5      | 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
03:16:26 | 3545   | outgoing-5      | outgoing-5 2607:f0d0:1002:0011:0000:0000:0000:0002-::1, closing connection
03:16:26 | 3545   | outgoing-5      | peer reset, message [closing connection] error[Broken TCP connection]
03:16:26 | 3545   | outgoing-5      | outgoing-5 2607:f0d0:1002:0011:0000:0000:0000:0002-::1, closing connection
03:16:28 | 3545   | reactor         | ^C received
03:16:28 | 3545   | reactor         | performing shutdown</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:29.473106" elapsed="0.000899"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-04-17T03:16:29.474915" 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-04-17T03:16:29.474299" elapsed="0.000788"/>
</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-04-17T03:16:29.458008" elapsed="0.017341"/>
</kw>
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-04-17T03:16:29.476387" level="INFO">${output} =  </msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-04-17T03:16:29.476154" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:29.477055" level="INFO"> </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:29.476634" elapsed="0.000508"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:16:29.479978" 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-04-17T03:16:29.478771" elapsed="0.001247"/>
</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-04-17T03:16:29.480207" elapsed="0.000274"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-04-17T03:16:29.477545" elapsed="0.002999"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:16:29.513171" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:16:29.513389" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-188-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-04-17T03:16:29.480696" elapsed="0.032723"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:29.514058" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:29.513684" elapsed="0.000426"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:16:29.515807" 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-04-17T03:16:29.514826" elapsed="0.001037"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:16:29.680810" level="INFO">[?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:16:29.681047" level="INFO">${output} = [?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-188-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-04-17T03:16:29.516049" elapsed="0.165030"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:29.682027" level="INFO">[?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:29.681628" elapsed="0.000452"/>
</kw>
<status status="PASS" start="2026-04-17T03:16:29.681210" elapsed="0.000907"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:29.681171" elapsed="0.000974"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-04-17T03:16:29.514411" elapsed="0.167795"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-04-17T03:16:29.475701" elapsed="0.206565"/>
</kw>
<doc>Save exabgp logs as exabgp_graceful_restart.log, and stop exabgp with ctrl-c bash signal</doc>
<status status="PASS" start="2026-04-17T03:16:29.376559" elapsed="0.305831"/>
</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-04-17T03:16:29.689662" level="INFO">${cd_and_command} = cd '.' &amp;&amp; rm -rf /tmp/defaultvenv</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:16:29.689196" elapsed="0.000509"/>
</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-04-17T03:16:29.691409" level="INFO">Executing command 'cd '.' &amp;&amp; rm -rf /tmp/defaultvenv'.</msg>
<msg time="2026-04-17T03:16:29.734841" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:16:29.735216" level="INFO">${stdout} = </msg>
<msg time="2026-04-17T03:16:29.735314" level="INFO">${stderr} = </msg>
<msg time="2026-04-17T03:16:29.735404" 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-04-17T03:16:29.691205" elapsed="0.044251"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:16:29.737773" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-04-17T03:16:29.737134" elapsed="0.000742"/>
</kw>
<msg time="2026-04-17T03:16:29.738122" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-04-17T03:16:29.738220" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:29.736048" elapsed="0.002223"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:16:29.739851" 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-04-17T03:16:29.738714" elapsed="0.001200"/>
</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-04-17T03:16:29.742458" level="INFO"/>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:29.742022" elapsed="0.000503"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:29.743439" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:29.742955" elapsed="0.000567"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:29.745031" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:29.743827" elapsed="0.001289"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-04-17T03:16:29.741289" elapsed="0.003923"/>
</kw>
<status status="PASS" start="2026-04-17T03:16:29.740351" elapsed="0.004933"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:29.740282" elapsed="0.005056"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-04-17T03:16:29.745678" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:29.745460" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:29.745425" elapsed="0.000390"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:16:29.746123" elapsed="0.000073"/>
</return>
<status status="PASS" start="2026-04-17T03:16:29.745917" elapsed="0.000345"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:29.745887" elapsed="0.000424"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:29.746608" 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-04-17T03:16:29.690575" elapsed="0.056265"/>
</kw>
<msg time="2026-04-17T03:16:29.746951" 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-04-17T03:16:29.689883" elapsed="0.057168"/>
</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-04-17T03:16:29.688490" elapsed="0.058679"/>
</kw>
<msg time="2026-04-17T03:16:29.747260" 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-04-17T03:16:29.684141" elapsed="0.063219"/>
</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-04-17T03:16:29.683710" elapsed="0.063802"/>
</kw>
<doc>Deletes a directory with virtual env.</doc>
<status status="PASS" start="2026-04-17T03:16:29.683453" elapsed="0.064162"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-04-17T03:16:29.747884" elapsed="0.000614"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-17T03:16:29.748947" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-17T03:16:29.748780" elapsed="0.000283"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-04-17T03:16:29.750336" level="INFO">${output} = None</msg>
<msg time="2026-04-17T03:16:29.750387" 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-04-17T03:16:29.750125" elapsed="0.000778">No open connection.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:29.751455" level="INFO">None</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:29.751150" elapsed="0.000357"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:16:29.752331" 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-04-17T03:16:29.751951" elapsed="0.000407"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<msg time="2026-04-17T03:16:29.752702" 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-04-17T03:16:29.752510" elapsed="0.000468">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-04-17T03:16:29.751716" elapsed="0.001418">No open connection.</status>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:16:29.753453" level="INFO">${output} = None</msg>
<msg time="2026-04-17T03:16:29.753494" 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-04-17T03:16:29.753298" elapsed="0.000405">No open connection.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:29.754141" level="INFO">None</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:29.753870" elapsed="0.000315"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:16:29.754907" 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-04-17T03:16:29.754761" elapsed="0.000414">No open connection.</status>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:16:29.755496" level="INFO">${output} = None</msg>
<msg time="2026-04-17T03:16:29.755537" 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-04-17T03:16:29.755343" elapsed="0.000394">No open connection.</status>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:29.756499" level="INFO">None</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:29.756236" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-04-17T03:16:29.755821" elapsed="0.000758"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:29.755801" elapsed="0.000803"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="FAIL" start="2026-04-17T03:16:29.754443" elapsed="0.002270">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-04-17T03:16:29.749780" elapsed="0.007051">Several failures occurred:

1) No open connection.

2) No open connection.

3) No open connection.

4) No open connection.

5) No open connection.</status>
</kw>
<arg>ExaBgpLib.Stop_ExaBgp</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:29.749250" elapsed="0.007634"/>
</kw>
<doc>Suite teardown keyword</doc>
<status status="PASS" start="2026-04-17T03:16:29.683166" elapsed="0.073791"/>
</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="FAIL" start="2026-04-17T03:10:45.079541" elapsed="344.677452"/>
</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-04-17T03:16:29.854390" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:16:29.850138" elapsed="0.004314"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-17T03:16:29.849877" elapsed="0.004651"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-17T03:16:29.859405" 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-04-17T03:16:29.855716" elapsed="0.003719"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-17T03:16:29.859656" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:29.859529" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:29.859502" elapsed="0.000223"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:16:29.860299" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:16:29.859888" elapsed="0.000455"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-17T03:16:29.861248" 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-04-17T03:16:29.860849" elapsed="0.000426"/>
</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-04-17T03:16:29.861783" elapsed="0.000312"/>
</kw>
<msg time="2026-04-17T03:16:29.862192" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:16:29.862240" level="INFO">${possibly_int_of_members} = 1</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:29.861441" elapsed="0.000823"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:16:29.862810" 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-04-17T03:16:29.862432" elapsed="0.000405"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:16:29.863900" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:16:29.863626" elapsed="0.000304"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:16:29.864349" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:16:29.864092" elapsed="0.000299"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:16:29.864843" 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-04-17T03:16:29.864547" 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-04-17T03:16:29.868153" elapsed="0.000215"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:16:29.868905" level="INFO">${member_ip} = 10.30.170.120</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:16:29.868575" elapsed="0.000371"/>
</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-04-17T03:16:29.869099" elapsed="0.000228"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:16:29.870137" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:16:29.869815" elapsed="0.000349"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-17T03:16:29.870212" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:16:29.870488" 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-04-17T03:16:29.869522" elapsed="0.000992"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:16:29.871144" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.120:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a4425392dd0&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-04-17T03:16:29.870672" elapsed="0.000619"/>
</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-04-17T03:16:29.871452" elapsed="0.000192"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-04-17T03:16:29.867555" elapsed="0.004149"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:16:29.867358" elapsed="0.004391"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-04-17T03:16:29.864926" elapsed="0.006857"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:16:29.872448" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:16:29.872004" elapsed="0.000488"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:16:29.873121" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.120'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:16:29.872652" elapsed="0.000513"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:16:29.873715" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:16:29.873324" elapsed="0.000433"/>
</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-04-17T03:16:29.863155" elapsed="0.010659"/>
</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-04-17T03:16:29.855347" elapsed="0.018525"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:16:29.874096" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:29.873963" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:29.873925" elapsed="0.000239"/>
</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-04-17T03:16:29.877340" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:16:29.876927" elapsed="0.000440"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:16:29.877825" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:16:29.877525" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:16:29.877896" elapsed="0.000050"/>
</return>
<msg time="2026-04-17T03:16:29.878082" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:16:29.876595" elapsed="0.001512"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:16:29.879127" level="INFO">${member_ip} = 10.30.170.120</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-04-17T03:16:29.878824" elapsed="0.000330"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:16:29.879901" 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-04-17T03:16:29.880020" 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-04-17T03:16:29.879731" elapsed="0.000316"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:29.883724" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:16:29.883141" elapsed="0.000669"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:29.883120" elapsed="0.000729"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:16:29.884556" 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-04-17T03:16:29.884860" 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-04-17T03:16:29.884071" elapsed="0.000840"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:29.885865" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.120" 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-04-17T03:16:29.885195" elapsed="0.000793"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:16:29.887169" 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-04-17T03:16:29.886259" elapsed="0.000962"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-17T03:16:29.889025" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:16:29.889204" 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-04-17T03:16:29.888644" elapsed="0.000603"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:16:29.889589" elapsed="0.000493"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:16:29.891315" level="INFO">Logging into '10.30.170.120:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:16:30.220102" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 17 03:16:03 UTC 2026

  System load:  0.08               Processes:             120
  Usage of /:   10.4% of 77.35GB   Users logged in:       1
  Memory usage: 2%                 IPv4 address for ens3: 10.30.170.120
  Swap usage:   0%                 IPv6 address for ens3: 2607:f0d0:1002:11::2


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:16:04 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:16:29.890949" elapsed="0.329324"/>
</kw>
<msg time="2026-04-17T03:16:30.220360" 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-04-17T03:16:29.890483" elapsed="0.330051"/>
</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-04-17T03:16:29.887664" elapsed="0.333026"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:16:30.221667" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-17T03:16:30.235085" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-17T03:16:30.235685" level="INFO">${stdout} = </msg>
<msg time="2026-04-17T03:16:30.235872" 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-04-17T03:16:30.221099" elapsed="0.014891"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:16:30.236733" elapsed="0.002146"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:30.240782" 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-04-17T03:16:30.239952" elapsed="0.000948"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-17T03:16:30.241483" elapsed="0.000056"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:30.241146" elapsed="0.000478"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:30.241106" elapsed="0.000559"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:16:30.242041" elapsed="0.000084"/>
</return>
<status status="PASS" start="2026-04-17T03:16:30.241787" elapsed="0.000422"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:30.241768" elapsed="0.000481"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-17T03:16:30.242328" elapsed="0.000018"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:16:30.248493" elapsed="0.000614"/>
</kw>
<kw name="Open 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-04-17T03:16:30.249417" elapsed="0.000427"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:16:30.250166" elapsed="0.000230"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:16:30.243053" elapsed="0.007419"/>
</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-04-17T03:16:29.882182" elapsed="0.368472"/>
</kw>
<msg time="2026-04-17T03:16:30.250818" 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-04-17T03:16:29.881282" elapsed="0.369607"/>
</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-04-17T03:16:29.880740" elapsed="0.370318"/>
</kw>
<msg time="2026-04-17T03:16:30.251103" 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-04-17T03:16:29.880202" elapsed="0.370950"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:16:30.253964" elapsed="0.000360"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-17T03:16:30.254497" elapsed="0.000152"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:16:30.254800" 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-04-17T03:16:30.251462" elapsed="0.003509"/>
</kw>
<msg time="2026-04-17T03:16:30.255079" 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-04-17T03:16:29.879370" elapsed="0.375735"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:30.255592" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:30.255300" elapsed="0.000350"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-17T03:16:30.255704" elapsed="0.000033"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-17T03:16:29.878471" elapsed="0.377366"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:16:29.878295" elapsed="0.377580"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:16:29.878162" elapsed="0.377752"/>
</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-04-17T03:16:29.874391" elapsed="0.381606"/>
</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-04-17T03:16:30.256157" elapsed="0.000218"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:16:30.270761" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:30.270635" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:30.270604" elapsed="0.000229"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:16:30.271279" 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-04-17T03:16:30.271428" 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-04-17T03:16:30.271075" elapsed="0.000390"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:30.272032" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:30.271681" elapsed="0.000399"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:30.272507" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:30.272234" elapsed="0.000331"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:16:30.273434" 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-04-17T03:16:30.273171" elapsed="0.000388">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-17T03:16:30.273684" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:16:30.273732" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:30.272747" elapsed="0.001008"/>
</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-04-17T03:16:30.274157" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:16:30.273887" elapsed="0.000355"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:30.273864" elapsed="0.000403"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:16:30.275081" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:16:30.274763" elapsed="0.000345"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:16:30.275158" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:16:30.275314" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:16:30.274475" elapsed="0.000924"/>
</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-04-17T03:16:30.275575" elapsed="0.000470"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:16:30.276328" level="INFO">index=4
host=10.30.170.120
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-04-17T03:16:30.276430" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.120
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-04-17T03:16:30.276219" elapsed="0.000236"/>
</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-04-17T03:16:30.276604" elapsed="0.002483"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:16:30.279542" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:16:30.280910" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:16:30.279270" elapsed="0.002156">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:16:30.284639" elapsed="0.000414"/>
</kw>
<kw name="Open 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-04-17T03:16:30.285255" elapsed="0.000153"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:16:30.285567" elapsed="0.000105"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:16:30.282335" elapsed="0.003390"/>
</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-04-17T03:16:30.281717" elapsed="0.004054"/>
</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="FAIL" start="2026-04-17T03:16:30.270298" elapsed="0.015600">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:16:31.305840" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:31.305650" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:31.305614" elapsed="0.000365"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:16:31.306507" 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-04-17T03:16:31.306673" 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-04-17T03:16:31.306259" elapsed="0.000450"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:31.307352" 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-04-17T03:16:31.306926" elapsed="0.000488"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:31.307960" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:31.307620" elapsed="0.000388"/>
</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-04-17T03:16:31.308791" elapsed="0.000281"/>
</kw>
<msg time="2026-04-17T03:16:31.309239" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:16:31.309307" level="INFO">${old_connection_index} = 4</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:31.308217" elapsed="0.001123"/>
</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-04-17T03:16:31.310526" elapsed="0.000199"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:16:31.311717" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:16:31.311467" elapsed="0.001009">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:31.310987" elapsed="0.001577"/>
</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-04-17T03:16:31.313353" elapsed="0.000153"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:31.312806" elapsed="0.000768"/>
</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-04-17T03:16:31.309761" elapsed="0.003983"/>
</kw>
<status status="PASS" start="2026-04-17T03:16:31.309443" elapsed="0.004374"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:31.309418" elapsed="0.004441"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:16:31.315068" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:16:31.314653" elapsed="0.000454"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:16:31.315181" elapsed="0.000054"/>
</return>
<msg time="2026-04-17T03:16:31.315418" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:16:31.314229" elapsed="0.001225"/>
</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-04-17T03:16:31.315680" elapsed="0.000617"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:16:31.316672" level="INFO">index=6
host=10.30.170.120
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-04-17T03:16:31.316809" level="INFO">${karaf_connection_object} = index=6
host=10.30.170.120
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-04-17T03:16:31.316522" elapsed="0.000323"/>
</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-04-17T03:16:31.317075" elapsed="0.003065"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:16:31.320710" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:16:31.322185" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:16:31.320329" elapsed="0.002456">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:16:31.327250" elapsed="0.000510"/>
</kw>
<kw name="Open 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-04-17T03:16:31.328073" elapsed="0.000233"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:16:31.328513" elapsed="0.000114"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:16:31.324195" elapsed="0.004487"/>
</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-04-17T03:16:31.323309" elapsed="0.005420"/>
</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="FAIL" start="2026-04-17T03:16:31.305016" elapsed="0.023813">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:16:32.349424" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:32.349275" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:32.349246" elapsed="0.000270"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:16:32.349958" 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-04-17T03:16:32.350109" 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-04-17T03:16:32.349737" elapsed="0.000403"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:32.350754" level="INFO">{1: 6}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:32.350324" elapsed="0.000479"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:32.351290" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:32.351003" elapsed="0.000353"/>
</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-04-17T03:16:32.352066" elapsed="0.000285"/>
</kw>
<msg time="2026-04-17T03:16:32.352496" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:16:32.352565" level="INFO">${old_connection_index} = 6</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:32.351554" elapsed="0.001040"/>
</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-04-17T03:16:32.353799" elapsed="0.000169"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:16:32.354765" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:16:32.354566" elapsed="0.000819">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:32.354208" elapsed="0.001245"/>
</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-04-17T03:16:32.356118" elapsed="0.000162"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:32.355705" elapsed="0.000653"/>
</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-04-17T03:16:32.353047" elapsed="0.003363"/>
</kw>
<status status="PASS" start="2026-04-17T03:16:32.352690" elapsed="0.003771"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:32.352668" elapsed="0.003831"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:16:32.357383" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:16:32.357084" elapsed="0.000326"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:16:32.357460" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:16:32.357626" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:16:32.356746" elapsed="0.000905"/>
</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-04-17T03:16:32.357840" elapsed="0.000477"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:16:32.358608" level="INFO">index=8
host=10.30.170.120
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-04-17T03:16:32.358712" level="INFO">${karaf_connection_object} = index=8
host=10.30.170.120
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-04-17T03:16:32.358492" elapsed="0.000259"/>
</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-04-17T03:16:32.358902" elapsed="0.002848"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:16:32.362268" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:16:32.363572" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:16:32.361956" elapsed="0.002061">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:16:32.367373" elapsed="0.000416"/>
</kw>
<kw name="Open 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-04-17T03:16:32.367979" elapsed="0.000159"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:16:32.368369" elapsed="0.000105"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:16:32.365067" elapsed="0.003462"/>
</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-04-17T03:16:32.364415" elapsed="0.004160"/>
</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="FAIL" start="2026-04-17T03:16:32.348735" elapsed="0.019927">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:16:33.387751" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:33.387602" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:33.387574" elapsed="0.000282"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:16:33.388370" 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-04-17T03:16:33.388526" 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-04-17T03:16:33.388131" elapsed="0.000429"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:33.389138" level="INFO">{1: 8}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:33.388769" elapsed="0.000424"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:33.389717" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:33.389454" elapsed="0.000309"/>
</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-04-17T03:16:33.390383" elapsed="0.000198"/>
</kw>
<msg time="2026-04-17T03:16:33.390687" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:16:33.390735" level="INFO">${old_connection_index} = 8</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:33.389949" elapsed="0.000809"/>
</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-04-17T03:16:33.391683" elapsed="0.000145"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:16:33.392561" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:16:33.392374" elapsed="0.000738">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:33.392017" elapsed="0.001160"/>
</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-04-17T03:16:33.393707" elapsed="0.000106"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:33.393349" elapsed="0.000513"/>
</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-04-17T03:16:33.391136" elapsed="0.002772"/>
</kw>
<status status="PASS" start="2026-04-17T03:16:33.390880" elapsed="0.003100"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:33.390859" elapsed="0.003157"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:16:33.394833" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:16:33.394540" elapsed="0.000324"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:16:33.394918" elapsed="0.000054"/>
</return>
<msg time="2026-04-17T03:16:33.395132" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:16:33.394251" elapsed="0.000913"/>
</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-04-17T03:16:33.395356" elapsed="0.000529"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:16:33.396255" level="INFO">index=10
host=10.30.170.120
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-04-17T03:16:33.396359" level="INFO">${karaf_connection_object} = index=10
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:16:33.396128" elapsed="0.000257"/>
</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-04-17T03:16:33.396535" elapsed="0.002516"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:16:33.399484" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:16:33.400585" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:16:33.399219" elapsed="0.001793">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:16:33.404188" elapsed="0.000380"/>
</kw>
<kw name="Open 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-04-17T03:16:33.404734" elapsed="0.000151"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:16:33.405049" elapsed="0.000103"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:16:33.401901" elapsed="0.003303"/>
</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-04-17T03:16:33.401355" elapsed="0.003896"/>
</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="FAIL" start="2026-04-17T03:16:33.387105" elapsed="0.018230">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:16:33.405479" level="FAIL">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<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="FAIL" start="2026-04-17T03:16:30.257276" elapsed="3.148299">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:30.256795" elapsed="3.148848"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:16:30.256630" elapsed="3.149056"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-04-17T03:16:30.256446" elapsed="3.149297"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-17T03:16:29.854843" elapsed="3.550975"/>
</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-04-17T03:16:33.408821" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:33.408693" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:33.408668" elapsed="0.000228"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:16:33.413697" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:33.413586" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:33.413568" elapsed="0.000201"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:16:33.414787" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:16:33.414390" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:16:33.415620" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:16:33.415099" elapsed="0.000548"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:16:33.415693" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:16:33.415856" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:16:33.414019" elapsed="0.001862"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:16:33.421908" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:33.421794" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:33.421775" elapsed="0.000224"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:16:33.423348" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:33.423215" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:33.423196" elapsed="0.000223"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:16:33.423957" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:16:33.423565" elapsed="0.000422"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:16:33.424388" 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-04-17T03:16:33.424156" elapsed="0.000258"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:16:33.425596" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:16:33.425142" elapsed="0.001258">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:16:33.426588" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:16:33.426638" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:33.424573" elapsed="0.002089"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:16:33.427851" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:16:33.427428" elapsed="0.001255">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:16:33.428832" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:16:33.428885" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:33.426852" elapsed="0.002057"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:16:33.429966" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/bgp_llgr_basic.robot"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:16:33.429253" elapsed="0.000827">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/bgp_llgr_basic.robot"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:16:33.429006" elapsed="0.001291">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/bgp_llgr_basic.robot"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:16:33.428986" elapsed="0.001348">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/bgp_llgr_basic.robot"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:33.430500" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:33.430729" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:16:33.430588" elapsed="0.000374"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:16:33.430571" elapsed="0.000447"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:16:33.431062" elapsed="0.000018"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:16:33.433233" elapsed="0.000460"/>
</kw>
<kw name="Open 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-04-17T03:16:33.434096" elapsed="0.000350"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:16:33.434788" elapsed="0.000308"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:16:33.432380" 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-04-17T03:16:33.431382" elapsed="0.003980"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:16:33.422808" elapsed="0.012649">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/bgp_llgr_basic.robot"</status>
</kw>
<msg time="2026-04-17T03:16:33.435567" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:16:33.435611" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/bgp_llgr_basic.robot"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:33.422153" elapsed="0.013482"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:16:33.435828" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:33.435716" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:33.435696" elapsed="0.000227"/>
</if>
<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-04-17T03:16:33.436902" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:33.436792" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:33.436772" elapsed="0.000219"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:16:33.437549" 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-04-17T03:16:33.437666" 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-04-17T03:16:33.437178" elapsed="0.000515"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:33.438164" level="INFO">{1: 10}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:33.437848" elapsed="0.000363"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:33.438654" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:33.438364" elapsed="0.000339"/>
</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-04-17T03:16:33.439354" elapsed="0.000317"/>
</kw>
<msg time="2026-04-17T03:16:33.439775" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:16:33.439822" level="INFO">${old_connection_index} = 10</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:33.438866" elapsed="0.000979"/>
</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-04-17T03:16:33.441162" elapsed="0.000298"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:16:33.443037" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:16:33.442679" elapsed="0.000923">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:33.441729" elapsed="0.001970"/>
</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-04-17T03:16:33.444987" elapsed="0.000255"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:33.444128" elapsed="0.001273"/>
</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-04-17T03:16:33.440316" elapsed="0.005183"/>
</kw>
<status status="PASS" start="2026-04-17T03:16:33.439923" elapsed="0.005631"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:33.439905" elapsed="0.005681"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:16:33.446828" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:16:33.446170" elapsed="0.000695"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:16:33.446921" elapsed="0.000108"/>
</return>
<msg time="2026-04-17T03:16:33.447164" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:16:33.445842" elapsed="0.001348"/>
</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-04-17T03:16:33.447346" elapsed="0.000455"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:16:33.448174" level="INFO">index=13
host=10.30.170.120
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-04-17T03:16:33.448333" level="INFO">${karaf_connection_object} = index=13
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:16:33.448010" elapsed="0.000356"/>
</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-04-17T03:16:33.448561" elapsed="0.002596"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:16:33.451617" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:16:33.453112" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:16:33.451343" elapsed="0.002196">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:16:33.457157" elapsed="0.000685"/>
</kw>
<kw name="Open 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-04-17T03:16:33.458116" elapsed="0.000480"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:16:33.458827" elapsed="0.000266"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:16:33.454416" elapsed="0.004759"/>
</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-04-17T03:16:33.453855" elapsed="0.005367"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:16:33.436538" elapsed="0.022771">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:33.459663" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:16:33.459737" 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="FAIL" start="2026-04-17T03:16:33.421489" elapsed="0.038356">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:16:33.459971" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:16:33.460017" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:33.416315" elapsed="0.043725"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:33.460378" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:16:33.460123" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:33.460103" elapsed="0.000353"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:16:33.416147" elapsed="0.044334"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:16:33.415955" elapsed="0.044561"/>
</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-04-17T03:16:33.413285" elapsed="0.047290"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-17T03:16:33.406586" elapsed="0.054144"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:33.406005" elapsed="0.054787"/>
</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-04-17T03:16:29.849558" elapsed="3.611290"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:16:33.461379" level="INFO">${tools_system_conn_id} = 15</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-04-17T03:16:33.461020" elapsed="0.000385"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:16:33.461906" level="INFO">${tools_system_conn_id} = 15</msg>
<arg>${tools_system_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:16:33.461574" elapsed="0.000392"/>
</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-04-17T03:16:33.463700" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:16:33.463784" 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-04-17T03:16:33.463415" elapsed="0.000393"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:16:33.464002" elapsed="0.000337"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:16:33.465296" level="INFO">Logging into '10.30.171.238:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:16:34.140411" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 17 03:16:33 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:10:44 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:16:33.464877" elapsed="0.675745"/>
</kw>
<msg time="2026-04-17T03:16:34.140710" 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-04-17T03:16:33.464505" elapsed="0.676287"/>
</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-04-17T03:16:33.462920" elapsed="0.677999"/>
</kw>
<msg time="2026-04-17T03:16:34.140990" 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-04-17T03:16:33.462525" elapsed="0.678515"/>
</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-04-17T03:16:33.462165" elapsed="0.678965"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:16:34.141855" level="INFO">Creating Session using : alias=config-session, url=http://10.30.170.120:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a44250f0750&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-04-17T03:16:34.141441" elapsed="0.000647"/>
</kw>
<kw name="Upload_Config_Files">
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-04-17T03:16:34.150128" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-04-17T03:16:34.160093" 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-04-17T03:16:34.142674" elapsed="0.017641"/>
</kw>
<kw name="List Files In Directory" owner="SSHLibrary">
<msg time="2026-04-17T03:16:34.168499" level="INFO">2 files:
exa-md5.cfg
gobgp.cfg</msg>
<msg time="2026-04-17T03:16:34.168685" 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-04-17T03:16:34.161021" elapsed="0.007693"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:16:34.169669" level="INFO">Executing command 'sed -i -e 's/GOBGPIP/10.30.171.238/g' exa-md5.cfg'.</msg>
<msg time="2026-04-17T03:16:34.182254" 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-04-17T03:16:34.169347" elapsed="0.013117"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:16:34.183441" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.120/g' exa-md5.cfg'.</msg>
<msg time="2026-04-17T03:16:34.234024" 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-04-17T03:16:34.182985" elapsed="0.051240"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:16:34.235169" level="INFO">Executing command 'sed -i -e 's/ROUTERID/10.30.171.238/g' exa-md5.cfg'.</msg>
<msg time="2026-04-17T03:16:34.286572" 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-04-17T03:16:34.234683" elapsed="0.052337"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:16:34.288044" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exa-md5.cfg'.</msg>
<msg time="2026-04-17T03:16:34.337737" 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-04-17T03:16:34.287591" elapsed="0.050497"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:16:34.339174" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exa-md5.cfg'.</msg>
<msg time="2026-04-17T03:16:34.385818" 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-04-17T03:16:34.338693" elapsed="0.047333"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:16:34.386692" level="INFO">Executing command 'cat exa-md5.cfg'.</msg>
<msg time="2026-04-17T03:16:34.433974" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:16:34.434271" level="INFO">${stdout} = neighbor 10.30.170.120 {
  router-id 10.30.171.238;
  local-address 10.30.171.238;
  local-as 64496;
  peer-as 64496;
  md5-password topsecret;

  capability {
    route-refresh disable;
    add-path ...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-17T03:16:34.386397" elapsed="0.047918"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:34.435199" level="INFO">neighbor 10.30.170.120 {
  router-id 10.30.171.238;
  local-address 10.30.171.238;
  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-04-17T03:16:34.434691" elapsed="0.000581"/>
</kw>
<var name="${cfgfile}">exa-md5.cfg</var>
<status status="PASS" start="2026-04-17T03:16:34.169050" elapsed="0.266272"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:16:34.436002" level="INFO">Executing command 'sed -i -e 's/GOBGPIP/10.30.171.238/g' gobgp.cfg'.</msg>
<msg time="2026-04-17T03:16:34.481716" 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-04-17T03:16:34.435727" elapsed="0.046159"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:16:34.482603" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.120/g' gobgp.cfg'.</msg>
<msg time="2026-04-17T03:16:34.534003" 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-04-17T03:16:34.482279" elapsed="0.051941"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:16:34.535401" level="INFO">Executing command 'sed -i -e 's/ROUTERID/10.30.171.238/g' gobgp.cfg'.</msg>
<msg time="2026-04-17T03:16:34.586075" 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-04-17T03:16:34.534801" elapsed="0.051439"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:16:34.586954" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' gobgp.cfg'.</msg>
<msg time="2026-04-17T03:16:34.637364" 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-04-17T03:16:34.586585" elapsed="0.050989"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:16:34.638588" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' gobgp.cfg'.</msg>
<msg time="2026-04-17T03:16:34.685661" 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-04-17T03:16:34.638169" elapsed="0.047821"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:16:34.687028" level="INFO">Executing command 'cat gobgp.cfg'.</msg>
<msg time="2026-04-17T03:16:34.733601" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:16:34.733962" level="INFO">${stdout} = [global.config]
    as = 64496
    router-id = "10.30.171.238"
    port = 17900
[[neighbors]]
    [neighbors.config]
        peer-as = 64496
        neighbor-address = "10.30.170.120"
        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-04-17T03:16:34.686548" elapsed="0.047530"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:34.735409" level="INFO">[global.config]
    as = 64496
    router-id = "10.30.171.238"
    port = 17900
[[neighbors]]
    [neighbors.config]
        peer-as = 64496
        neighbor-address = "10.30.170.120"
        local-as = 64496
    [neighbors.transport.config]
        local-address = "10.30.171.238"
        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-04-17T03:16:34.734620" elapsed="0.000905"/>
</kw>
<var name="${cfgfile}">gobgp.cfg</var>
<status status="PASS" start="2026-04-17T03:16:34.435513" elapsed="0.300093"/>
</iter>
<var>${cfgfile}</var>
<value>@{cfgfiles}</value>
<status status="PASS" start="2026-04-17T03:16:34.168796" elapsed="0.566886"/>
</for>
<doc>Uploads gobgp config files</doc>
<status status="PASS" start="2026-04-17T03:16:34.142348" elapsed="0.593476"/>
</kw>
<kw name="Download_Gobgp_Binary">
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:16:34.744176" level="INFO">${tools_connection} = 16</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-04-17T03:16:34.743597" elapsed="0.000617"/>
</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-04-17T03:16:34.746848" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:16:34.746944" 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-04-17T03:16:34.746547" elapsed="0.000424"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:16:34.747133" elapsed="0.000355"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:16:34.748656" level="INFO">Logging into '10.30.171.238:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:16:35.077975" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 17 03:16:33 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:16:34 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:16:34.748136" elapsed="0.329997"/>
</kw>
<msg time="2026-04-17T03:16:35.078218" 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-04-17T03:16:34.747740" elapsed="0.330582"/>
</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-04-17T03:16:34.745975" elapsed="0.332504"/>
</kw>
<msg time="2026-04-17T03:16:35.078551" 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-04-17T03:16:34.745111" elapsed="0.333550"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-17T03:16:34.744475" elapsed="0.334295"/>
</kw>
<return>
<value>${tools_connection}</value>
<status status="PASS" start="2026-04-17T03:16:35.078839" elapsed="0.000056"/>
</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-04-17T03:16:34.743042" elapsed="0.336048"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:16:35.079552" 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-04-17T03:16:35.429599" 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-04-17T03:16:35.079342" elapsed="0.350417"/>
</kw>
<kw name="File Should Exist" owner="SSHLibrary">
<msg time="2026-04-17T03:16:35.474332" 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-04-17T03:16:35.430134" elapsed="0.046215"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:16:35.477313" level="INFO">Executing command 'tar -xzf gobgp_2.18.0_linux_386.tar.gz'.</msg>
<msg time="2026-04-17T03:16:35.682389" 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-04-17T03:16:35.476849" elapsed="0.205777"/>
</kw>
<doc>Downloads gobgp binary and untar the binary zip file</doc>
<status status="PASS" start="2026-04-17T03:16:34.736203" elapsed="0.946602"/>
</kw>
<doc>Suite setup keyword.</doc>
<status status="PASS" start="2026-04-17T03:16:29.849203" elapsed="5.833780"/>
</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-04-17T03:16:35.691476" elapsed="0.000718"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:16:35.690676" elapsed="0.001581"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:16:35.693467" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:35.693306" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:35.693275" elapsed="0.000278"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:16:35.698915" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:35.698801" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:35.698782" elapsed="0.000221"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:16:35.700105" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:16:35.699627" elapsed="0.000507"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:16:35.700628" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:16:35.700297" elapsed="0.000358"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:16:35.700700" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:16:35.700866" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:16:35.699237" elapsed="0.001655"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:16:35.707970" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:35.707755" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:35.707725" elapsed="0.000504"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:16:35.709874" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:35.709743" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:35.709722" elapsed="0.000262"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:16:35.710550" level="INFO">${karaf_connection_index} = 13</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:16:35.710158" elapsed="0.000422"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:16:35.710993" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:16:35.710745" elapsed="0.000275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:16:35.711903" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:16:35.711534" elapsed="0.001093">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:16:35.712822" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:16:35.712869" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:35.711180" elapsed="0.001712"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:16:35.713674" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:16:35.713422" elapsed="0.000967">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:16:35.714586" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:16:35.714632" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:35.713077" elapsed="0.001578"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:16:35.715619" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Llgr Basic.Reconfigure_ODL_To_Accept_Connections"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:16:35.714982" elapsed="0.000700">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Llgr Basic.Reconfigure_ODL_To_Accept_Connections"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:16:35.714730" elapsed="0.001271">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Llgr Basic.Reconfigure_ODL_To_Accept_Connections"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:16:35.714711" elapsed="0.001331">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Llgr Basic.Reconfigure_ODL_To_Accept_Connections"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:35.716207" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:35.716432" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:16:35.716295" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:16:35.716278" elapsed="0.000229"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:16:35.716541" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:16:35.719271" elapsed="0.000151"/>
</kw>
<msg time="2026-04-17T03:16:35.719492" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:16:35.718057" 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-04-17T03:16:35.719965" elapsed="0.000080"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:35.720306" 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-04-17T03:16:35.717414" elapsed="0.003081"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:16:35.716828" 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="FAIL" start="2026-04-17T03:16:35.709362" elapsed="0.011287">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Llgr Basic.Reconfigure_ODL_To_Accept_Connections"</status>
</kw>
<msg time="2026-04-17T03:16:35.720753" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:16:35.720797" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Llgr Basic.Reconfigure_ODL_To_Accept_Connections"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:35.708480" elapsed="0.012341"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:16:35.721023" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:35.720896" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:35.720878" elapsed="0.000260"/>
</if>
<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-04-17T03:16:35.722079" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:35.721884" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:35.721865" elapsed="0.000281"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:16:35.722421" level="INFO">index=16
host=10.30.171.238
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-04-17T03:16:35.722525" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.238
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-04-17T03:16:35.722297" elapsed="0.000254"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:35.722978" level="INFO">{1: 13}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:35.722699" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:35.723415" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:35.723171" elapsed="0.000286"/>
</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-04-17T03:16:35.724087" elapsed="0.000266"/>
</kw>
<msg time="2026-04-17T03:16:35.724453" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:16:35.724498" level="INFO">${old_connection_index} = 13</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:35.723632" elapsed="0.000888"/>
</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-04-17T03:16:35.725333" elapsed="0.000191"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:16:35.726654" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:16:35.726252" elapsed="0.001263">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:35.725689" elapsed="0.001923"/>
</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-04-17T03:16:35.728279" elapsed="0.000276"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:35.727781" elapsed="0.000856"/>
</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-04-17T03:16:35.724812" elapsed="0.003902"/>
</kw>
<status status="PASS" start="2026-04-17T03:16:35.724593" elapsed="0.004174"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:35.724576" elapsed="0.004216"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:16:35.729734" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:16:35.729416" elapsed="0.000344"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:16:35.729814" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:16:35.730006" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:16:35.729034" elapsed="0.000998"/>
</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-04-17T03:16:35.730190" elapsed="0.000430"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:16:35.730899" level="INFO">index=17
host=10.30.170.120
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-04-17T03:16:35.731018" level="INFO">${karaf_connection_object} = index=17
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:16:35.730786" elapsed="0.000258"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:16:35.731190" elapsed="0.003927"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:16:35.735550" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:16:35.736720" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:16:35.735284" elapsed="0.001845">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:16:35.750963" elapsed="0.000397"/>
</kw>
<msg time="2026-04-17T03:16:35.751459" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:16:35.749574" elapsed="0.002094"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:35.751833" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:35.752180" elapsed="0.000023"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:16:35.738063" elapsed="0.014206"/>
</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-04-17T03:16:35.737423" elapsed="0.014896"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:16:35.721544" elapsed="0.030867">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:35.752782" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:16:35.752861" 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="FAIL" start="2026-04-17T03:16:35.707253" elapsed="0.045739">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:16:35.753106" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:16:35.753150" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:35.701339" elapsed="0.051834"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:35.753518" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:16:35.753256" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:35.753235" elapsed="0.000363"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:16:35.701157" elapsed="0.052465"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:16:35.700971" elapsed="0.052686"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:16:35.698422" elapsed="0.055295"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:16:35.692902" elapsed="0.060873"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:35.692417" elapsed="0.061404"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:16:35.685002" elapsed="0.068873"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:16:35.754822" level="INFO">&amp;{mapping} = { IP=10.30.171.238 | 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-04-17T03:16:35.754099" elapsed="0.000753"/>
</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-04-17T03:16:35.776595" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:16:35.776214" elapsed="0.000410"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:16:35.777426" 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-04-17T03:16:35.777138" elapsed="0.000363">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-04-17T03:16:35.777596" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:16:35.776787" elapsed="0.000833"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:16:35.778190" 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-04-17T03:16:35.777785" elapsed="0.000432"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:16:35.778590" 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-04-17T03:16:35.778814" 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-04-17T03:16:35.778448" elapsed="0.000394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:35.779496" 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-04-17T03:16:35.779020" elapsed="0.000524"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:35.780557" level="INFO">mapping: {'IP': '10.30.171.238', '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-04-17T03:16:35.780292" elapsed="0.000311"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:16:35.781045" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:16:35.780761" elapsed="0.000311"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:16:35.781745" level="INFO">${value} = 10.30.171.238</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:16:35.781446" elapsed="0.000325"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:16:35.782515" level="INFO">${encoded} = 10.30.171.238</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:16:35.782294" elapsed="0.000247"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:16:35.782593" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:16:35.782748" level="INFO">${encoded_value} = 10.30.171.238</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:16:35.781974" elapsed="0.000798"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:16:35.782937" elapsed="0.000241"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.238</var>
<status status="PASS" start="2026-04-17T03:16:35.781312" elapsed="0.001906"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:16:35.783754" 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-04-17T03:16:35.783459" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:16:35.784545" 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-04-17T03:16:35.784337" elapsed="0.000233"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:16:35.784619" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:16:35.784768" 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-04-17T03:16:35.784012" 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-04-17T03:16:35.784954" elapsed="0.000223"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:16:35.783329" elapsed="0.001889"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:16:35.785762" 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-04-17T03:16:35.785458" elapsed="0.000330"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:16:35.786509" 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-04-17T03:16:35.786300" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:16:35.786582" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:16:35.786730" 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-04-17T03:16:35.785986" 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-04-17T03:16:35.786902" elapsed="0.000236"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:16:35.785329" elapsed="0.001849"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:16:35.787720" 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-04-17T03:16:35.787417" elapsed="0.000328"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:16:35.788564" 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-04-17T03:16:35.788343" elapsed="0.000247"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:16:35.788639" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:16:35.788792" 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-04-17T03:16:35.787965" 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-04-17T03:16:35.789023" elapsed="0.000226"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:16:35.787288" elapsed="0.002003"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:16:35.789830" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:16:35.789534" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:16:35.790759" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:16:35.790549" elapsed="0.000236"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:16:35.790834" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:16:35.791005" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:16:35.790056" 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-04-17T03:16:35.791180" elapsed="0.000245"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:16:35.789403" elapsed="0.002074"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:16:35.792082" 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-04-17T03:16:35.791727" elapsed="0.000381"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:16:35.792815" 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-04-17T03:16:35.792608" elapsed="0.000232"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:16:35.792888" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:16:35.793057" 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-04-17T03:16:35.792294" elapsed="0.000787"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:16:35.793229" elapsed="0.000220"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:16:35.791594" elapsed="0.001895"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:16:35.794039" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:16:35.793727" elapsed="0.000337"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:16:35.794764" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:16:35.794556" elapsed="0.000233"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:16:35.794837" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:16:35.795004" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:16:35.794246" 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-04-17T03:16:35.795175" elapsed="0.000218"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:16:35.793599" elapsed="0.001834"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:16:35.796038" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:16:35.795671" elapsed="0.000395"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:16:35.796777" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:16:35.796566" elapsed="0.000236"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:16:35.796852" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:16:35.797020" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:16:35.796251" elapsed="0.000794"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:16:35.797215" elapsed="0.000244"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:16:35.795543" elapsed="0.001956"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:16:35.781126" elapsed="0.016408"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:16:35.797576" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:16:35.797738" level="INFO">${mapping_to_use} = {'IP': '10.30.171.238', '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-04-17T03:16:35.779914" elapsed="0.017851"/>
</kw>
<status status="PASS" start="2026-04-17T03:16:35.779615" elapsed="0.018182"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:35.797983" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:16:35.797822" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:35.779594" elapsed="0.018506"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:16:35.798964" 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-04-17T03:16:35.798246" elapsed="0.000748"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:16:35.799043" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:16:35.775555" elapsed="0.023613"/>
</kw>
<msg time="2026-04-17T03:16:35.799225" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:16:35.774743" elapsed="0.024531"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:16:35.799769" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/gobgp_2.18.0_linux_386.tar.gz exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/gobgp_2.18.0_linux_386.tar.gz,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/gobgp_2.18.0_linux_386.tar.gz.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:35.800335" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/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-04-17T03:16:35.800841" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:35.801041" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:35.801215" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:35.801576" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:16:35.801435" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:16:35.801421" 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-04-17T03:16:35.801794" 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-04-17T03:16:35.801974" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:35.802140" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:16:35.801393" elapsed="0.000800"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:16:35.801290" elapsed="0.000928"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:35.802361" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:16:35.802434" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:16:35.802559" 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-04-17T03:16:35.770516" elapsed="0.032105"/>
</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-04-17T03:16:35.817683" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:16:35.817306" elapsed="0.000405"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:16:35.818456" 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-04-17T03:16:35.818222" elapsed="0.000307">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-04-17T03:16:35.818623" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:16:35.817872" elapsed="0.000776"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:16:35.819330" 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-04-17T03:16:35.818808" elapsed="0.000559"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:16:35.819776" 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-04-17T03:16:35.819990" 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-04-17T03:16:35.819587" elapsed="0.000441"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:35.820517" 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-04-17T03:16:35.820253" elapsed="0.000338"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-17T03:16:35.820984" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:16:35.820666" elapsed="0.000378"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:16:35.821573" level="INFO">${mapping_to_use} = {'IP': '10.30.171.238', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME'...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:16:35.821216" elapsed="0.000385"/>
</kw>
<status status="PASS" start="2026-04-17T03:16:35.821071" elapsed="0.000569"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:35.820646" elapsed="0.001018"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:16:35.822684" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.238&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflec...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:16:35.821817" elapsed="0.000899"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:16:35.822767" 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/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-04-17T03:16:35.816677" elapsed="0.006225"/>
</kw>
<msg time="2026-04-17T03:16:35.823020" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:16:35.815807" elapsed="0.007295"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:16:35.823621" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/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-04-17T03:16:35.824176" elapsed="0.000025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:16:35.824684" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:35.824870" 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-04-17T03:16:35.825057" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:35.825434" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:16:35.825291" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:16:35.825276" 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-04-17T03:16:35.825652" 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-04-17T03:16:35.825816" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:35.825994" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:16:35.825244" elapsed="0.000804"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:16:35.825134" elapsed="0.000945"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:35.826230" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:16:35.826310" elapsed="0.000021"/>
</return>
<msg time="2026-04-17T03:16:35.826482" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.238&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflec...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:16:35.813018" elapsed="0.013501"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:16:35.827824" 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-04-17T03:16:35.827579" elapsed="0.000314">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-04-17T03:16:35.828043" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:16:35.827238" elapsed="0.000877"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:35.828458" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:16:35.828194" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:16:35.829231" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:16:35.828719" elapsed="0.000538"/>
</kw>
<status status="PASS" start="2026-04-17T03:16:35.828539" elapsed="0.000755"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:35.828175" elapsed="0.001142"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:16:35.831682" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:16:35.829469" elapsed="0.002240"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:16:35.831761" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:16:35.831920" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:16:35.826873" elapsed="0.005088"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:35.833392" 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.238</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:35.833136" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:35.833831" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.238&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-04-17T03:16:35.833590" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:35.834306" 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-04-17T03:16:35.834055" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:35.834738" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:35.834498" elapsed="0.000283"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:16:35.835610" 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-04-17T03:16:35.835409" elapsed="0.000227"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:16:35.835988" 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-04-17T03:16:35.835790" 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-04-17T03:16:35.836254" elapsed="0.000225"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:35.836882" 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-04-17T03:16:35.836635" elapsed="0.000307"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:16:35.836987" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:16:35.837146" 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-04-17T03:16:35.834997" elapsed="0.002173"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:16:35.842317" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:16:36.043909" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:16:36.446660" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:16:36.449485" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:16:35.839276" elapsed="0.615814">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:16:35.837239" elapsed="0.618117">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:36.455880" elapsed="0.000080"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:16:36.455453" elapsed="0.000615"/>
</branch>
<status status="FAIL" start="2026-04-17T03:16:35.837222" elapsed="0.618900">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:36.457330" elapsed="0.000068"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:16:36.457652" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:36.457565" elapsed="0.000184"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:16:36.457525" elapsed="0.000272"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:36.458179" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:16:36.458259" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:16:35.832327" elapsed="0.626284">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:16:36.458693" elapsed="0.000018"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:16:35.759628" elapsed="0.699167">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:36.459146" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:16:36.458910" elapsed="0.000320"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:16:36.458891" elapsed="0.000685"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:16:36.459614" elapsed="0.000015"/>
</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="FAIL" start="2026-04-17T03:16:35.755144" elapsed="0.704578">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Configure BGP peer modules with initiate-connection set to false with short ipv6 address.</doc>
<status status="FAIL" start="2026-04-17T03:16:35.683143" elapsed="0.776853">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:16:36.464136" elapsed="0.000272"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:16:36.463833" elapsed="0.000636"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:16:36.465670" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:36.465528" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:36.465505" 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-04-17T03:16:36.470979" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:36.470817" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:36.470797" elapsed="0.000276"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:16:36.472337" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:16:36.471870" elapsed="0.000497"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:16:36.472842" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:16:36.472532" elapsed="0.000336"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:16:36.472914" elapsed="0.000054"/>
</return>
<msg time="2026-04-17T03:16:36.473100" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:16:36.471434" elapsed="0.001690"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:16:36.481725" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:36.481465" elapsed="0.000369"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:36.481407" elapsed="0.000471"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:16:36.483984" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:36.483763" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:36.483714" elapsed="0.000376"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:16:36.484832" level="INFO">${karaf_connection_index} = 17</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:16:36.484308" elapsed="0.000591"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:16:36.485542" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:16:36.485174" elapsed="0.000491"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:16:36.487012" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:16:36.486544" elapsed="0.001518">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:16:36.488349" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:16:36.488419" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:36.485958" elapsed="0.002497"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:16:36.489715" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:16:36.489270" elapsed="0.001405">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:16:36.490944" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:16:36.491013" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:36.488702" elapsed="0.002347"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:16:36.492363" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Llgr Basic.Start_Gobgp"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:16:36.491520" elapsed="0.000909">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Llgr Basic.Start_Gobgp"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:16:36.491177" elapsed="0.001331">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Llgr Basic.Start_Gobgp"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:16:36.491141" elapsed="0.001491">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Llgr Basic.Start_Gobgp"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:36.492831" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:36.493118" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:16:36.492922" elapsed="0.000252"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:16:36.492905" elapsed="0.000293"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:16:36.493236" elapsed="0.000018"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:16:36.496473" elapsed="0.000175"/>
</kw>
<msg time="2026-04-17T03:16:36.496744" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:16:36.495131" elapsed="0.001758"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:36.497227" elapsed="0.000119"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:36.497644" 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-04-17T03:16:36.494179" elapsed="0.003699"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:16:36.493571" 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="FAIL" start="2026-04-17T03:16:36.483254" elapsed="0.014803">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Llgr Basic.Start_Gobgp"</status>
</kw>
<msg time="2026-04-17T03:16:36.498171" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:16:36.498217" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Llgr Basic.Start_Gobgp"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:36.482180" elapsed="0.016061"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:16:36.498474" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:36.498344" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:36.498317" elapsed="0.000253"/>
</if>
<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-04-17T03:16:36.499717" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:16:36.499611" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:36.499593" elapsed="0.000190"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:16:36.500091" level="INFO">index=16
host=10.30.171.238
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-04-17T03:16:36.500198" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.238
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-04-17T03:16:36.499953" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:36.500695" level="INFO">{1: 17}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:36.500381" elapsed="0.000374"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:36.501286" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:16:36.501030" elapsed="0.000323"/>
</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-04-17T03:16:36.502000" elapsed="0.000274"/>
</kw>
<msg time="2026-04-17T03:16:36.502387" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:16:36.502435" level="INFO">${old_connection_index} = 17</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:36.501538" elapsed="0.000919"/>
</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-04-17T03:16:36.503289" elapsed="0.000194"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:16:36.504681" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:16:36.504177" elapsed="0.001694">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:36.503647" elapsed="0.002340"/>
</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-04-17T03:16:36.506672" elapsed="0.000318"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:36.506161" elapsed="0.000912"/>
</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-04-17T03:16:36.502757" elapsed="0.004361"/>
</kw>
<status status="PASS" start="2026-04-17T03:16:36.502534" elapsed="0.004697"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:36.502515" elapsed="0.004747"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:16:36.508320" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:16:36.507898" elapsed="0.000451"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:16:36.508403" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:16:36.508571" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:16:36.507496" elapsed="0.001100"/>
</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-04-17T03:16:36.508753" elapsed="0.000461"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:16:36.509566" level="INFO">index=18
host=10.30.170.120
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-04-17T03:16:36.509670" level="INFO">${karaf_connection_object} = index=18
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:16:36.509438" elapsed="0.000258"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:16:36.509845" elapsed="0.002471"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:16:36.512813" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:16:36.514173" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:16:36.512510" elapsed="0.002101">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:16:36.530654" elapsed="0.000483"/>
</kw>
<msg time="2026-04-17T03:16:36.531282" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:16:36.529164" elapsed="0.002306"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:36.531641" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:36.531807" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:16:36.515634" elapsed="0.016258"/>
</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-04-17T03:16:36.515044" elapsed="0.017138"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:16:36.499284" elapsed="0.032998">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:36.532775" elapsed="0.000034"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:16:36.532864" elapsed="0.000023"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:16:36.480766" elapsed="0.052258">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:16:36.533153" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:16:36.533204" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:36.473593" elapsed="0.059636"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:36.533638" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:16:36.533317" elapsed="0.000376"/>
</branch>
<status status="PASS" start="2026-04-17T03:16:36.533294" elapsed="0.000427"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:16:36.473437" elapsed="0.060310"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:16:36.473188" elapsed="0.060595"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:16:36.470398" elapsed="0.063448"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:16:36.465121" elapsed="0.068912"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:36.464627" elapsed="0.069462"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:16:36.461020" elapsed="0.073162"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:16:36.534769" level="INFO">${cmd} = gobgp.cfg &gt; gobgp.log</msg>
<var>${cmd}</var>
<arg>${GOBGP_CFG} &gt; ${GOBGP_LOG}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:16:36.534369" elapsed="0.000428"/>
</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-04-17T03:16:36.538311" level="INFO">${start_cmd} = /home/jenkins/gobgpd -l debug -f /home/jenkins/gobgp.cfg &gt; gobgp.log</msg>
<var>${start_cmd}</var>
<arg>${GOBGP_EXECUTION_COMMAND} /home/jenkins/${cfg_file}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:16:36.537969" elapsed="0.000371"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:36.538749" 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-04-17T03:16:36.538500" elapsed="0.000297"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:16:36.541156" level="INFO">/home/jenkins/gobgpd -l debug -f /home/jenkins/gobgp.cfg &gt; gobgp.log</msg>
<msg time="2026-04-17T03:16:36.541248" 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-04-17T03:16:36.538961" elapsed="0.002314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:16:36.541785" 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-04-17T03:16:36.541516" elapsed="0.000316"/>
</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-04-17T03:16:36.537618" elapsed="0.004272"/>
</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-04-17T03:16:36.545149" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:16:36.544538" elapsed="0.000653"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:16:36.546019" 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-04-17T03:16:36.545491" elapsed="0.000569"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:16:36.549901" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:16:36.751289" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:16:37.153872" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:16:37.156342" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:16:36.546297" elapsed="0.615881">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:37.162748" elapsed="0.000060"/>
</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="NOT RUN" start="2026-04-17T03:16:37.163168" elapsed="0.000036"/>
</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-04-17T03:16:36.543786" elapsed="0.619537">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Verify_GoBgps_Connection" owner="GoBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:16:52.170319" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:16:52.169216" elapsed="0.001181"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:16:52.171770" 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-04-17T03:16:52.170820" elapsed="0.001300"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:16:52.178550" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:16:52.380275" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:16:52.783157" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:16:52.785054" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:16:52.172543" elapsed="0.617290">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:16:52.790445" elapsed="0.000068"/>
</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="NOT RUN" start="2026-04-17T03:16:52.790879" elapsed="0.000113"/>
</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-04-17T03:16:52.167240" elapsed="0.624104">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Verify_GoBgps_Connection" owner="GoBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:17:07.794003" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:07.793523" elapsed="0.000522"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:07.794676" 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-04-17T03:17:07.794292" elapsed="0.000412"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:17:07.800438" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:17:08.002177" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:17:08.404872" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:17:08.407720" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:17:07.794867" elapsed="0.618496">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:08.413783" elapsed="0.000045"/>
</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="NOT RUN" start="2026-04-17T03:17:08.414077" elapsed="0.000034"/>
</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-04-17T03:17:07.792596" elapsed="0.621686">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:17:08.414444" level="FAIL">Keyword 'Verify_GoBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:16:36.542708" elapsed="31.871985">Keyword 'Verify_GoBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:17:08.414902" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:17:08.415069" level="INFO">${value} = Keyword 'Verify_GoBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/b...</msg>
<var>${status}</var>
<var>${value}</var>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>${connection_retries}x</arg>
<arg>15s</arg>
<arg>Verify_GoBgps_Connection</arg>
<arg>${session}</arg>
<arg>${gobgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:16:36.542078" elapsed="31.873037"/>
</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-04-17T03:17:08.416572" level="INFO">[?2004l</msg>
<msg time="2026-04-17T03:17:08.416698" level="INFO">${output} = [?2004l</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-04-17T03:17:08.416354" elapsed="0.000380"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:08.417437" level="INFO">[?2004l</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:08.417008" elapsed="0.000497"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:17:08.418722" 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-04-17T03:17:08.418238" elapsed="0.000524"/>
</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-04-17T03:17:08.419036" elapsed="0.000435"/>
</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-04-17T03:17:08.417803" elapsed="0.001758"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:17:08.423267" level="INFO">^C
[?2004h[jenkins@releng-26932-188-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-04-17T03:17:08.423364" level="INFO">${output} = ^C
[?2004h[jenkins@releng-26932-188-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-04-17T03:17:08.419872" elapsed="0.003518"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:08.423905" level="INFO">^C
[?2004h[jenkins@releng-26932-188-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-04-17T03:17:08.423565" elapsed="0.000422"/>
</kw>
<doc>Stops the GoBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-04-17T03:17:08.415759" elapsed="0.008303"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:08.415280" elapsed="0.008822"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:08.415244" elapsed="0.008901"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="NOT RUN" start="2026-04-17T03:17:08.424360" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:08.424222" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:08.424201" elapsed="0.000241"/>
</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-04-17T03:16:36.535129" elapsed="31.889381"/>
</kw>
<tag>critical</tag>
<status status="PASS" start="2026-04-17T03:16:36.460509" elapsed="31.964174"/>
</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-04-17T03:17:08.428861" elapsed="0.000319"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:17:08.428526" elapsed="0.000730"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:17:08.430522" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:08.430373" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:08.430346" 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-04-17T03:17:08.436656" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:08.436505" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:08.436479" elapsed="0.000266"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:08.438074" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:17:08.437541" elapsed="0.000567"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:17:08.438667" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:17:08.438305" elapsed="0.000393"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:17:08.438752" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:17:08.438965" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:17:08.437079" elapsed="0.001916"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:17:08.446463" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:08.446301" elapsed="0.000370"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:08.446270" 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-04-17T03:17:08.448467" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:08.448337" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:08.448316" elapsed="0.000233"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:17:08.449122" level="INFO">${karaf_connection_index} = 18</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:17:08.448729" elapsed="0.000427"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:17:08.449615" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:17:08.449359" elapsed="0.000287"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:17:08.450596" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:17:08.450279" elapsed="0.001142">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:17:08.451640" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:17:08.451695" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:08.449843" elapsed="0.001880"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:17:08.452681" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:17:08.452394" elapsed="0.001080">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:17:08.453686" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:17:08.453739" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:08.451946" elapsed="0.001820"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:17:08.454864" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Llgr Basic.Delete_Bgp_Peer_Configuration"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:17:08.454157" elapsed="0.000798">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Llgr Basic.Delete_Bgp_Peer_Configuration"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:17:08.453861" elapsed="0.001179">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Llgr Basic.Delete_Bgp_Peer_Configuration"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:17:08.453835" elapsed="0.001283">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Llgr Basic.Delete_Bgp_Peer_Configuration"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:08.455316" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:08.455584" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:08.455415" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:08.455395" elapsed="0.000277"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:17:08.455715" elapsed="0.000019"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:17:08.458708" elapsed="0.000174"/>
</kw>
<msg time="2026-04-17T03:17:08.458977" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:08.457518" elapsed="0.001669"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:08.459521" elapsed="0.000087"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:08.459911" 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-04-17T03:17:08.456746" elapsed="0.003403"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:17:08.456091" elapsed="0.004133"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:17:08.447898" elapsed="0.012432">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Llgr Basic.Delete_Bgp_Peer_Configuration"</status>
</kw>
<msg time="2026-04-17T03:17:08.460460" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:17:08.460512" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Llgr Basic.Delete_Bgp_Peer_Configuration"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:08.446966" elapsed="0.013576"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:17:08.460840" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:08.460703" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:08.460677" elapsed="0.000245"/>
</if>
<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-04-17T03:17:08.464404" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:08.464263" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:08.464239" elapsed="0.000254"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:17:08.464867" level="INFO">index=16
host=10.30.171.238
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-04-17T03:17:08.465122" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.238
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-04-17T03:17:08.464702" elapsed="0.000454"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:08.465692" level="INFO">{1: 18}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:08.465345" elapsed="0.000400"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:08.466233" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:08.465944" elapsed="0.000341"/>
</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-04-17T03:17:08.466974" elapsed="0.000363"/>
</kw>
<msg time="2026-04-17T03:17:08.467456" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:17:08.467510" level="INFO">${old_connection_index} = 18</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:08.466481" elapsed="0.001055"/>
</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-04-17T03:17:08.468543" elapsed="0.000232"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:17:08.470205" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:17:08.469692" elapsed="0.001971">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:08.469114" elapsed="0.002693"/>
</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-04-17T03:17:08.472643" elapsed="0.000340"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:08.472064" elapsed="0.001018"/>
</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-04-17T03:17:08.467896" elapsed="0.005243"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:08.467626" elapsed="0.005572"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:08.467604" elapsed="0.005628"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:17:08.474350" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:17:08.473970" elapsed="0.000412"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:17:08.474451" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:17:08.474641" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:17:08.473517" elapsed="0.001153"/>
</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-04-17T03:17:08.474859" elapsed="0.000560"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:17:08.475711" level="INFO">index=19
host=10.30.170.120
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-04-17T03:17:08.475812" level="INFO">${karaf_connection_object} = index=19
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:17:08.475591" elapsed="0.000248"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:17:08.476003" elapsed="0.002280"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:17:08.478713" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:17:08.480069" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:17:08.478447" elapsed="0.002068">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:17:08.495017" elapsed="0.000470"/>
</kw>
<msg time="2026-04-17T03:17:08.495675" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:08.493591" elapsed="0.002255"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:08.496030" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:08.496202" elapsed="0.000026"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:17:08.481457" elapsed="0.014855"/>
</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-04-17T03:17:08.480848" elapsed="0.015528"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:17:08.463832" elapsed="0.032642">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:08.496875" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:17:08.496972" elapsed="0.000024"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:17:08.445722" elapsed="0.051369">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:17:08.497207" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:17:08.497252" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:08.439555" elapsed="0.057720"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:08.497631" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:08.497360" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:08.497339" elapsed="0.000373"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:17:08.439376" elapsed="0.058361"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:17:08.439144" elapsed="0.058626"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:17:08.436003" elapsed="0.061826"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:17:08.430008" elapsed="0.067879"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:08.429443" elapsed="0.068960"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:17:08.425725" elapsed="0.072742"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:17:08.499505" level="INFO">&amp;{mapping} = { IP=10.30.171.238 | 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-04-17T03:17:08.498690" elapsed="0.000845"/>
</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-04-17T03:17:08.530568" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:08.530174" elapsed="0.000428"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:08.531507" 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-04-17T03:17:08.531135" elapsed="0.000450">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-04-17T03:17:08.531682" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:08.530772" elapsed="0.000933"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:08.532274" 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-04-17T03:17:08.531869" elapsed="0.000432"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:17:08.532689" 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-04-17T03:17:08.532846" 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-04-17T03:17:08.532545" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:08.533299" 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-04-17T03:17:08.533046" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:08.534324" level="INFO">mapping: {'IP': '10.30.171.238', '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-04-17T03:17:08.534058" elapsed="0.000313"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:17:08.534796" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:17:08.534527" elapsed="0.000295"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:17:08.535606" level="INFO">${value} = 10.30.171.238</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:17:08.535280" elapsed="0.000353"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:17:08.536634" level="INFO">${encoded} = 10.30.171.238</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:17:08.536406" elapsed="0.000255"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:17:08.536714" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:17:08.536884" level="INFO">${encoded_value} = 10.30.171.238</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:17:08.535828" elapsed="0.001081"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:17:08.537083" elapsed="0.000244"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.238</var>
<status status="PASS" start="2026-04-17T03:17:08.535074" elapsed="0.002294"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:17:08.537917" 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-04-17T03:17:08.537612" elapsed="0.000348"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:17:08.538684" 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-04-17T03:17:08.538470" elapsed="0.000239"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:17:08.538759" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:17:08.538914" 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-04-17T03:17:08.538149" 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-04-17T03:17:08.539106" elapsed="0.000251"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:17:08.537481" elapsed="0.001917"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:17:08.539964" 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-04-17T03:17:08.539641" elapsed="0.000350"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:17:08.540708" 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-04-17T03:17:08.540496" elapsed="0.000239"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:17:08.540784" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:17:08.540953" 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-04-17T03:17:08.540179" elapsed="0.000800"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:17:08.541131" elapsed="0.000227"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:17:08.539509" elapsed="0.001890"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:17:08.541973" 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-04-17T03:17:08.541647" elapsed="0.000353"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:17:08.542725" 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-04-17T03:17:08.542510" elapsed="0.000242"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:17:08.542801" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:17:08.543031" 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-04-17T03:17:08.542187" 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-04-17T03:17:08.543254" elapsed="0.000231"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:17:08.541513" elapsed="0.002014"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:17:08.544099" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:17:08.543773" elapsed="0.000353"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:17:08.544856" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:17:08.544641" elapsed="0.000241"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:17:08.544948" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:17:08.545108" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:17:08.544316" elapsed="0.000818"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:17:08.545287" elapsed="0.000226"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:17:08.543640" elapsed="0.001915"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:17:08.546128" 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-04-17T03:17:08.545803" elapsed="0.000352"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:17:08.546914" 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-04-17T03:17:08.546665" elapsed="0.000289"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:17:08.547006" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:17:08.547166" 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-04-17T03:17:08.546344" 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-04-17T03:17:08.547377" elapsed="0.000230"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:17:08.545670" elapsed="0.001979"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:17:08.548416" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:17:08.547896" elapsed="0.000599"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:17:08.549239" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:17:08.549025" elapsed="0.000240"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:17:08.549314" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:17:08.549468" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:17:08.548690" elapsed="0.000802"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:17:08.549641" elapsed="0.000222"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:17:08.547764" elapsed="0.002141"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:17:08.550468" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:17:08.550165" elapsed="0.000329"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:17:08.551271" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:17:08.551010" elapsed="0.000287"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:17:08.551346" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:17:08.551496" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:17:08.550680" elapsed="0.000840"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:17:08.551669" elapsed="0.000289"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:17:08.550034" elapsed="0.001967"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:17:08.534875" elapsed="0.017160"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:17:08.552078" elapsed="0.000027"/>
</return>
<msg time="2026-04-17T03:17:08.552240" level="INFO">${mapping_to_use} = {'IP': '10.30.171.238', '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-04-17T03:17:08.533724" elapsed="0.018542"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:08.533421" elapsed="0.018876"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:08.552502" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:08.552321" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:08.533399" elapsed="0.019181"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:17:08.553430" 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-04-17T03:17:08.552722" elapsed="0.000737"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:17:08.553507" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:17:08.529545" elapsed="0.024085"/>
</kw>
<msg time="2026-04-17T03:17:08.553685" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:08.528592" elapsed="0.025139"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:17:08.554243" elapsed="0.000026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/gobgp_2.18.0_linux_386.tar.gz exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer.vanadium/gobgp_2.18.0_linux_386.tar.gz,
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ipv6/bgp_peer/gobgp_2.18.0_linux_386.tar.gz.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:08.554752" 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/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-04-17T03:17:08.555300" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:08.555484" 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-04-17T03:17:08.555652" elapsed="0.000019"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:08.556021" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:08.555865" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:08.555851" 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-04-17T03:17:08.556238" 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-04-17T03:17:08.556403" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:08.556568" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:17:08.555823" elapsed="0.000797"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:17:08.555725" elapsed="0.000920"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:08.556788" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:08.556862" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:17:08.557031" 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-04-17T03:17:08.524016" elapsed="0.033043"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:08.558155" 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.238</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:08.557891" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:17:08.563564" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:17:08.765376" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:17:09.167903" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:17:09.170219" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:08.560461" elapsed="0.613258">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:17:08.558267" elapsed="0.615624">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:09.174301" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:09.173981" elapsed="0.000441"/>
</branch>
<status status="FAIL" start="2026-04-17T03:17:08.558250" elapsed="0.616210">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:17:09.175153" elapsed="0.000053"/>
</kw>
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:09.175301" elapsed="0.000034"/>
</return>
<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-04-17T03:17:08.557320" elapsed="0.618191">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:09.175633" elapsed="0.000029"/>
</return>
<arg>${BGP_VAR_FOLDER}/bgp_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="FAIL" start="2026-04-17T03:17:08.499783" elapsed="0.676028">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="FAIL" start="2026-04-17T03:17:08.424975" elapsed="0.751296">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:17:09.181038" elapsed="0.000353"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:17:09.180617" elapsed="0.000853"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:17:09.183000" elapsed="0.000117"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:09.182782" elapsed="0.000384"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:09.182751" 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-04-17T03:17:09.188835" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:09.188723" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:09.188704" elapsed="0.000199"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:09.189967" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:17:09.189538" elapsed="0.000458"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:17:09.190475" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:17:09.190169" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:17:09.190546" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:17:09.190745" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:17:09.189153" elapsed="0.001618"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:17:09.196335" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:09.196219" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:09.196199" elapsed="0.000205"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:17:09.197587" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:09.197479" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:09.197462" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:17:09.198140" level="INFO">${karaf_connection_index} = 19</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:17:09.197802" elapsed="0.000365"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:17:09.198550" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:17:09.198327" elapsed="0.000249"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:17:09.199383" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:17:09.199106" elapsed="0.000939">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:17:09.200284" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:17:09.200333" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:09.198733" elapsed="0.001625"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:17:09.201137" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:17:09.200870" elapsed="0.000963">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:17:09.202083" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:17:09.202133" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:09.200526" elapsed="0.001631"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:17:09.203269" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Llgr Basic.Stop_All_Gobgps"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:17:09.202464" elapsed="0.000916">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Llgr Basic.Stop_All_Gobgps"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:17:09.202235" elapsed="0.001215">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Llgr Basic.Stop_All_Gobgps"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:17:09.202216" elapsed="0.001268">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Llgr Basic.Stop_All_Gobgps"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:09.203647" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:09.203876" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:09.203735" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:09.203718" elapsed="0.000254"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:17:09.204007" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:17:09.206781" elapsed="0.000196"/>
</kw>
<msg time="2026-04-17T03:17:09.207048" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:09.205505" elapsed="0.001693"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:09.207495" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:09.207832" 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-04-17T03:17:09.204855" elapsed="0.003384"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:17:09.204314" elapsed="0.004002"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:17:09.197175" elapsed="0.011242">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Llgr Basic.Stop_All_Gobgps"</status>
</kw>
<msg time="2026-04-17T03:17:09.208525" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:17:09.208570" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Llgr Basic.Stop_All_Gobgps"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:09.196557" elapsed="0.012036"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:17:09.208786" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:09.208674" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:09.208653" elapsed="0.000203"/>
</if>
<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-04-17T03:17:09.209780" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:09.209671" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:09.209653" elapsed="0.000194"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:17:09.210144" level="INFO">index=16
host=10.30.171.238
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-04-17T03:17:09.210250" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.238
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-04-17T03:17:09.210016" elapsed="0.000261"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:09.210713" level="INFO">{1: 19}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:09.210425" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:09.211234" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:09.210909" elapsed="0.000384"/>
</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-04-17T03:17:09.211825" elapsed="0.000354"/>
</kw>
<msg time="2026-04-17T03:17:09.212287" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:17:09.212335" level="INFO">${old_connection_index} = 19</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:09.211452" elapsed="0.000907"/>
</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-04-17T03:17:09.213216" elapsed="0.000197"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:17:09.214491" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:17:09.214076" elapsed="0.001522">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:09.213579" elapsed="0.002122"/>
</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-04-17T03:17:09.216466" elapsed="0.000277"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:09.215942" elapsed="0.000884"/>
</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-04-17T03:17:09.212681" elapsed="0.004190"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:09.212433" elapsed="0.004488"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:09.212416" elapsed="0.004547"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:17:09.217808" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:17:09.217500" elapsed="0.000335"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:17:09.217884" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:17:09.218054" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:17:09.217172" elapsed="0.000907"/>
</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-04-17T03:17:09.218231" elapsed="0.000591"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:17:09.219287" level="INFO">index=20
host=10.30.170.120
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-04-17T03:17:09.219390" level="INFO">${karaf_connection_object} = index=20
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:17:09.219004" elapsed="0.000413"/>
</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-04-17T03:17:09.219565" elapsed="0.002303"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:17:09.222310" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:17:09.223680" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:17:09.222046" elapsed="0.002074">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:17:09.239124" elapsed="0.000412"/>
</kw>
<msg time="2026-04-17T03:17:09.239635" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:09.237195" elapsed="0.002600"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:09.239975" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:09.240188" elapsed="0.000025"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:17:09.225188" elapsed="0.015095"/>
</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-04-17T03:17:09.224409" elapsed="0.015925"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:17:09.209335" elapsed="0.031088">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:09.240804" elapsed="0.000032"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:17:09.240888" 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="FAIL" start="2026-04-17T03:17:09.195836" elapsed="0.045345">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:17:09.241304" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:17:09.241348" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:09.191237" elapsed="0.050134"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:09.241714" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:09.241456" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:09.241436" elapsed="0.000408"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:17:09.191067" elapsed="0.050806"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:17:09.190831" elapsed="0.051077"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:17:09.188307" elapsed="0.053686"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:17:09.182336" elapsed="0.059717"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:09.181687" elapsed="0.060413"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:17:09.177341" elapsed="0.064816"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:17:09.251500" level="INFO">Executing command 'cat gobgp.log'.</msg>
<msg time="2026-04-17T03:17:09.265452" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:17:09.265626" level="INFO">${output_log} = {"level":"info","msg":"gobgpd started","time":"2026-04-17T03:16:36Z"}
{"Topic":"Config","level":"info","msg":"Finished reading the config file","time":"2026-04-17T03:16:36Z"}
{"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-04-17T03:17:09.251345" elapsed="0.014321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:09.266576" level="INFO">{"level":"info","msg":"gobgpd started","time":"2026-04-17T03:16:36Z"}
{"Topic":"Config","level":"info","msg":"Finished reading the config file","time":"2026-04-17T03:16:36Z"}
{"level":"info","msg":"Peer 10.30.170.120 is added","time":"2026-04-17T03:16:36Z"}
{"Topic":"Peer","level":"info","msg":"Add a peer configuration for:10.30.170.120","time":"2026-04-17T03:16:36Z"}
{"Duration":0,"Key":"10.30.170.120","Topic":"Peer","level":"debug","msg":"IdleHoldTimer expired","time":"2026-04-17T03:16:36Z"}
{"Key":"10.30.170.120","Topic":"Peer","level":"debug","msg":"state changed","new":"BGP_FSM_ACTIVE","old":"BGP_FSM_IDLE","reason":{"Type":7,"BGPNotification":null,"Data":null},"time":"2026-04-17T03:16:36Z"}
{"Key":"10.30.170.120","Topic":"Peer","level":"debug","msg":"try to connect","time":"2026-04-17T03:16:43Z"}
{"Key":"10.30.170.120","Topic":"Peer","level":"debug","msg":"failed to connect: dial tcp 10.30.171.238:0-\u003e10.30.170.120:1790: connect: connection refused","time":"2026-04-17T03:16:43Z"}</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:09.265955" elapsed="0.000766"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-04-17T03:17:09.268017" 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-04-17T03:17:09.267212" elapsed="0.000970"/>
</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-04-17T03:17:09.250899" elapsed="0.017430"/>
</kw>
<kw name="Stop_GoBgp" owner="GoBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-04-17T03:17:09.269848" level="INFO">${output} =  </msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-04-17T03:17:09.269498" elapsed="0.000409"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:09.270848" level="INFO"> </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:09.270276" elapsed="0.000702"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:17:09.272808" 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-04-17T03:17:09.272059" elapsed="0.000810"/>
</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-04-17T03:17:09.273247" 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-04-17T03:17:09.271424" elapsed="0.002401"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:17:09.303518" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-188-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-04-17T03:17:09.303692" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-188-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-04-17T03:17:09.274184" elapsed="0.029545"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:09.304339" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-188-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-04-17T03:17:09.303993" elapsed="0.000396"/>
</kw>
<doc>Stops the GoBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-04-17T03:17:09.268836" elapsed="0.035614"/>
</kw>
<doc>Save exabgp logs as exaipv6.log, and stop exabgp with ctrl-c bash signal</doc>
<status status="PASS" start="2026-04-17T03:17:09.176607" elapsed="0.127962"/>
</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-04-17T03:17:09.305399" elapsed="0.000448"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-17T03:17:09.306097" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-17T03:17:09.306019" elapsed="0.000163"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Stop_GoBgp" owner="GoBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-04-17T03:17:09.307286" level="INFO">${output} = None</msg>
<msg time="2026-04-17T03:17:09.307330" 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-04-17T03:17:09.307104" elapsed="0.000533">No open connection.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:09.308074" level="INFO">None</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:09.307805" elapsed="0.000313"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:17:09.309389" 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-04-17T03:17:09.308637" elapsed="0.000840"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<msg time="2026-04-17T03:17:09.309814" 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-04-17T03:17:09.309638" elapsed="0.000445">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-04-17T03:17:09.308383" elapsed="0.001826">No open connection.</status>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:17:09.310526" level="INFO">${output} = None</msg>
<msg time="2026-04-17T03:17:09.310567" 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-04-17T03:17:09.310371" elapsed="0.000407">No open connection.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:09.311210" level="INFO">None</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:09.310960" elapsed="0.000295"/>
</kw>
<doc>Stops the GoBgp by sending ctrl+c</doc>
<status status="FAIL" start="2026-04-17T03:17:09.306809" elapsed="0.004559">Several failures occurred:

1) No open connection.

2) No open connection.

3) No open connection.</status>
</kw>
<arg>GoBgpLib.Stop_GoBgp</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:09.306377" elapsed="0.005042"/>
</kw>
<doc>Suite teardown keyword</doc>
<status status="PASS" start="2026-04-17T03:17:09.305142" elapsed="0.006326"/>
</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="FAIL" start="2026-04-17T03:16:29.758071" elapsed="39.553424"/>
</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-04-17T03:17:09.410270" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:17:09.405630" elapsed="0.004724"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-17T03:17:09.405396" elapsed="0.005034"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-17T03:17:09.415588" 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-04-17T03:17:09.411628" elapsed="0.003990"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-17T03:17:09.415833" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:09.415705" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:09.415679" elapsed="0.000226"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:17:09.416475" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:17:09.416079" elapsed="0.000441"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-17T03:17:09.417040" 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-04-17T03:17:09.416684" elapsed="0.000385"/>
</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-04-17T03:17:09.417665" elapsed="0.000354"/>
</kw>
<msg time="2026-04-17T03:17:09.418121" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:17:09.418167" level="INFO">${possibly_int_of_members} = 1</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:09.417246" elapsed="0.000943"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:09.418732" 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-04-17T03:17:09.418359" elapsed="0.000400"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:17:09.419773" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:17:09.419505" elapsed="0.000295"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:17:09.420224" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:17:09.419966" elapsed="0.000284"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:17:09.420784" 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-04-17T03:17:09.420479" elapsed="0.000333"/>
</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-04-17T03:17:09.426201" elapsed="0.000223"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:17:09.427150" level="INFO">${member_ip} = 10.30.170.120</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:09.426792" elapsed="0.000385"/>
</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-04-17T03:17:09.427337" elapsed="0.000231"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:17:09.428658" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:09.428125" elapsed="0.000687"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-17T03:17:09.428868" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:17:09.429059" 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-04-17T03:17:09.427793" elapsed="0.001291"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:17:09.429701" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.120:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a4424dcc1d0&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-04-17T03:17:09.429246" elapsed="0.000597"/>
</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-04-17T03:17:09.430024" elapsed="0.000194"/>
</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-04-17T03:17:09.425432" elapsed="0.004844"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:17:09.425226" elapsed="0.005095"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-04-17T03:17:09.420869" elapsed="0.009485"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:17:09.430954" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:17:09.430516" elapsed="0.000501"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:17:09.431746" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.120'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:17:09.431229" elapsed="0.000572"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:17:09.432563" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:17:09.432044" elapsed="0.000565"/>
</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-04-17T03:17:09.419036" elapsed="0.013634"/>
</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-04-17T03:17:09.411262" elapsed="0.021504"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:17:09.432991" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:09.432848" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:09.432826" elapsed="0.000234"/>
</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-04-17T03:17:09.436327" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:17:09.435910" elapsed="0.000490"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:17:09.436882" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:17:09.436575" elapsed="0.000333"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:17:09.436979" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:17:09.437140" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:17:09.435568" elapsed="0.001597"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:17:09.438264" level="INFO">${member_ip} = 10.30.170.120</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-04-17T03:17:09.437982" elapsed="0.000309"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:17:09.439173" 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-04-17T03:17:09.439278" 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-04-17T03:17:09.438992" elapsed="0.000312"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:09.443022" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:09.442414" elapsed="0.000721"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:09.442394" elapsed="0.000838"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:17:09.444001" 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-04-17T03:17:09.444241" 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-04-17T03:17:09.443522" elapsed="0.000771"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:09.445302" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.120" 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-04-17T03:17:09.444608" elapsed="0.000802"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:17:09.446667" 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-04-17T03:17:09.445717" elapsed="0.001001"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-17T03:17:09.448545" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:17:09.448747" 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-04-17T03:17:09.448148" elapsed="0.000652"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:09.449167" elapsed="0.000510"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:17:09.450874" level="INFO">Logging into '10.30.170.120:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:17:10.134715" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 17 03:17:09 UTC 2026

  System load:  0.02               Processes:             119
  Usage of /:   10.4% of 77.35GB   Users logged in:       0
  Memory usage: 2%                 IPv4 address for ens3: 10.30.170.120
  Swap usage:   0%                 IPv6 address for ens3: 2607:f0d0:1002:11::2


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:16:30 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:17:09.450512" elapsed="0.684355"/>
</kw>
<msg time="2026-04-17T03:17:10.134974" 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-04-17T03:17:09.450057" elapsed="0.685112"/>
</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-04-17T03:17:09.447204" elapsed="0.688133"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:17:10.136290" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-17T03:17:10.149632" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-17T03:17:10.150007" level="INFO">${stdout} = </msg>
<msg time="2026-04-17T03:17:10.150209" 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-04-17T03:17:10.135725" elapsed="0.014570"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:17:10.150770" elapsed="0.000815"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:10.153772" 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-04-17T03:17:10.152615" elapsed="0.001379"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-17T03:17:10.154824" elapsed="0.000094"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:10.154325" elapsed="0.000787"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:10.154275" elapsed="0.000909"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:17:10.155744" elapsed="0.000115"/>
</return>
<status status="PASS" start="2026-04-17T03:17:10.155335" elapsed="0.000761"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:10.155302" elapsed="0.000872"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-17T03:17:10.156292" elapsed="0.000032"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:10.162902" elapsed="0.000771"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-17T03:17:10.164158" elapsed="0.000420"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:17:10.164972" elapsed="0.000437"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:17:10.157183" elapsed="0.008334"/>
</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-04-17T03:17:09.441412" elapsed="0.724479"/>
</kw>
<msg time="2026-04-17T03:17:10.166014" 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-04-17T03:17:09.440516" elapsed="0.725624"/>
</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-04-17T03:17:09.439996" elapsed="0.726273"/>
</kw>
<msg time="2026-04-17T03:17:10.166323" 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-04-17T03:17:09.439463" elapsed="0.726920"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:10.170057" elapsed="0.000433"/>
</kw>
<kw name="Open 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-04-17T03:17:10.170712" elapsed="0.000211"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:17:10.171172" elapsed="0.000137"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:17:10.166712" elapsed="0.004670"/>
</kw>
<msg time="2026-04-17T03:17:10.171497" 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-04-17T03:17:09.438532" elapsed="0.732992"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:10.172088" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:10.171742" elapsed="0.000389"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-17T03:17:10.172178" elapsed="0.000036"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-17T03:17:09.437571" elapsed="0.734748"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:17:09.437361" elapsed="0.734996"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:17:09.437222" elapsed="0.735172"/>
</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-04-17T03:17:09.433295" elapsed="0.739159"/>
</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-04-17T03:17:10.172616" elapsed="0.000219"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:17:10.189158" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:10.189005" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:10.188973" elapsed="0.000275"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:17:10.189773" 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-04-17T03:17:10.189900" 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-04-17T03:17:10.189525" elapsed="0.000421"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:10.190450" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:10.190133" elapsed="0.000363"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:10.190979" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:10.190655" elapsed="0.000386"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:17:10.192002" 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-04-17T03:17:10.191668" elapsed="0.000450">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-17T03:17:10.192232" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:17:10.192279" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:10.191235" elapsed="0.001067"/>
</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-04-17T03:17:10.192647" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:10.192380" elapsed="0.000898"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:10.192360" elapsed="0.000986"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:17:10.194224" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:17:10.193919" elapsed="0.000332"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:17:10.194302" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:17:10.194465" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:17:10.193620" elapsed="0.000870"/>
</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-04-17T03:17:10.194650" elapsed="0.000456"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:17:10.195399" level="INFO">index=4
host=10.30.170.120
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-04-17T03:17:10.195502" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.120
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-04-17T03:17:10.195282" elapsed="0.000246"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:17:10.195681" elapsed="0.002794"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:17:10.198954" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:17:10.200131" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:17:10.198650" elapsed="0.002005">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:10.204136" elapsed="0.000439"/>
</kw>
<kw name="Open 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-04-17T03:17:10.204755" elapsed="0.000192"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:17:10.205104" elapsed="0.000156"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:17:10.201748" elapsed="0.003631"/>
</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-04-17T03:17:10.201095" elapsed="0.004339"/>
</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="FAIL" start="2026-04-17T03:17:10.188472" elapsed="0.017062">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:17:11.229557" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:11.229365" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:11.229334" elapsed="0.000325"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:17:11.230201" 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-04-17T03:17:11.230395" 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-04-17T03:17:11.229913" elapsed="0.000533"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:11.231199" 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-04-17T03:17:11.230751" elapsed="0.000512"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:11.231845" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:11.231490" elapsed="0.000417"/>
</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-04-17T03:17:11.232780" elapsed="0.000320"/>
</kw>
<msg time="2026-04-17T03:17:11.233270" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:17:11.233352" level="INFO">${old_connection_index} = 4</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:11.232200" elapsed="0.001201"/>
</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-04-17T03:17:11.234771" elapsed="0.000222"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:17:11.236001" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:17:11.235741" elapsed="0.001094">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:11.235232" elapsed="0.001690"/>
</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-04-17T03:17:11.237636" elapsed="0.000142"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:11.237178" elapsed="0.000666"/>
</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-04-17T03:17:11.233910" elapsed="0.003995"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:11.233533" elapsed="0.004459"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:11.233496" elapsed="0.004537"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:17:11.239189" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:17:11.238805" elapsed="0.000421"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:17:11.239293" elapsed="0.000045"/>
</return>
<msg time="2026-04-17T03:17:11.239505" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:17:11.238343" elapsed="0.001191"/>
</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-04-17T03:17:11.239736" elapsed="0.000511"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:17:11.240586" level="INFO">index=6
host=10.30.170.120
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-04-17T03:17:11.240694" level="INFO">${karaf_connection_object} = index=6
host=10.30.170.120
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-04-17T03:17:11.240441" elapsed="0.000280"/>
</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-04-17T03:17:11.240882" elapsed="0.003033"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:17:11.244579" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:17:11.246179" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:17:11.244179" elapsed="0.002527">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:11.250641" elapsed="0.000399"/>
</kw>
<kw name="Open 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-04-17T03:17:11.251211" elapsed="0.000164"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:17:11.251562" elapsed="0.000118"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:17:11.248019" elapsed="0.003717"/>
</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-04-17T03:17:11.247178" elapsed="0.004606"/>
</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="FAIL" start="2026-04-17T03:17:11.228900" elapsed="0.022976">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:17:12.272163" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:12.272011" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:12.271982" elapsed="0.000272"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:17:12.272690" 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-04-17T03:17:12.272823" 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-04-17T03:17:12.272474" elapsed="0.000377"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:12.273356" level="INFO">{1: 6}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:12.273038" elapsed="0.000370"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:12.273841" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:12.273566" elapsed="0.000323"/>
</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-04-17T03:17:12.274621" elapsed="0.000213"/>
</kw>
<msg time="2026-04-17T03:17:12.274960" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:17:12.275010" level="INFO">${old_connection_index} = 6</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:12.274075" elapsed="0.000960"/>
</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-04-17T03:17:12.275955" elapsed="0.000145"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:17:12.276803" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:17:12.276609" elapsed="0.000804">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:12.276272" elapsed="0.001207"/>
</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-04-17T03:17:12.278072" elapsed="0.000108"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:12.277654" elapsed="0.000573"/>
</kw>
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="PASS" start="2026-04-17T03:17:12.275350" elapsed="0.002922"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:12.275117" elapsed="0.003204"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:12.275097" elapsed="0.003250"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:17:12.279149" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:17:12.278856" elapsed="0.000319"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:17:12.279224" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:17:12.279385" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:17:12.278572" elapsed="0.000837"/>
</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-04-17T03:17:12.279762" elapsed="0.000471"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:17:12.280527" level="INFO">index=8
host=10.30.170.120
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-04-17T03:17:12.280630" level="INFO">${karaf_connection_object} = index=8
host=10.30.170.120
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-04-17T03:17:12.280416" elapsed="0.000240"/>
</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-04-17T03:17:12.280805" elapsed="0.002742"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:17:12.284055" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:17:12.285439" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:17:12.283757" elapsed="0.002070">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:12.289164" elapsed="0.000550"/>
</kw>
<kw name="Open 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-04-17T03:17:12.289880" elapsed="0.000176"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:17:12.290240" elapsed="0.000113"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:17:12.286687" elapsed="0.003718"/>
</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-04-17T03:17:12.286152" elapsed="0.004300"/>
</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="FAIL" start="2026-04-17T03:17:12.271516" elapsed="0.019019">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:17:13.310685" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:13.310521" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:13.310493" elapsed="0.000281"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:17:13.311278" 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-04-17T03:17:13.311402" 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-04-17T03:17:13.311089" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:13.311921" level="INFO">{1: 8}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:13.311590" elapsed="0.000396"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:13.312392" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:13.312142" elapsed="0.000294"/>
</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-04-17T03:17:13.313276" elapsed="0.000201"/>
</kw>
<msg time="2026-04-17T03:17:13.313581" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:17:13.313628" level="INFO">${old_connection_index} = 8</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:13.312631" elapsed="0.001020"/>
</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-04-17T03:17:13.314512" elapsed="0.000142"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:17:13.315363" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:17:13.315186" elapsed="0.000693">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:13.314830" elapsed="0.001146"/>
</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-04-17T03:17:13.316520" elapsed="0.000102"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:13.316162" elapsed="0.000530"/>
</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-04-17T03:17:13.313977" elapsed="0.002797"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:13.313729" elapsed="0.003102"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:13.313709" elapsed="0.003153"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:17:13.317824" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:17:13.317517" elapsed="0.000335"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:17:13.317904" elapsed="0.000064"/>
</return>
<msg time="2026-04-17T03:17:13.318116" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:17:13.317176" 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-04-17T03:17:13.318326" elapsed="0.000521"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:17:13.319255" level="INFO">index=10
host=10.30.170.120
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-04-17T03:17:13.319387" level="INFO">${karaf_connection_object} = index=10
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:17:13.319102" elapsed="0.000324"/>
</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-04-17T03:17:13.319620" elapsed="0.002743"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:17:13.322804" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:17:13.324233" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:17:13.322537" elapsed="0.002143">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:13.327956" elapsed="0.000382"/>
</kw>
<kw name="Open 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-04-17T03:17:13.328504" elapsed="0.000155"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:17:13.328879" elapsed="0.000130"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:17:13.325715" elapsed="0.003350"/>
</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-04-17T03:17:13.325097" elapsed="0.004083"/>
</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="FAIL" start="2026-04-17T03:17:13.310096" elapsed="0.019174">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:17:13.329363" level="FAIL">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<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="FAIL" start="2026-04-17T03:17:10.173730" elapsed="3.155749">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:10.173212" elapsed="3.156348"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:17:10.173067" elapsed="3.156541"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-04-17T03:17:10.172896" elapsed="3.156750"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-17T03:17:09.410738" elapsed="3.918967"/>
</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-04-17T03:17:13.332387" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:13.332271" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:13.332250" 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-04-17T03:17:13.337358" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:13.337251" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:13.337233" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:13.338406" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:17:13.338013" elapsed="0.000420"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:17:13.338890" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:17:13.338594" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:17:13.338976" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:17:13.339136" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:17:13.337666" elapsed="0.001494"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:17:13.346267" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:13.346159" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:13.346141" 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-04-17T03:17:13.347534" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:13.347408" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:13.347391" elapsed="0.000209"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:17:13.348089" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:17:13.347744" elapsed="0.000371"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:17:13.348500" 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-04-17T03:17:13.348273" elapsed="0.000253"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:17:13.349711" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:17:13.349260" elapsed="0.001190">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:17:13.350590" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:17:13.350635" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:13.348684" elapsed="0.001974"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:17:13.351745" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:17:13.351349" elapsed="0.001187">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:17:13.352673" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:17:13.352790" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:13.350830" elapsed="0.001986"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:17:13.353979" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/bgp_app_peer_basic.robot"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:17:13.353174" elapsed="0.000906">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/bgp_app_peer_basic.robot"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:17:13.352891" elapsed="0.001334">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/bgp_app_peer_basic.robot"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:17:13.352872" elapsed="0.001389">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/bgp_app_peer_basic.robot"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:13.354429" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:13.354661" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:13.354518" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:13.354500" elapsed="0.000339"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:17:13.354873" elapsed="0.000018"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:13.356922" elapsed="0.000512"/>
</kw>
<kw name="Open 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-04-17T03:17:13.357795" elapsed="0.000322"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:17:13.358454" elapsed="0.000240"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:17:13.356100" elapsed="0.002687"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:17:13.355171" elapsed="0.003752"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:17:13.347123" elapsed="0.011908">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/bgp_app_peer_basic.robot"</status>
</kw>
<msg time="2026-04-17T03:17:13.359141" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:17:13.359187" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/bgp_app_peer_basic.robot"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:13.346487" elapsed="0.012725"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:17:13.359401" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:13.359290" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:13.359271" elapsed="0.000198"/>
</if>
<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-04-17T03:17:13.360367" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:13.360256" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:13.360238" elapsed="0.000199"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:17:13.360948" 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-04-17T03:17:13.361066" 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-04-17T03:17:13.360592" elapsed="0.000502"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:13.361529" level="INFO">{1: 10}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:13.361252" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:13.362005" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:13.361734" elapsed="0.000317"/>
</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-04-17T03:17:13.362591" elapsed="0.000288"/>
</kw>
<msg time="2026-04-17T03:17:13.362997" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:17:13.363047" level="INFO">${old_connection_index} = 10</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:13.362217" elapsed="0.000853"/>
</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-04-17T03:17:13.364347" elapsed="0.000264"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:17:13.366018" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:17:13.365734" elapsed="0.000761">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:13.364943" elapsed="0.001644"/>
</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-04-17T03:17:13.367591" elapsed="0.000198"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:13.366833" elapsed="0.001030"/>
</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-04-17T03:17:13.363371" elapsed="0.004657"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:13.363146" elapsed="0.004936"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:13.363128" elapsed="0.004981"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:17:13.369156" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:17:13.368633" elapsed="0.000552"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:17:13.369234" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:17:13.369394" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:17:13.368344" elapsed="0.001074"/>
</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-04-17T03:17:13.369588" elapsed="0.000436"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:17:13.370304" level="INFO">index=13
host=10.30.170.120
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-04-17T03:17:13.370410" level="INFO">${karaf_connection_object} = index=13
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:17:13.370196" elapsed="0.000243"/>
</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-04-17T03:17:13.370588" elapsed="0.002369"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:17:13.373384" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:17:13.374621" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:17:13.373124" elapsed="0.001901">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:13.378522" elapsed="0.000713"/>
</kw>
<kw name="Open 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-04-17T03:17:13.379483" elapsed="0.000437"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:17:13.380169" elapsed="0.000177"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:17:13.375830" elapsed="0.004596"/>
</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-04-17T03:17:13.375316" elapsed="0.005157"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:17:13.359892" elapsed="0.020667">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:13.380923" elapsed="0.000041"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:17:13.381012" 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="FAIL" start="2026-04-17T03:17:13.345849" elapsed="0.035270">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:17:13.381226" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:17:13.381270" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:13.339531" elapsed="0.041762"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:13.381670" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:13.381371" elapsed="0.000354"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:13.381352" elapsed="0.000397"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:17:13.339389" elapsed="0.042385"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:17:13.339215" elapsed="0.042591"/>
</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-04-17T03:17:13.336960" elapsed="0.044903"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-17T03:17:13.330338" elapsed="0.051581"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:13.329864" elapsed="0.052123"/>
</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-04-17T03:17:09.405025" elapsed="3.977015"/>
</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-04-17T03:17:13.382190" elapsed="0.000180"/>
</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-04-17T03:17:13.382719" elapsed="0.000243"/>
</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-04-17T03:17:13.384623" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:17:13.384701" 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-04-17T03:17:13.384345" elapsed="0.000379"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:13.384909" elapsed="0.000334"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:17:13.386315" level="INFO">Logging into '10.30.171.238:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:17:13.767966" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 17 03:16:33 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:16:35 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:17:13.385871" elapsed="0.382271"/>
</kw>
<msg time="2026-04-17T03:17:13.768232" 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-04-17T03:17:13.385455" elapsed="0.382863"/>
</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-04-17T03:17:13.383892" elapsed="0.384547"/>
</kw>
<msg time="2026-04-17T03:17:13.768493" 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-04-17T03:17:13.383496" elapsed="0.385045"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-17T03:17:13.383162" elapsed="0.385457"/>
</kw>
<doc>Create a session for BGP peer.</doc>
<status status="PASS" start="2026-04-17T03:17:13.382508" elapsed="0.386164"/>
</kw>
<kw name="Require_Python" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:17:13.770557" level="INFO">Executing command 'python3 --help'.</msg>
<msg time="2026-04-17T03:17:13.783508" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:17:13.783690" 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-04-17T03:17:13.783756" level="INFO">${stderr} = </msg>
<msg time="2026-04-17T03:17:13.783816" 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-04-17T03:17:13.770039" elapsed="0.013809"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:17:13.785359" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-04-17T03:17:13.784856" elapsed="0.000594"/>
</kw>
<msg time="2026-04-17T03:17:13.785674" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-04-17T03:17:13.785773" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:13.784151" elapsed="0.001674"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:13.787299" 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-04-17T03:17:13.786246" elapsed="0.001117"/>
</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-04-17T03:17:13.788592" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:13.787713" elapsed="0.001028"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:13.787662" elapsed="0.001140"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-04-17T03:17:13.789239" elapsed="0.000073"/>
</return>
<status status="PASS" start="2026-04-17T03:17:13.788960" elapsed="0.000430"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:13.788894" elapsed="0.000552"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-04-17T03:17:13.789678" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:13.789598" elapsed="0.000171"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:13.789558" elapsed="0.000262"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:13.790188" elapsed="0.000051"/>
</kw>
<msg time="2026-04-17T03:17:13.790547" 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-04-17T03:17:13.769640" elapsed="0.020971"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-04-17T03:17:13.791033" elapsed="0.000060"/>
</return>
<status status="PASS" start="2026-04-17T03:17:13.790769" elapsed="0.000390"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:13.790731" elapsed="0.000483"/>
</if>
<kw name="Fatal Error" owner="BuiltIn">
<arg>Python 3 is not installed!</arg>
<doc>Stops the whole test execution.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:13.791539" elapsed="0.000060"/>
</kw>
<doc>Verify current SSH connection leads to machine with python working. Fatal fail otherwise.</doc>
<status status="PASS" start="2026-04-17T03:17:13.769103" elapsed="0.022631"/>
</kw>
<kw name="Assure_Library_Ipaddr" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:17:13.794273" level="INFO">Executing command 'bash -c 'cd "." &amp;&amp; python -c "import ipaddr"''.</msg>
<msg time="2026-04-17T03:17:13.906222" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:17:13.906616" level="INFO">${stdout} = </msg>
<msg time="2026-04-17T03:17:13.906728" level="INFO">${stderr} = </msg>
<msg time="2026-04-17T03:17:13.906829" 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-04-17T03:17:13.794085" elapsed="0.112801"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:17:13.909427" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-04-17T03:17:13.908543" elapsed="0.001034"/>
</kw>
<msg time="2026-04-17T03:17:13.909830" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-04-17T03:17:13.909980" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:13.907502" elapsed="0.002539"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:13.911560" 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-04-17T03:17:13.910471" elapsed="0.001153"/>
</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-04-17T03:17:13.912737" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:13.911835" elapsed="0.001058"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:13.911772" elapsed="0.001212"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-04-17T03:17:13.913456" elapsed="0.000080"/>
</return>
<status status="PASS" start="2026-04-17T03:17:13.913120" elapsed="0.000561"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:13.913083" elapsed="0.000711"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-04-17T03:17:13.914077" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:13.913986" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:13.913908" elapsed="0.000318"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:13.914525" elapsed="0.000034"/>
</kw>
<msg time="2026-04-17T03:17:13.914762" 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-04-17T03:17:13.793442" elapsed="0.121371"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-04-17T03:17:13.915125" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-04-17T03:17:13.914977" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:13.914914" elapsed="0.000328"/>
</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-04-17T03:17:13.915478" elapsed="0.000033"/>
</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-04-17T03:17:13.792327" elapsed="0.123277"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-04-17T03:17:13.952605" level="INFO">[chan 3] Opened sftp connection (server version 3)</msg>
<msg time="2026-04-17T03:17:13.968331" 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-04-17T03:17:13.915833" elapsed="0.052728"/>
</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-04-17T03:17:13.969379" elapsed="0.000413"/>
</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-04-17T03:17:13.972820" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:17:13.972965" 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-04-17T03:17:13.972394" elapsed="0.000611"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:13.973253" elapsed="0.000551"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:17:13.975133" level="INFO">Logging into '10.30.171.238:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:17:14.307817" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 17 03:16:33 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:17:13 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:17:13.974633" elapsed="0.333371"/>
</kw>
<msg time="2026-04-17T03:17:14.308110" 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-04-17T03:17:13.974086" elapsed="0.334105"/>
</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-04-17T03:17:13.971389" elapsed="0.336914"/>
</kw>
<msg time="2026-04-17T03:17:14.308357" 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-04-17T03:17:13.970686" elapsed="0.337719"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-17T03:17:13.970122" elapsed="0.338376"/>
</kw>
<doc>Create a session for BGP peer.</doc>
<status status="PASS" start="2026-04-17T03:17:13.968886" elapsed="0.339685"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-04-17T03:17:14.317212" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-04-17T03:17:14.327570" 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-04-17T03:17:14.308843" elapsed="0.018903"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-04-17T03:17:14.339536" 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-04-17T03:17:14.339615" 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-04-17T03:17:14.328247" elapsed="0.011451"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:17:14.340578" level="INFO">Creating Session using : alias=session, url=http://10.30.170.120:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a4424c1b150&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-04-17T03:17:14.340028" elapsed="0.000778"/>
</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-04-17T03:17:09.404586" elapsed="4.936323"/>
</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-04-17T03:17:14.346590" elapsed="0.000416"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:17:14.346157" elapsed="0.000932"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:17:14.348601" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:14.348413" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:14.348381" elapsed="0.000322"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:17:14.356781" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:14.356647" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:14.356620" elapsed="0.000336"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:14.358145" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:17:14.357640" elapsed="0.000534"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:17:14.358649" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:17:14.358338" elapsed="0.000337"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:17:14.358720" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:17:14.358893" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:17:14.357244" 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-04-17T03:17:14.365259" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:14.365144" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:14.365123" elapsed="0.000209"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:17:14.366653" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:14.366539" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:14.366519" elapsed="0.000202"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:17:14.367224" level="INFO">${karaf_connection_index} = 13</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:17:14.366870" elapsed="0.000381"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:17:14.367630" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:17:14.367412" elapsed="0.000244"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:17:14.368452" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:17:14.368179" elapsed="0.000960">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:17:14.369328" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:17:14.369374" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:14.367814" elapsed="0.001583"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:17:14.370214" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:17:14.369965" elapsed="0.000933">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:17:14.371109" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:17:14.371155" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:14.369573" elapsed="0.001604"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:17:14.372140" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.Reconfigure_ODL_To_Accept_BGP_Peer_Connection"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:17:14.371488" elapsed="0.000718">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.Reconfigure_ODL_To_Accept_BGP_Peer_Connection"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:17:14.371253" elapsed="0.001023">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.Reconfigure_ODL_To_Accept_BGP_Peer_Connection"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:17:14.371233" elapsed="0.001266">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.Reconfigure_ODL_To_Accept_BGP_Peer_Connection"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:14.372672" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:14.372969" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:14.372761" elapsed="0.000270"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:14.372744" elapsed="0.000310"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:17:14.373089" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:17:14.375998" elapsed="0.000155"/>
</kw>
<msg time="2026-04-17T03:17:14.376222" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:14.374681" elapsed="0.001673"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:14.376689" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:14.377042" 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-04-17T03:17:14.374038" elapsed="0.003198"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:17:14.373385" elapsed="0.003918"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:17:14.366230" elapsed="0.011166">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.Reconfigure_ODL_To_Accept_BGP_Peer_Connection"</status>
</kw>
<msg time="2026-04-17T03:17:14.377512" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:17:14.377558" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.Reconfigure_ODL_To_Accept_BGP_Peer_Connection"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:14.365493" elapsed="0.012090"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:17:14.377885" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:14.377665" elapsed="0.000403"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:14.377645" elapsed="0.000472"/>
</if>
<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-04-17T03:17:14.379402" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:14.379149" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:14.379129" elapsed="0.000367"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:17:14.379883" level="INFO">index=16
host=10.30.171.238
alias=bgp_app_peer_console
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-04-17T03:17:14.380137" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.238
alias=bgp_app_peer_console
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_error...</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:17:14.379699" elapsed="0.000476"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:14.380726" level="INFO">{1: 13}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:14.380360" elapsed="0.000428"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:14.381462" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:14.381139" elapsed="0.000379"/>
</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-04-17T03:17:14.382274" elapsed="0.000346"/>
</kw>
<msg time="2026-04-17T03:17:14.382773" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:17:14.382841" level="INFO">${old_connection_index} = 13</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:14.381795" elapsed="0.001079"/>
</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-04-17T03:17:14.383916" elapsed="0.000243"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:17:14.385380" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:17:14.384865" elapsed="0.001507">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:14.384332" elapsed="0.002173"/>
</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-04-17T03:17:14.387493" elapsed="0.000464"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:14.386768" elapsed="0.001358"/>
</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-04-17T03:17:14.383308" elapsed="0.004914"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:14.383000" elapsed="0.005319"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:14.382973" elapsed="0.005390"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:17:14.389982" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:17:14.389409" elapsed="0.000615"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:17:14.390101" elapsed="0.000054"/>
</return>
<msg time="2026-04-17T03:17:14.390342" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:17:14.388762" elapsed="0.001618"/>
</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-04-17T03:17:14.390623" elapsed="0.000483"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:17:14.391473" level="INFO">index=17
host=10.30.170.120
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-04-17T03:17:14.391577" level="INFO">${karaf_connection_object} = index=17
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:17:14.391283" elapsed="0.000321"/>
</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-04-17T03:17:14.391755" elapsed="0.003400"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:17:14.395618" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:17:14.397098" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:17:14.395337" elapsed="0.002267">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:17:14.415411" elapsed="0.000430"/>
</kw>
<msg time="2026-04-17T03:17:14.415967" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:14.413595" elapsed="0.002564"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:14.416490" elapsed="0.000034"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:14.416741" elapsed="0.000040"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:17:14.398818" elapsed="0.018055"/>
</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-04-17T03:17:14.398019" elapsed="0.019411"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:17:14.378670" elapsed="0.038939">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:14.418280" elapsed="0.000037"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:17:14.418382" elapsed="0.000029"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:17:14.364768" elapsed="0.053771">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:17:14.418701" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:17:14.418761" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:14.359340" elapsed="0.059452"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:14.419286" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:14.418942" elapsed="0.000431"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:14.418896" elapsed="0.000509"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:17:14.359193" elapsed="0.060267"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:17:14.359010" elapsed="0.060499"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:17:14.356205" elapsed="0.063573"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:17:14.347972" elapsed="0.071885"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:14.347305" elapsed="0.072649"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:17:14.342403" elapsed="0.077624"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:17:14.421456" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | BGP_NAME=example-bgp-peer | IP=10.30.171.238 | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=exam...</msg>
<var>&amp;{mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</arg>
<arg>BGP_NAME=${BGP_PEER_NAME}</arg>
<arg>IP=${TOOLS_SYSTEM_IP}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB=${RIB_INSTANCE}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:17:14.420309" elapsed="0.001188"/>
</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-04-17T03:17:14.467982" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:14.467355" elapsed="0.000675"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:14.469239" 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-04-17T03:17:14.468794" elapsed="0.000552">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-04-17T03:17:14.469482" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:14.468277" elapsed="0.001241"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:14.470401" 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-04-17T03:17:14.469755" elapsed="0.000684"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:17:14.470867" 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-04-17T03:17:14.471114" 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-04-17T03:17:14.470671" elapsed="0.000479"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:14.471713" 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-04-17T03:17:14.471366" elapsed="0.000412"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:14.473251" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.238', '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-04-17T03:17:14.472850" elapsed="0.000500"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:17:14.474004" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:17:14.473568" elapsed="0.000473"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:17:14.475031" 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-04-17T03:17:14.474602" elapsed="0.000483"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:17:14.476164" 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-04-17T03:17:14.475874" elapsed="0.000318"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:17:14.476259" elapsed="0.000055"/>
</return>
<msg time="2026-04-17T03:17:14.476508" 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-04-17T03:17:14.475419" elapsed="0.001127"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:17:14.476759" elapsed="0.000366"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-04-17T03:17:14.474421" elapsed="0.002760"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:17:14.478312" 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-04-17T03:17:14.477563" elapsed="0.000787"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:17:14.479470" 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-04-17T03:17:14.479168" elapsed="0.000340"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:17:14.479589" elapsed="0.000054"/>
</return>
<msg time="2026-04-17T03:17:14.479815" 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-04-17T03:17:14.478643" 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-04-17T03:17:14.480090" elapsed="0.000300"/>
</kw>
<var name="${key}">BGP_NAME</var>
<var name="${value}">example-bgp-peer</var>
<status status="PASS" start="2026-04-17T03:17:14.477352" elapsed="0.003095"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:17:14.481336" level="INFO">${value} = 10.30.171.238</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:17:14.480801" elapsed="0.000573"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:17:14.482614" level="INFO">${encoded} = 10.30.171.238</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:17:14.482316" elapsed="0.000334"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:17:14.482720" elapsed="0.000052"/>
</return>
<msg time="2026-04-17T03:17:14.482956" level="INFO">${encoded_value} = 10.30.171.238</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:17:14.481827" elapsed="0.001162"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:17:14.483221" elapsed="0.000675"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.238</var>
<status status="PASS" start="2026-04-17T03:17:14.480612" elapsed="0.003366"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:17:14.484829" 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-04-17T03:17:14.484360" elapsed="0.000505"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:17:14.486082" 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-04-17T03:17:14.485671" elapsed="0.000449"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:17:14.486192" elapsed="0.000058"/>
</return>
<msg time="2026-04-17T03:17:14.486424" 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-04-17T03:17:14.485192" 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-04-17T03:17:14.486678" elapsed="0.000343"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:17:14.484144" elapsed="0.002931"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:17:14.487892" 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-04-17T03:17:14.487420" elapsed="0.000528"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:17:14.489089" 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-04-17T03:17:14.488747" elapsed="0.000377"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:17:14.489191" elapsed="0.000049"/>
</return>
<msg time="2026-04-17T03:17:14.489404" 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-04-17T03:17:14.488249" 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-04-17T03:17:14.489652" elapsed="0.000372"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:17:14.487234" elapsed="0.002847"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:17:14.490834" 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-04-17T03:17:14.490426" elapsed="0.000435"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:17:14.491763" 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-04-17T03:17:14.491536" elapsed="0.000254"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:17:14.491843" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:17:14.492031" 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-04-17T03:17:14.491141" 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-04-17T03:17:14.492226" elapsed="0.000241"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:17:14.490237" elapsed="0.002279"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:17:14.493166" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:17:14.492775" elapsed="0.000417"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:17:14.494025" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:17:14.493750" elapsed="0.000302"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:17:14.494103" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:17:14.494264" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:17:14.493399" 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-04-17T03:17:14.494440" elapsed="0.000237"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:17:14.492639" elapsed="0.002080"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:17:14.495300" 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-04-17T03:17:14.494996" elapsed="0.000331"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:17:14.496192" 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-04-17T03:17:14.495977" elapsed="0.000242"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:17:14.496269" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:17:14.496427" 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-04-17T03:17:14.495535" 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-04-17T03:17:14.496643" elapsed="0.000315"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:17:14.494833" elapsed="0.002182"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:17:14.497628" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:17:14.497293" elapsed="0.000368"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:17:14.498797" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:17:14.498577" elapsed="0.000248"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:17:14.498878" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:17:14.499057" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:17:14.497911" elapsed="0.001172"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:17:14.499236" elapsed="0.000274"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:17:14.497158" elapsed="0.002406"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:17:14.500363" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:17:14.499900" elapsed="0.000502"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:17:14.501438" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:17:14.501158" elapsed="0.000314"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:17:14.501541" elapsed="0.000050"/>
</return>
<msg time="2026-04-17T03:17:14.501753" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:17:14.500690" elapsed="0.001095"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:17:14.502141" elapsed="0.000344"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:17:14.499713" elapsed="0.002827"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:17:14.474115" elapsed="0.028474"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:17:14.502652" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:17:14.502886" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.238', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': ...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:17:14.472392" elapsed="0.030530"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:14.471888" elapsed="0.031098"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:14.503240" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:14.503024" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:14.471855" elapsed="0.031511"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:17:14.504622" 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-04-17T03:17:14.503577" elapsed="0.001076"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:17:14.504704" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:17:14.466386" elapsed="0.038469"/>
</kw>
<msg time="2026-04-17T03:17:14.504948" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:14.450600" elapsed="0.054408"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:17:14.518149" elapsed="0.000064"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:17:14.531513" elapsed="0.000058"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:17:14.545621" elapsed="0.000052"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:14.545972" 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-04-17T03:17:14.546178" 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-04-17T03:17:14.546625" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:14.546466" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:14.546449" 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-04-17T03:17:14.546860" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:14.547065" 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-04-17T03:17:14.547254" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:17:14.546407" elapsed="0.000905"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:17:14.546269" elapsed="0.001073"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:14.547504" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:14.547587" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:17:14.547752" 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-04-17T03:17:14.445187" elapsed="0.102594"/>
</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-04-17T03:17:14.579151" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:14.578534" elapsed="0.000663"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:14.580321" 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-04-17T03:17:14.579944" elapsed="0.000477">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-04-17T03:17:14.580554" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:14.579443" elapsed="0.001147"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:14.581369" 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-04-17T03:17:14.580821" elapsed="0.000587"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:17:14.581813" 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-04-17T03:17:14.582131" 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-04-17T03:17:14.581631" elapsed="0.000532"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:14.582622" 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-04-17T03:17:14.582344" elapsed="0.000343"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-17T03:17:14.583299" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:14.582790" elapsed="0.000585"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:17:14.583995" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.238', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': ...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:14.583566" elapsed="0.000468"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:14.583411" elapsed="0.000674"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:14.582757" elapsed="0.001360"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:17:14.585272" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.238&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflec...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:17:14.584320" elapsed="0.000986"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:17:14.585362" 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//bgp_peer.vanadium/${file_name} 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-04-17T03:17:14.576846" elapsed="0.008665"/>
</kw>
<msg time="2026-04-17T03:17:14.585579" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:14.561496" elapsed="0.024150"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:17:14.598886" elapsed="0.000058"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:17:14.613022" 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-04-17T03:17:14.625588" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:14.625825" 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-04-17T03:17:14.626186" 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-04-17T03:17:14.626614" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:14.626460" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:14.626443" 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-04-17T03:17:14.626841" 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-04-17T03:17:14.627083" 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-04-17T03:17:14.627279" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:17:14.626403" elapsed="0.000930"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:17:14.626283" elapsed="0.001079"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:14.627552" elapsed="0.000031"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:14.627648" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:17:14.627824" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.238&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflec...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:17:14.558373" elapsed="0.069483"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:14.629344" 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-04-17T03:17:14.629009" elapsed="0.000412">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-04-17T03:17:14.629521" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:14.628591" elapsed="0.000955"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:14.629881" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:14.629617" elapsed="0.000364"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:17:14.630854" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:14.630249" elapsed="0.000633"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:14.630014" elapsed="0.000906"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:14.629599" elapsed="0.001362"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:14.633300" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:17:14.631121" elapsed="0.002207"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:17:14.633381" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:17:14.633543" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:17:14.628230" elapsed="0.005338"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:14.635148" 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.238</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:14.634833" elapsed="0.000378"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:14.635616" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.238&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-04-17T03:17:14.635369" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:14.636155" 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-04-17T03:17:14.635881" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:14.636610" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:14.636358" elapsed="0.000296"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:17:14.637551" 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-04-17T03:17:14.637348" elapsed="0.000229"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:17:14.637906" 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-04-17T03:17:14.637732" elapsed="0.000236"/>
</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-04-17T03:17:14.638167" elapsed="0.000281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:14.638982" 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-04-17T03:17:14.638659" elapsed="0.000371"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:17:14.639077" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:17:14.639245" 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-04-17T03:17:14.636903" elapsed="0.002368"/>
</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-04-17T03:17:14.644725" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:17:14.846312" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:17:15.249278" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:17:15.252299" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:17:14.641455" elapsed="0.616654">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:17:14.639343" elapsed="0.618990">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:15.259011" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:15.258424" elapsed="0.000758"/>
</branch>
<status status="FAIL" start="2026-04-17T03:17:14.639325" elapsed="0.619912">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:15.259984" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:15.260207" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:15.260132" elapsed="0.000141"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:15.260105" elapsed="0.000200"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:15.260637" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:17:15.260753" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:17:14.633903" elapsed="0.627048">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:15.261072" elapsed="0.000024"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:17:14.428276" elapsed="0.832943">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:15.261677" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:15.261399" elapsed="0.000379"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:15.261374" elapsed="0.000836"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:15.262266" elapsed="0.000031"/>
</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="FAIL" start="2026-04-17T03:17:14.422156" elapsed="0.840274">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:15.265506" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:17:15.264705" elapsed="0.000903"/>
</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-04-17T03:17:15.263711" elapsed="0.002010"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-04-17T03:17:15.263046" elapsed="0.002804"/>
</kw>
<doc>Configure BGP peer module with initiate-connection set to false.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:17:14.341061" elapsed="0.924914">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:17:15.271796" elapsed="0.000362"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:17:15.271400" 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-04-17T03:17:15.273915" elapsed="0.000053"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:15.273686" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:15.273645" elapsed="0.000427"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:17:15.280445" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:15.280322" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:15.280302" elapsed="0.000221"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:15.281653" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:17:15.281186" elapsed="0.000507"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:17:15.282206" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:17:15.281870" elapsed="0.000363"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:17:15.282358" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:17:15.282578" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:17:15.280774" elapsed="0.001831"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:17:15.288747" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:15.288616" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:15.288589" elapsed="0.000239"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:17:15.290219" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:15.290105" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:15.290085" elapsed="0.000202"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:17:15.290827" level="INFO">${karaf_connection_index} = 17</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:17:15.290438" elapsed="0.000417"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:17:15.291270" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:17:15.291042" elapsed="0.000254"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:17:15.292106" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:17:15.291807" elapsed="0.000992">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:17:15.293008" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:17:15.293054" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:15.291458" elapsed="0.001637"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:17:15.293975" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:17:15.293686" elapsed="0.001200">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:17:15.295149" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:17:15.295214" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:15.293298" elapsed="0.001945"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:17:15.296419" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.Reconfigure_ODL_To_Accept_BGP_Application_Peer"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:17:15.295635" elapsed="0.000860">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.Reconfigure_ODL_To_Accept_BGP_Application_Peer"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:17:15.295339" elapsed="0.001247">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.Reconfigure_ODL_To_Accept_BGP_Application_Peer"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:17:15.295315" elapsed="0.001317">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.Reconfigure_ODL_To_Accept_BGP_Application_Peer"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:15.296842" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:15.297101" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:15.296954" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:15.296920" elapsed="0.000256"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:17:15.297210" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:17:15.300118" elapsed="0.000162"/>
</kw>
<msg time="2026-04-17T03:17:15.300380" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:15.298962" 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-04-17T03:17:15.300839" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:15.301209" 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-04-17T03:17:15.298254" elapsed="0.003144"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:17:15.297504" elapsed="0.003960"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:17:15.289710" elapsed="0.011897">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.Reconfigure_ODL_To_Accept_BGP_Application_Peer"</status>
</kw>
<msg time="2026-04-17T03:17:15.301716" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:17:15.301760" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.Reconfigure_ODL_To_Accept_BGP_Application_Peer"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:15.289020" elapsed="0.012764"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:17:15.302102" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:15.301862" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:15.301843" elapsed="0.000328"/>
</if>
<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-04-17T03:17:15.303414" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:15.303293" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:15.303275" elapsed="0.000212"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:17:15.303794" level="INFO">index=16
host=10.30.171.238
alias=bgp_app_peer_console
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-04-17T03:17:15.303902" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.238
alias=bgp_app_peer_console
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_error...</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:17:15.303654" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:15.304419" level="INFO">{1: 17}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:15.304149" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:15.304885" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:15.304616" elapsed="0.000333"/>
</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-04-17T03:17:15.305518" elapsed="0.000298"/>
</kw>
<msg time="2026-04-17T03:17:15.305915" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:17:15.305980" level="INFO">${old_connection_index} = 17</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:15.305112" elapsed="0.000891"/>
</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-04-17T03:17:15.306866" elapsed="0.000295"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:17:15.308246" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:17:15.307812" elapsed="0.001342">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:15.307331" elapsed="0.001924"/>
</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-04-17T03:17:15.309894" elapsed="0.000295"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:15.309428" elapsed="0.000866"/>
</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-04-17T03:17:15.306300" elapsed="0.004043"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:15.306078" elapsed="0.004314"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:15.306061" elapsed="0.004357"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:17:15.311543" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:17:15.311222" elapsed="0.000348"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:17:15.311663" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:17:15.311845" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:17:15.310728" elapsed="0.001142"/>
</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-04-17T03:17:15.312047" elapsed="0.000451"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:17:15.312817" level="INFO">index=18
host=10.30.170.120
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-04-17T03:17:15.312940" level="INFO">${karaf_connection_object} = index=18
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:17:15.312680" elapsed="0.000289"/>
</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-04-17T03:17:15.313170" elapsed="0.022075"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:17:15.335848" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:17:15.337408" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:17:15.335516" elapsed="0.002361">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:17:15.354492" elapsed="0.000515"/>
</kw>
<msg time="2026-04-17T03:17:15.355120" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:15.352915" elapsed="0.002372"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:15.355459" elapsed="0.000036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:15.355707" elapsed="0.000030"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:17:15.339008" elapsed="0.016825"/>
</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-04-17T03:17:15.338251" elapsed="0.017652"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:17:15.302890" elapsed="0.053769">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:15.357246" elapsed="0.000039"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:17:15.357360" elapsed="0.000030"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:17:15.288216" elapsed="0.069313">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:17:15.357697" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:17:15.357761" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:15.283016" elapsed="0.074779"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:15.358390" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:15.357916" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:15.357888" elapsed="0.000623"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:17:15.282852" elapsed="0.075694"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:17:15.282667" elapsed="0.076008"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:17:15.279905" elapsed="0.078865"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:17:15.273152" elapsed="0.085703"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:15.272457" elapsed="0.086466"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:17:15.267877" elapsed="0.091154"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:17:15.360109" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | NAME=example-bgp-peer-app | RIB_INSTANCE_NAME=example-bgp-rib | IP=10.30.170.120 | 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-04-17T03:17:15.359397" elapsed="0.000742"/>
</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-04-17T03:17:15.399005" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:15.398501" elapsed="0.000538"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:15.399840" 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-04-17T03:17:15.399565" elapsed="0.000450">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-04-17T03:17:15.400115" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:15.399215" elapsed="0.000926"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:15.400706" 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-04-17T03:17:15.400308" elapsed="0.000425"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:17:15.401054" 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-04-17T03:17:15.401222" 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-04-17T03:17:15.400895" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:15.401653" 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-04-17T03:17:15.401404" 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-04-17T03:17:15.402766" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer-app', 'RIB_INSTANCE_NAME': 'example-bgp-rib', 'IP': '10.30.170.120', '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-04-17T03:17:15.402477" elapsed="0.000334"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:17:15.403255" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:17:15.402986" elapsed="0.000295"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:17:15.403967" 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-04-17T03:17:15.403649" elapsed="0.000345"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:17:15.404721" 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-04-17T03:17:15.404501" elapsed="0.000246"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:17:15.404800" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:17:15.404974" 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-04-17T03:17:15.404186" elapsed="0.000813"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:17:15.405152" elapsed="0.000239"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-04-17T03:17:15.403514" elapsed="0.001917"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:17:15.406008" 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-04-17T03:17:15.405677" elapsed="0.000358"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:17:15.407351" 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-04-17T03:17:15.406813" elapsed="0.000597"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:17:15.407480" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:17:15.407631" 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-04-17T03:17:15.406247" 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-04-17T03:17:15.407807" elapsed="0.000238"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">example-bgp-peer-app</var>
<status status="PASS" start="2026-04-17T03:17:15.405545" elapsed="0.002541"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:17:15.408641" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:17:15.408330" elapsed="0.000337"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:17:15.409398" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:17:15.409187" elapsed="0.000238"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:17:15.409486" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:17:15.409659" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:17:15.408854" 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-04-17T03:17:15.409875" elapsed="0.000317"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:17:15.408198" elapsed="0.002037"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:17:15.411145" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:17:15.410514" elapsed="0.000659"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:17:15.411937" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:17:15.411698" elapsed="0.000269"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:17:15.412022" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:17:15.412185" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:17:15.411367" 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-04-17T03:17:15.412379" elapsed="0.000241"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:17:15.410357" elapsed="0.002307"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:17:15.413272" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:17:15.412951" elapsed="0.000348"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:17:15.414102" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:17:15.413857" elapsed="0.000273"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:17:15.414184" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:17:15.414345" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:17:15.413509" 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-04-17T03:17:15.414540" elapsed="0.000300"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:17:15.412786" elapsed="0.002097"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:17:15.403335" elapsed="0.011585"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:17:15.414983" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:17:15.415154" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer-app', 'RIB_INSTANCE_NAME': 'example-bgp-rib', 'IP': '10.30.170.120', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:17:15.402148" elapsed="0.013033"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:15.401778" elapsed="0.013438"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:15.415417" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:15.415246" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:15.401754" elapsed="0.013750"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:17:15.416602" 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-04-17T03:17:15.415861" elapsed="0.000772"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:17:15.416684" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_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-04-17T03:17:15.397773" elapsed="0.019043"/>
</kw>
<msg time="2026-04-17T03:17:15.416877" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:15.381087" elapsed="0.035860"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:17:15.430712" 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//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-04-17T03:17:15.443631" elapsed="0.000039"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_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-04-17T03:17:15.456956" elapsed="0.000075"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:15.457312" 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-04-17T03:17:15.457513" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:15.458041" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:15.457836" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:15.457816" 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-04-17T03:17:15.458311" 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-04-17T03:17:15.458505" 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-04-17T03:17:15.458760" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:17:15.457771" elapsed="0.001048"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:17:15.457608" elapsed="0.001238"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:15.459017" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:15.459101" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:17:15.459280" 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-04-17T03:17:15.376278" elapsed="0.083036"/>
</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-04-17T03:17:15.488917" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:15.488514" elapsed="0.000461"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:15.489778" 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-04-17T03:17:15.489493" elapsed="0.000364">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-04-17T03:17:15.489971" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:15.489152" elapsed="0.000845"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:15.490553" 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-04-17T03:17:15.490163" elapsed="0.000417"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:17:15.491029" 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-04-17T03:17:15.491218" 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-04-17T03:17:15.490835" elapsed="0.000464"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:15.491778" 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-04-17T03:17:15.491495" elapsed="0.000334"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-17T03:17:15.492263" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:15.491909" elapsed="0.000415"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:17:15.492798" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer-app', 'RIB_INSTANCE_NAME': 'example-bgp-rib', 'IP': '10.30.170.120', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:15.492499" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:15.492351" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:15.491885" elapsed="0.000998"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:17:15.494067" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.120&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-04-17T03:17:15.493048" elapsed="0.001052"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:17:15.494154" 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//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-04-17T03:17:15.487840" elapsed="0.006467"/>
</kw>
<msg time="2026-04-17T03:17:15.494367" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:15.473029" elapsed="0.021398"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:17:15.511136" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:17:15.526206" 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/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-04-17T03:17:15.539060" elapsed="0.000044"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:15.539328" 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-04-17T03:17:15.539515" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:15.539965" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:15.539790" elapsed="0.000234"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:15.539773" elapsed="0.000281"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:15.540201" 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-04-17T03:17:15.540369" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:15.540621" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:17:15.539732" elapsed="0.000944"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:17:15.539603" elapsed="0.001103"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:15.540855" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:15.540950" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:17:15.541117" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.120&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-04-17T03:17:15.469879" elapsed="0.071269"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:15.542613" 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-04-17T03:17:15.542305" elapsed="0.000383">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-04-17T03:17:15.542849" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:15.541879" elapsed="0.001016"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:15.543254" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:15.542989" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:17:15.544058" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:15.543516" elapsed="0.000569"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:15.543334" elapsed="0.000788"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:15.542969" elapsed="0.001174"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:15.546506" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:17:15.544297" elapsed="0.002236"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:17:15.546585" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:17:15.546908" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:17:15.541519" elapsed="0.005492"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:15.549158" 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.120</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:15.548714" elapsed="0.000515"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:15.549917" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.120&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-04-17T03:17:15.549525" elapsed="0.000492"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:15.550784" 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-04-17T03:17:15.550299" elapsed="0.000564"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:15.551483" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:15.551114" elapsed="0.000459"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:17:15.552906" 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-04-17T03:17:15.552596" elapsed="0.000372"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:17:15.553463" 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-04-17T03:17:15.553205" elapsed="0.000296"/>
</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-04-17T03:17:15.553722" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:15.554683" 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-04-17T03:17:15.554304" elapsed="0.000600"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:17:15.554994" elapsed="0.000050"/>
</return>
<msg time="2026-04-17T03:17:15.555244" 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-04-17T03:17:15.551956" elapsed="0.003326"/>
</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-04-17T03:17:15.560850" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:17:15.762804" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:17:16.165320" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:17:16.167665" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:17:15.557594" elapsed="0.613373">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:17:15.555389" elapsed="0.615728">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:16.171509" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:16.171182" elapsed="0.000429"/>
</branch>
<status status="FAIL" start="2026-04-17T03:17:15.555362" elapsed="0.616286">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:16.172380" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:16.172629" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:16.172549" elapsed="0.000171"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:16.172506" elapsed="0.000259"/>
</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-04-17T03:17:16.173113" elapsed="0.000045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:17:16.173250" elapsed="0.000031"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:17:15.547386" elapsed="0.626089">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:16.173627" elapsed="0.000034"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:17:15.365170" elapsed="0.808656">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:16.174536" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:16.174163" elapsed="0.000508"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:16.174129" elapsed="0.000592"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:16.174790" elapsed="0.000030"/>
</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="FAIL" start="2026-04-17T03:17:15.360415" elapsed="0.814605">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:16.177906" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:17:16.177427" elapsed="0.000566"/>
</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-04-17T03:17:16.176789" elapsed="0.001282"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-04-17T03:17:16.175659" elapsed="0.002496"/>
</kw>
<doc>Configure BGP application peer module.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:17:15.266797" elapsed="0.911416">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:17:16.183150" elapsed="0.000315"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:17:16.182748" elapsed="0.000795"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:17:16.185046" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:16.184851" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:16.184822" elapsed="0.000324"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:17:16.192375" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:16.192211" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:16.192182" elapsed="0.000296"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:16.194016" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:17:16.193410" elapsed="0.000647"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:17:16.194726" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:17:16.194294" elapsed="0.000469"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:17:16.194825" elapsed="0.000052"/>
</return>
<msg time="2026-04-17T03:17:16.195081" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:17:16.192840" elapsed="0.002277"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:17:16.202381" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:16.202264" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:16.202243" elapsed="0.000209"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:17:16.203651" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:16.203544" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:16.203526" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:17:16.204367" level="INFO">${karaf_connection_index} = 18</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:17:16.204012" elapsed="0.000383"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:17:16.204788" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:17:16.204563" elapsed="0.000251"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:17:16.205626" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:17:16.205348" elapsed="0.000959">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:17:16.206497" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:17:16.206544" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:16.204995" elapsed="0.001573"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:17:16.207348" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:17:16.207104" elapsed="0.000945">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:17:16.208267" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:17:16.208322" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:16.206737" elapsed="0.001614"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:17:16.209296" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.Check_For_Empty_Example-IPv4-Topology"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:17:16.208657" elapsed="0.000702">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.Check_For_Empty_Example-IPv4-Topology"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:17:16.208429" elapsed="0.001000">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.Check_For_Empty_Example-IPv4-Topology"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:17:16.208411" elapsed="0.001051">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.Check_For_Empty_Example-IPv4-Topology"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:16.209625" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:16.209851" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:16.209710" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:16.209694" elapsed="0.000235"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:17:16.209977" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:17:16.212725" elapsed="0.000149"/>
</kw>
<msg time="2026-04-17T03:17:16.212977" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:16.211429" elapsed="0.001683"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:16.213384" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:16.213719" 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-04-17T03:17:16.210798" elapsed="0.003111"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:17:16.210257" elapsed="0.003737"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:17:16.203240" elapsed="0.010839">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.Check_For_Empty_Example-IPv4-Topology"</status>
</kw>
<msg time="2026-04-17T03:17:16.214184" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:17:16.214227" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.Check_For_Empty_Example-IPv4-Topology"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:16.202609" elapsed="0.011642"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:17:16.214433" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:16.214326" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:16.214308" elapsed="0.000193"/>
</if>
<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-04-17T03:17:16.215517" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:16.215409" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:16.215391" elapsed="0.000228"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:17:16.215903" level="INFO">index=16
host=10.30.171.238
alias=bgp_app_peer_console
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-04-17T03:17:16.216056" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.238
alias=bgp_app_peer_console
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_error...</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:17:16.215779" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:16.216598" level="INFO">{1: 18}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:16.216256" elapsed="0.000389"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:16.217116" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:16.216797" elapsed="0.000363"/>
</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-04-17T03:17:16.217687" elapsed="0.000279"/>
</kw>
<msg time="2026-04-17T03:17:16.218067" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:17:16.218113" level="INFO">${old_connection_index} = 18</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:16.217319" elapsed="0.000816"/>
</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-04-17T03:17:16.218954" elapsed="0.000193"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:17:16.220301" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:17:16.219792" elapsed="0.001492">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:16.219317" elapsed="0.002066"/>
</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-04-17T03:17:16.222039" elapsed="0.000277"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:16.221557" elapsed="0.000841"/>
</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-04-17T03:17:16.218432" elapsed="0.004011"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:16.218210" elapsed="0.004281"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:16.218192" elapsed="0.004323"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:17:16.223375" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:17:16.223065" elapsed="0.000336"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:17:16.223448" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:17:16.223598" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:17:16.222720" elapsed="0.000902"/>
</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-04-17T03:17:16.223776" elapsed="0.000466"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:17:16.224517" level="INFO">index=19
host=10.30.170.120
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-04-17T03:17:16.224616" level="INFO">${karaf_connection_object} = index=19
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:17:16.224411" elapsed="0.000230"/>
</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-04-17T03:17:16.224799" elapsed="0.002429"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:17:16.227657" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:17:16.229070" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:17:16.227395" elapsed="0.002282">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:17:16.243682" elapsed="0.000807"/>
</kw>
<msg time="2026-04-17T03:17:16.244593" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:16.242218" elapsed="0.002537"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:16.244918" elapsed="0.000039"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:16.245168" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:17:16.230494" elapsed="0.014759"/>
</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-04-17T03:17:16.229977" elapsed="0.015325"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:17:16.215114" elapsed="0.030278">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:16.245785" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:17:16.245863" 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="FAIL" start="2026-04-17T03:17:16.201888" elapsed="0.044105">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:17:16.246106" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:17:16.246150" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:16.195669" elapsed="0.050504"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:16.246516" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:16.246254" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:16.246235" elapsed="0.000359"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:17:16.195459" elapsed="0.051158"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:17:16.195202" elapsed="0.051448"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:17:16.191597" elapsed="0.055112"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:17:16.184437" elapsed="0.062328"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:17:16.183762" elapsed="0.063047"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:17:16.179502" elapsed="0.067361"/>
</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-04-17T03:17:16.299955" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:16.299521" elapsed="0.000471"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:16.300993" 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-04-17T03:17:16.300530" elapsed="0.000541">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-04-17T03:17:16.301166" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:16.300170" elapsed="0.001021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:16.301746" 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-04-17T03:17:16.301358" elapsed="0.000415"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:17:16.302107" 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-04-17T03:17:16.302295" 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-04-17T03:17:16.301961" elapsed="0.000360"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:16.302727" 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-04-17T03:17:16.302477" 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-04-17T03:17:16.304083" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:16.303617" elapsed="0.000529"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:17:16.304717" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:17:16.304351" elapsed="0.000392"/>
</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-04-17T03:17:16.305163" 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-04-17T03:17:16.305890" elapsed="0.000082"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:17:16.306260" elapsed="0.000044"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:17:16.304973" elapsed="0.001450"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:17:16.304796" elapsed="0.001693"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:17:16.306539" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:17:16.306712" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:17:16.303257" elapsed="0.003479"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:16.302849" elapsed="0.003919"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:16.306957" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:16.306792" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:16.302825" elapsed="0.004208"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:17:16.307627" 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-04-17T03:17:16.307174" elapsed="0.000480"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:17:16.307701" 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-04-17T03:17:16.298836" elapsed="0.008987"/>
</kw>
<msg time="2026-04-17T03:17:16.307876" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:16.285942" elapsed="0.021999"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:17:16.320688" elapsed="0.000044"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:17:16.333456" elapsed="0.000045"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:17:16.346643" elapsed="0.000046"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:16.346982" 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-04-17T03:17:16.347229" 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-04-17T03:17:16.347765" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:16.347575" elapsed="0.000325"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:16.347552" elapsed="0.000393"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:16.348112" 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-04-17T03:17:16.348360" 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-04-17T03:17:16.348537" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:17:16.347500" elapsed="0.001089"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:17:16.347337" elapsed="0.001282"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:16.348768" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:16.348848" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:17:16.349026" 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-04-17T03:17:16.281573" elapsed="0.067482"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:16.350517" 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-04-17T03:17:16.350206" elapsed="0.000388">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-04-17T03:17:16.350687" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:16.349769" elapsed="0.000942"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:16.351060" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:16.350780" elapsed="0.000337"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:17:16.351621" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:16.351324" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:16.351141" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:16.350762" elapsed="0.000939"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:16.354116" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:17:16.351851" elapsed="0.002291"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:17:16.354192" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:17:16.354349" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:17:16.349410" elapsed="0.004964"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:16.355603" 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-04-17T03:17:16.355362" elapsed="0.000306">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-04-17T03:17:16.355760" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:16.355023" elapsed="0.000762"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:17:16.356005" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:17:16.355853" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:16.355835" elapsed="0.000255"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:16.356241" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:16.356431" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:17:16.356498" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:17:16.358762" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:17:16.354682" elapsed="0.004106"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:16.360261" 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-04-17T03:17:16.360005" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:16.360746" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:16.360503" 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-04-17T03:17:16.366012" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:16.567731" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:16.984290" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:16.986712" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:17:16.362985" elapsed="0.627062">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:17:16.360853" elapsed="0.629352">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:16.990608" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:16.990270" elapsed="0.000437"/>
</branch>
<status status="FAIL" start="2026-04-17T03:17:16.360836" elapsed="0.629905">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:16.991399" elapsed="0.000040"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:16.991602" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:16.991546" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:16.991517" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:16.991900" elapsed="0.000050"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:17:16.992020" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:17:16.359169" elapsed="0.633018">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:16.992348" elapsed="0.000035"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:17:16.258579" elapsed="0.733953">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:16.993004" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:16.992714" elapsed="0.000455"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:16.992687" elapsed="0.000521"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:16.993256" elapsed="0.000020"/>
</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="FAIL" start="2026-04-17T03:17:16.252295" elapsed="0.741107">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:17:16.247895" elapsed="0.745663">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:17:18.087175" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:18.086668" elapsed="0.000541"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:18.088188" 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-04-17T03:17:18.087747" elapsed="0.000520">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-04-17T03:17:18.088414" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:18.087389" elapsed="0.001050"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:18.089043" 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-04-17T03:17:18.088619" elapsed="0.000451"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:17:18.089378" 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-04-17T03:17:18.089575" 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-04-17T03:17:18.089233" elapsed="0.000368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:18.090030" 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-04-17T03:17:18.089760" 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-04-17T03:17:18.091364" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:18.090888" elapsed="0.000537"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:17:18.091971" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:17:18.091592" elapsed="0.000405"/>
</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-04-17T03:17:18.092460" elapsed="0.000048"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:18.093260" elapsed="0.000053"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:17:18.093623" elapsed="0.000046"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:17:18.092218" elapsed="0.001575"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:17:18.092052" elapsed="0.001808"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:17:18.093912" elapsed="0.000057"/>
</return>
<msg time="2026-04-17T03:17:18.094108" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:17:18.090528" elapsed="0.003605"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:18.090157" elapsed="0.004009"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:18.094337" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:18.094191" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:18.090132" elapsed="0.004279"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:17:18.095152" 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-04-17T03:17:18.094552" elapsed="0.000628"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:17:18.095317" 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-04-17T03:17:18.085881" elapsed="0.009565"/>
</kw>
<msg time="2026-04-17T03:17:18.095502" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:18.059783" elapsed="0.035771"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:17:18.109728" 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-04-17T03:17:18.122248" 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-04-17T03:17:18.135921" elapsed="0.000072"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:18.136232" 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-04-17T03:17:18.136455" 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-04-17T03:17:18.136951" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:18.136778" elapsed="0.000232"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:18.136760" 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-04-17T03:17:18.137183" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:18.137351" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:18.137518" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:17:18.136719" elapsed="0.000851"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:17:18.136579" elapsed="0.001019"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:18.137742" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:18.137822" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:17:18.137995" 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-04-17T03:17:18.055278" elapsed="0.082746"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:18.139590" 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-04-17T03:17:18.139272" elapsed="0.000409">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-04-17T03:17:18.139789" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:18.138849" elapsed="0.000966"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:18.140174" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:18.139888" elapsed="0.000346"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:17:18.140906" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:18.140600" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:18.140258" elapsed="0.000729"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:18.139870" elapsed="0.001140"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:18.143346" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:17:18.141162" elapsed="0.002211"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:17:18.143425" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:17:18.143621" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:17:18.138388" elapsed="0.005259"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:18.145091" 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-04-17T03:17:18.144838" elapsed="0.000318">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-04-17T03:17:18.145249" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:18.144496" elapsed="0.000778"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:17:18.145480" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-17T03:17:18.145344" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:18.145326" elapsed="0.000239"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:18.145713" 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-04-17T03:17:18.145883" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:17:18.145966" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:17:18.148084" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:17:18.144132" elapsed="0.003985"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:18.149813" 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-04-17T03:17:18.149527" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:18.150326" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:18.150038" elapsed="0.000344"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:17:18.155893" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:18.357772" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:18.760316" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:18.763192" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:17:18.152849" elapsed="0.615637">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:17:18.150467" elapsed="0.618361">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:18.769444" elapsed="0.000058"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:18.768920" elapsed="0.000681"/>
</branch>
<status status="FAIL" start="2026-04-17T03:17:18.150445" elapsed="0.619208">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:18.770645" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:18.770827" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:18.770766" elapsed="0.000115"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:18.770734" elapsed="0.000169"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:18.771073" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:17:18.771144" 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-04-17T03:17:18.148569" elapsed="0.622699">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:18.771348" 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-04-17T03:17:18.027461" elapsed="0.743986">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:18.771733" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:18.771540" elapsed="0.000271"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:18.771524" elapsed="0.000319"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:18.771886" elapsed="0.000015"/>
</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="FAIL" start="2026-04-17T03:17:18.003528" elapsed="0.768480">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:17:17.994290" elapsed="0.777825">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:17:19.847041" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:19.846564" elapsed="0.000513"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:19.848117" 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-04-17T03:17:19.847613" elapsed="0.000686">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-04-17T03:17:19.848401" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:19.847257" elapsed="0.001170"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:19.849017" 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-04-17T03:17:19.848599" elapsed="0.000446"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:17:19.849356" 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-04-17T03:17:19.849530" 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-04-17T03:17:19.849212" elapsed="0.000345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:19.849992" 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-04-17T03:17:19.849723" 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-04-17T03:17:19.851268" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:19.850796" elapsed="0.000535"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:17:19.851858" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:17:19.851494" elapsed="0.000390"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:19.852366" elapsed="0.000047"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:19.853135" 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-04-17T03:17:19.853474" elapsed="0.000045"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:17:19.852155" elapsed="0.001490"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:17:19.851953" elapsed="0.001759"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:17:19.853763" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:17:19.853955" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:17:19.850445" elapsed="0.003536"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:19.850117" elapsed="0.003898"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:19.854188" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:19.854039" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:19.850093" elapsed="0.004170"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:17:19.854850" 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-04-17T03:17:19.854405" elapsed="0.000473"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:17:19.854941" 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-04-17T03:17:19.845892" elapsed="0.009177"/>
</kw>
<msg time="2026-04-17T03:17:19.855123" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:19.832844" elapsed="0.022330"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:17:19.868178" 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-04-17T03:17:19.880744" elapsed="0.000043"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:17:19.893516" elapsed="0.000047"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:19.893790" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:19.893998" 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-04-17T03:17:19.894431" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:19.894278" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:19.894260" 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-04-17T03:17:19.894658" 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-04-17T03:17:19.894826" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:19.895010" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:17:19.894220" elapsed="0.000845"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:17:19.894086" elapsed="0.001007"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:19.895240" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:19.895319" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:17:19.895474" 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-04-17T03:17:19.827044" elapsed="0.068458"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:19.897083" 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-04-17T03:17:19.896765" elapsed="0.000397">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-04-17T03:17:19.897259" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:19.896325" elapsed="0.000959"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:19.897625" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:19.897356" elapsed="0.000327"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:17:19.898208" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:19.897891" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:19.897708" elapsed="0.000562"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:19.897338" elapsed="0.000953"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:19.900735" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:17:19.898457" elapsed="0.002305"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:17:19.900815" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:17:19.900993" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:17:19.895864" elapsed="0.005154"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:19.902342" 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-04-17T03:17:19.902095" elapsed="0.000314">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-04-17T03:17:19.902504" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:19.901738" elapsed="0.000791"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:17:19.902738" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:17:19.902600" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:19.902582" elapsed="0.000240"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:19.902985" 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-04-17T03:17:19.903161" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:17:19.903227" elapsed="0.000014"/>
</return>
<msg time="2026-04-17T03:17:19.905417" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:17:19.901399" elapsed="0.004046"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:19.906889" 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-04-17T03:17:19.906627" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:19.907409" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:19.907116" elapsed="0.000338"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:17:19.912723" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:20.114640" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:20.517439" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:20.520325" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:17:19.909720" elapsed="0.614729">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:17:19.907522" elapsed="0.617122">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:20.525192" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:20.524728" elapsed="0.000627"/>
</branch>
<status status="FAIL" start="2026-04-17T03:17:19.907504" elapsed="0.617899">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:20.526313" elapsed="0.000051"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:20.526611" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:20.526531" elapsed="0.000154"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:20.526485" elapsed="0.000231"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:20.527146" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:17:20.527326" elapsed="0.000024"/>
</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-04-17T03:17:19.905775" elapsed="0.621726">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:20.527612" 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-04-17T03:17:19.801849" elapsed="0.725911">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:20.528315" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:20.527981" elapsed="0.000471"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:20.527925" elapsed="0.000570"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:20.528555" 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="FAIL" start="2026-04-17T03:17:19.793741" elapsed="0.735003">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:17:19.783373" elapsed="0.745529">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:17:21.595906" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:21.595433" elapsed="0.000530"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:21.596891" 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-04-17T03:17:21.596494" elapsed="0.000500">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-04-17T03:17:21.597094" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:21.596146" elapsed="0.000972"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:21.597679" 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-04-17T03:17:21.597288" elapsed="0.000419"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:17:21.598034" 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-04-17T03:17:21.598197" 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-04-17T03:17:21.597872" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:21.598632" 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-04-17T03:17:21.598381" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:21.599985" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:21.599518" elapsed="0.000531"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:17:21.600577" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:17:21.600217" elapsed="0.000451"/>
</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-04-17T03:17:21.601107" 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-04-17T03:17:21.601832" 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-04-17T03:17:21.602201" elapsed="0.000046"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:17:21.600900" elapsed="0.001469"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:17:21.600731" elapsed="0.001705"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:17:21.602489" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:17:21.602666" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:17:21.599136" elapsed="0.003555"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:21.598757" elapsed="0.003966"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:21.602897" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:21.602749" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:21.598732" elapsed="0.004258"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:17:21.603918" 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-04-17T03:17:21.603134" elapsed="0.000829"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:17:21.604024" 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-04-17T03:17:21.594614" elapsed="0.009545"/>
</kw>
<msg time="2026-04-17T03:17:21.604219" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:21.580715" elapsed="0.023557"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:17:21.617150" elapsed="0.000059"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:17:21.631057" 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/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-04-17T03:17:21.643587" elapsed="0.000040"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:21.643846" 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-04-17T03:17:21.644044" 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-04-17T03:17:21.644462" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:21.644311" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:21.644293" 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-04-17T03:17:21.644689" 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-04-17T03:17:21.644974" 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-04-17T03:17:21.645145" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:17:21.644253" elapsed="0.000946"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:17:21.644130" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:21.645374" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:21.645454" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:17:21.645610" 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-04-17T03:17:21.575294" elapsed="0.070344"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:21.647088" 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-04-17T03:17:21.646767" elapsed="0.000399">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-04-17T03:17:21.647262" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:21.646358" elapsed="0.000928"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:21.647685" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:21.647358" elapsed="0.000385"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:17:21.648269" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:21.647969" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:21.647768" elapsed="0.000561"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:21.647339" elapsed="0.001011"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:21.650680" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:17:21.648501" elapsed="0.002206"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:17:21.650759" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:17:21.650918" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:17:21.645999" elapsed="0.004958"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:21.652236" 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-04-17T03:17:21.651989" elapsed="0.000313">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-04-17T03:17:21.652396" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:21.651628" elapsed="0.000792"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:17:21.652626" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:17:21.652491" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:21.652473" 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-04-17T03:17:21.652855" 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-04-17T03:17:21.653043" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:17:21.653109" elapsed="0.000014"/>
</return>
<msg time="2026-04-17T03:17:21.655194" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:17:21.651273" elapsed="0.003947"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:21.656749" 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-04-17T03:17:21.656486" elapsed="0.000368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:21.657274" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:21.657026" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:17:21.662545" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:21.864317" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:22.267131" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:22.269697" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:17:21.659448" elapsed="0.613880">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:17:21.657384" elapsed="0.616091">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:22.273844" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:22.273533" elapsed="0.000434"/>
</branch>
<status status="FAIL" start="2026-04-17T03:17:21.657365" elapsed="0.616638">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:22.274721" elapsed="0.000065"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:22.275040" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:22.274958" elapsed="0.000166"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:22.274896" elapsed="0.000265"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:22.275388" elapsed="0.000036"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:17:22.275493" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:17:21.655601" elapsed="0.620064">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:22.275806" elapsed="0.000026"/>
</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-04-17T03:17:21.544607" elapsed="0.731400">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:22.276445" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:22.276166" elapsed="0.000459"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:22.276138" elapsed="0.000535"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:22.276817" elapsed="0.000033"/>
</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="FAIL" start="2026-04-17T03:17:21.535432" elapsed="0.741611">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:17:21.529470" elapsed="0.747749">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:17:23.344878" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:23.344323" elapsed="0.000629"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:23.346078" 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-04-17T03:17:23.345579" elapsed="0.000581">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-04-17T03:17:23.346261" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:23.345172" elapsed="0.001114"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:23.346893" 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-04-17T03:17:23.346489" elapsed="0.000472"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:17:23.347347" 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-04-17T03:17:23.347520" 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-04-17T03:17:23.347190" elapsed="0.000357"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:23.348020" 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-04-17T03:17:23.347717" elapsed="0.000351"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:23.349418" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:23.348948" elapsed="0.000534"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:17:23.350071" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:17:23.349648" elapsed="0.000451"/>
</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-04-17T03:17:23.350553" elapsed="0.000048"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:23.351398" elapsed="0.000056"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:17:23.351776" elapsed="0.000049"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:17:23.350333" elapsed="0.001644"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:17:23.350158" elapsed="0.001923"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:17:23.352152" elapsed="0.000049"/>
</return>
<msg time="2026-04-17T03:17:23.352395" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:17:23.348542" elapsed="0.003882"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:23.348155" elapsed="0.004304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:23.352685" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:23.352497" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:23.348127" elapsed="0.004644"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:17:23.353579" 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-04-17T03:17:23.352970" elapsed="0.000638"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:17:23.353758" 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-04-17T03:17:23.343472" elapsed="0.010432"/>
</kw>
<msg time="2026-04-17T03:17:23.354055" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:23.329878" elapsed="0.024237"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:17:23.368225" 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-04-17T03:17:23.381678" 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/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-04-17T03:17:23.395777" elapsed="0.000040"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:23.396242" 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-04-17T03:17:23.396429" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:23.396858" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:23.396701" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:23.396684" 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-04-17T03:17:23.397100" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:23.397269" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:23.397436" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:17:23.396642" elapsed="0.000847"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:17:23.396514" elapsed="0.001003"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:23.397664" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:23.397742" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:17:23.397899" 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-04-17T03:17:23.323570" elapsed="0.074371"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:23.399720" 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-04-17T03:17:23.399417" elapsed="0.000451">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-04-17T03:17:23.400171" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:23.398739" elapsed="0.001458"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:23.400533" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:23.400268" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:17:23.401116" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:23.400800" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:23.400614" elapsed="0.000563"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:23.400249" elapsed="0.000950"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:23.404056" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:17:23.401348" elapsed="0.002737"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:17:23.404146" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:17:23.404312" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:17:23.398330" elapsed="0.006006"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:23.405655" 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-04-17T03:17:23.405382" elapsed="0.000344">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-04-17T03:17:23.405826" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:23.405037" elapsed="0.000819"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:17:23.406281" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:17:23.406140" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:23.405910" elapsed="0.000457"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:23.406514" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:23.406759" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:17:23.406826" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:17:23.408944" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:17:23.404679" elapsed="0.004293"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:23.410488" 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-04-17T03:17:23.410191" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:23.410998" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:23.410734" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:17:23.416504" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:23.618258" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:24.021644" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:24.024790" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:17:23.413208" elapsed="0.617039">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:17:23.411108" elapsed="0.619532">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:24.031282" elapsed="0.000067"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:24.030748" elapsed="0.000704"/>
</branch>
<status status="FAIL" start="2026-04-17T03:17:23.411090" elapsed="0.620418">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:24.032910" elapsed="0.000071"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:24.033166" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:24.033097" elapsed="0.000143"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:24.033068" elapsed="0.000204"/>
</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-04-17T03:17:24.033520" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:17:24.033625" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:17:23.409299" elapsed="0.624500">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:24.033916" elapsed="0.000045"/>
</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-04-17T03:17:23.293727" elapsed="0.740525">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:24.034674" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:24.034390" elapsed="0.000397"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:24.034365" elapsed="0.000456"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:24.034868" elapsed="0.000020"/>
</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="FAIL" start="2026-04-17T03:17:23.285058" elapsed="0.749978">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:17:23.278140" elapsed="0.757069">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:17:25.098523" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:25.098035" elapsed="0.000525"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:25.099580" 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-04-17T03:17:25.099145" elapsed="0.000529">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-04-17T03:17:25.099866" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:25.098750" elapsed="0.001144"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:25.100557" 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-04-17T03:17:25.100118" elapsed="0.000475"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:17:25.100944" 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-04-17T03:17:25.101109" 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-04-17T03:17:25.100773" elapsed="0.000363"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:25.101609" 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-04-17T03:17:25.101298" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:25.103186" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:25.102665" elapsed="0.000584"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:17:25.103861" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:17:25.103434" elapsed="0.000462"/>
</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-04-17T03:17:25.104358" elapsed="0.000048"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:25.105230" elapsed="0.000065"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:17:25.105625" elapsed="0.000045"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:17:25.104146" elapsed="0.001657"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:17:25.103976" elapsed="0.001895"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:17:25.105924" elapsed="0.000053"/>
</return>
<msg time="2026-04-17T03:17:25.106136" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:17:25.102238" elapsed="0.003923"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:25.101777" elapsed="0.004417"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:25.106385" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:25.106220" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:25.101750" elapsed="0.004712"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:17:25.107129" 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-04-17T03:17:25.106613" elapsed="0.000544"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:17:25.107205" 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-04-17T03:17:25.097143" elapsed="0.010187"/>
</kw>
<msg time="2026-04-17T03:17:25.107386" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:25.083770" elapsed="0.023669"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:17:25.123151" elapsed="0.000059"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:17:25.135839" 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/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-04-17T03:17:25.149478" elapsed="0.000067"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:25.149803" 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-04-17T03:17:25.150030" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:25.150472" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:25.150309" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:25.150292" 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-04-17T03:17:25.150712" 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-04-17T03:17:25.150878" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:25.151059" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:17:25.150254" elapsed="0.000858"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:17:25.150118" elapsed="0.001020"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:25.151314" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:25.151394" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:17:25.151571" 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-04-17T03:17:25.079106" elapsed="0.072493"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:25.153106" 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-04-17T03:17:25.152773" elapsed="0.000413">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-04-17T03:17:25.153282" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:25.152365" elapsed="0.000942"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:25.153680" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:25.153378" elapsed="0.000359"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:17:25.154280" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:25.153968" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:25.153761" elapsed="0.000581"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:25.153360" elapsed="0.001002"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:25.156869" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:17:25.154515" elapsed="0.002395"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:17:25.157114" elapsed="0.000079"/>
</return>
<msg time="2026-04-17T03:17:25.157520" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:17:25.152001" elapsed="0.005560"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:25.159211" 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-04-17T03:17:25.158899" elapsed="0.000386">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-04-17T03:17:25.159470" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:25.158531" elapsed="0.000965"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:17:25.159725" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:17:25.159573" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:25.159553" elapsed="0.000259"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:25.159990" 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-04-17T03:17:25.160166" elapsed="0.000035"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:17:25.160249" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:17:25.257404" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:17:25.158032" elapsed="0.099419"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:25.259741" 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-04-17T03:17:25.259321" elapsed="0.000491"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:25.260436" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:25.260061" 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-04-17T03:17:25.267607" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:25.469658" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:25.872418" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:25.875099" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:17:25.263870" elapsed="0.616891">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:17:25.260608" elapsed="0.620412">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:25.881546" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:25.881111" elapsed="0.000587"/>
</branch>
<status status="FAIL" start="2026-04-17T03:17:25.260575" elapsed="0.621174">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:25.882734" elapsed="0.000063"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:25.883003" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:25.882960" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:25.882922" elapsed="0.000331"/>
</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-04-17T03:17:25.883399" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:17:25.883468" 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-04-17T03:17:25.258034" elapsed="0.625549">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:25.883716" 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-04-17T03:17:25.053450" elapsed="0.830367">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:25.884114" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:25.883912" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:25.883895" elapsed="0.000316"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:25.884244" elapsed="0.000014"/>
</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="FAIL" start="2026-04-17T03:17:25.045471" elapsed="0.838874">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:17:25.035898" elapsed="0.848550">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:17:26.946360" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:26.945893" elapsed="0.000503"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:26.947353" 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-04-17T03:17:26.946948" elapsed="0.000482">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-04-17T03:17:26.947528" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:26.946575" elapsed="0.000978"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:26.948206" 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-04-17T03:17:26.947725" elapsed="0.000513"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:17:26.948570" 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-04-17T03:17:26.948738" 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-04-17T03:17:26.948423" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:26.949228" 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-04-17T03:17:26.948970" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:26.950555" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:26.950105" elapsed="0.000512"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:17:26.951157" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:17:26.950781" elapsed="0.000402"/>
</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-04-17T03:17:26.951588" elapsed="0.000048"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:26.952359" 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-04-17T03:17:26.952766" elapsed="0.000046"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:17:26.951399" elapsed="0.001559"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:17:26.951238" elapsed="0.001789"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:17:26.953079" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:17:26.953259" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:17:26.949716" elapsed="0.003569"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:26.949353" elapsed="0.003964"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:26.953493" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:26.953344" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:26.949328" elapsed="0.004243"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:17:26.954209" 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-04-17T03:17:26.953715" elapsed="0.000523"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:17:26.954287" 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-04-17T03:17:26.945079" elapsed="0.009335"/>
</kw>
<msg time="2026-04-17T03:17:26.954471" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:26.932089" elapsed="0.022438"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:17:26.967807" elapsed="0.000062"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:17:26.981587" 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-04-17T03:17:26.996858" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:26.997114" 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-04-17T03:17:26.997303" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:26.997721" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:26.997567" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:26.997550" 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-04-17T03:17:26.997959" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:26.998129" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:26.998296" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:17:26.997510" elapsed="0.000838"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:17:26.997389" elapsed="0.001062"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:26.998602" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:26.998681" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:17:26.998833" 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-04-17T03:17:26.927631" elapsed="0.071230"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:27.000396" 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-04-17T03:17:27.000052" elapsed="0.000426">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-04-17T03:17:27.000577" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:26.999618" 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-04-17T03:17:27.001006" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:27.000676" elapsed="0.000393"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:17:27.001580" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:27.001277" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:27.001093" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:27.000657" elapsed="0.001008"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:27.004107" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:17:27.001818" elapsed="0.002316"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:17:27.004188" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:17:27.004411" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:17:26.999252" elapsed="0.005184"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:27.005764" 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-04-17T03:17:27.005517" elapsed="0.000310">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-04-17T03:17:27.005921" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:27.005098" elapsed="0.000872"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:17:27.006180" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:17:27.006043" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:27.006024" elapsed="0.000242"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:27.006413" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:27.006586" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:17:27.006651" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:17:27.008990" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:17:27.004751" elapsed="0.004267"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:27.010443" 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-04-17T03:17:27.010185" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:27.010892" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:27.010646" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:17:27.016648" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:27.218910" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:27.621661" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:27.624240" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:17:27.013315" elapsed="0.616722">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:17:27.011020" elapsed="0.619276">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:27.630851" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:27.630393" elapsed="0.000716"/>
</branch>
<status status="FAIL" start="2026-04-17T03:17:27.011003" elapsed="0.620175">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:27.632206" elapsed="0.000066"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:27.632542" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:27.632449" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:27.632405" elapsed="0.000294"/>
</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-04-17T03:17:27.633083" elapsed="0.000423"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:17:27.633652" elapsed="0.000040"/>
</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-04-17T03:17:27.009339" elapsed="0.624568">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:27.634028" elapsed="0.000027"/>
</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-04-17T03:17:26.904490" elapsed="0.729671">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:27.634452" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:27.634261" elapsed="0.000264"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:27.634243" elapsed="0.000307"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:27.634582" elapsed="0.000014"/>
</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="FAIL" start="2026-04-17T03:17:26.895829" elapsed="0.738854">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:17:26.885303" elapsed="0.749555">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:17:28.697146" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:28.696597" elapsed="0.000597"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:28.698360" 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-04-17T03:17:28.697888" 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-04-17T03:17:28.698542" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:28.697436" elapsed="0.001132"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:28.699215" 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-04-17T03:17:28.698760" elapsed="0.000484"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:17:28.699626" 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-04-17T03:17:28.699826" 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-04-17T03:17:28.699444" elapsed="0.000416"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:28.700424" 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-04-17T03:17:28.700101" 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-04-17T03:17:28.702116" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:28.701519" elapsed="0.000668"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:17:28.702921" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:17:28.702390" elapsed="0.000587"/>
</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-04-17T03:17:28.703440" 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-04-17T03:17:28.704259" 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-04-17T03:17:28.704698" elapsed="0.000053"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:17:28.703244" elapsed="0.001665"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:17:28.703051" elapsed="0.001988"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:17:28.705102" elapsed="0.000052"/>
</return>
<msg time="2026-04-17T03:17:28.705327" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:17:28.701088" elapsed="0.004272"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:28.700590" elapsed="0.004809"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:28.705599" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:28.705427" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:28.700556" elapsed="0.005164"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:17:28.706430" 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-04-17T03:17:28.705882" elapsed="0.000579"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:17:28.706511" 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-04-17T03:17:28.695759" elapsed="0.010945"/>
</kw>
<msg time="2026-04-17T03:17:28.706857" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:28.681781" elapsed="0.025197"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:17:28.722222" elapsed="0.000089"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:17:28.736347" elapsed="0.000077"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:17:28.750684" elapsed="0.000134"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:28.751097" 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-04-17T03:17:28.751291" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:28.751723" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:28.751569" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:28.751552" 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-04-17T03:17:28.751964" 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-04-17T03:17:28.752137" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:28.752306" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:17:28.751514" elapsed="0.000845"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:17:28.751377" elapsed="0.001008"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:28.752532" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:28.752612" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:17:28.752772" 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-04-17T03:17:28.676495" elapsed="0.076306"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:28.754387" 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-04-17T03:17:28.754065" elapsed="0.000400">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-04-17T03:17:28.754562" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:28.753558" elapsed="0.001029"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:28.755043" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:28.754659" elapsed="0.000521"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:17:28.755737" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:28.755423" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:28.755207" elapsed="0.000596"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:28.754641" elapsed="0.001185"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:28.758262" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:17:28.756000" elapsed="0.002290"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:17:28.758345" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:17:28.758514" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:17:28.753194" elapsed="0.005346"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:28.759888" 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-04-17T03:17:28.759638" elapsed="0.000623">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-04-17T03:17:28.760409" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:28.759295" elapsed="0.001151"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:17:28.760758" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-04-17T03:17:28.760553" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:28.760525" elapsed="0.000360"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:28.761128" 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-04-17T03:17:28.761382" elapsed="0.000029"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:17:28.761478" elapsed="0.000022"/>
</return>
<msg time="2026-04-17T03:17:28.764715" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:17:28.758953" elapsed="0.005803"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:28.767077" 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-04-17T03:17:28.766535" elapsed="0.000615"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:28.767754" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:28.767386" 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-04-17T03:17:28.773173" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:28.975631" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:29.378390" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:29.381113" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:17:28.770043" elapsed="0.616871">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:17:28.767912" elapsed="0.619271">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:29.387803" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:29.387276" elapsed="0.000836"/>
</branch>
<status status="FAIL" start="2026-04-17T03:17:28.767892" elapsed="0.620282">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:29.389136" elapsed="0.000044"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:29.389358" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:29.389297" elapsed="0.000129"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:29.389268" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:29.389681" elapsed="0.000038"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:17:29.389813" elapsed="0.000026"/>
</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-04-17T03:17:28.765261" elapsed="0.624757">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:29.390138" 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-04-17T03:17:28.651661" elapsed="0.738628">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:29.390710" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:29.390434" elapsed="0.000393"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:29.390407" elapsed="0.000471"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:29.390969" elapsed="0.000033"/>
</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="FAIL" start="2026-04-17T03:17:28.643782" elapsed="0.747359">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:17:28.635510" elapsed="0.755787">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:17:30.454476" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:30.454050" elapsed="0.000462"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:30.455582" 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-04-17T03:17:30.455137" elapsed="0.000542">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-04-17T03:17:30.455783" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:30.454706" elapsed="0.001103"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:30.456412" 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-04-17T03:17:30.456010" elapsed="0.000430"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:17:30.456846" 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-04-17T03:17:30.457058" 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-04-17T03:17:30.456697" elapsed="0.000387"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:30.457506" 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-04-17T03:17:30.457248" 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-04-17T03:17:30.458903" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:30.458425" elapsed="0.000563"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:17:30.459562" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:17:30.459157" elapsed="0.000438"/>
</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-04-17T03:17:30.460066" elapsed="0.000049"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:30.460819" elapsed="0.000064"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:17:30.461275" elapsed="0.000047"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:17:30.459831" elapsed="0.001613"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:17:30.459660" elapsed="0.001853"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:17:30.461567" elapsed="0.000055"/>
</return>
<msg time="2026-04-17T03:17:30.461780" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:17:30.458063" elapsed="0.003743"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:30.457648" elapsed="0.004192"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:30.462035" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:30.461865" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:30.457620" elapsed="0.004495"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:17:30.462729" 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-04-17T03:17:30.462260" elapsed="0.000497"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:17:30.462806" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:17:30.453289" elapsed="0.009679"/>
</kw>
<msg time="2026-04-17T03:17:30.463027" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:30.439862" elapsed="0.023217"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:17:30.479601" 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/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-04-17T03:17:30.493380" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:17:30.506081" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:30.506365" 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-04-17T03:17:30.506550" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:30.506963" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:30.506797" elapsed="0.000253"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:30.506780" elapsed="0.000303"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:30.507280" 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-04-17T03:17:30.507482" 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-04-17T03:17:30.507672" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:17:30.506744" elapsed="0.000985"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:17:30.506631" elapsed="0.001125"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:30.507948" elapsed="0.000027"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:30.508042" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:17:30.508192" 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-04-17T03:17:30.435196" elapsed="0.073024"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:30.509660" 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-04-17T03:17:30.509368" elapsed="0.000371">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-04-17T03:17:30.509835" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:30.508912" elapsed="0.000948"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:30.510235" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:30.509947" elapsed="0.000350"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:17:30.510808" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:30.510506" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:30.510322" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:30.509912" elapsed="0.000991"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:30.513395" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:17:30.511108" elapsed="0.002316"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:17:30.513478" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:17:30.513641" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:17:30.508559" elapsed="0.005108"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:30.514959" 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-04-17T03:17:30.514700" elapsed="0.000325">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-04-17T03:17:30.515120" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:30.514344" elapsed="0.000801"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:17:30.515369" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-17T03:17:30.515216" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:30.515198" elapsed="0.000258"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:30.515646" 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-04-17T03:17:30.515822" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:17:30.515889" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:17:30.518081" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:17:30.513998" elapsed="0.004111"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:30.519561" 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-04-17T03:17:30.519301" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:30.520024" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:30.519762" 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-04-17T03:17:30.525268" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:30.726852" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:31.129443" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:31.131640" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:17:30.522482" elapsed="0.613193">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:17:30.520135" elapsed="0.615689">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:31.136282" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:31.135887" elapsed="0.000532"/>
</branch>
<status status="FAIL" start="2026-04-17T03:17:30.520117" elapsed="0.616339">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:31.137173" elapsed="0.000042"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:31.137379" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:31.137323" elapsed="0.000121"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:31.137296" elapsed="0.000177"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:31.137756" elapsed="0.000100"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:17:31.137961" elapsed="0.000030"/>
</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-04-17T03:17:30.518439" elapsed="0.619747">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:31.138336" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:17:30.409143" elapsed="0.729387">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:31.139206" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:31.138814" elapsed="0.000537"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:31.138779" elapsed="0.000621"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:31.139463" 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="FAIL" start="2026-04-17T03:17:30.399736" elapsed="0.739933">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:17:30.391858" elapsed="0.748020">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:17:32.193378" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:32.192904" elapsed="0.000511"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:32.194505" 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-04-17T03:17:32.194079" elapsed="0.000504">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-04-17T03:17:32.194682" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:32.193617" elapsed="0.001090"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:32.195331" 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-04-17T03:17:32.194878" elapsed="0.000481"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:17:32.195765" 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-04-17T03:17:32.195976" 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-04-17T03:17:32.195562" elapsed="0.000447"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:32.196486" 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-04-17T03:17:32.196206" elapsed="0.000338"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:32.197984" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:32.197480" elapsed="0.000571"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:17:32.198774" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:17:32.198263" elapsed="0.000544"/>
</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-04-17T03:17:32.199371" elapsed="0.000062"/>
</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-04-17T03:17:32.200333" elapsed="0.000054"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:17:32.200683" elapsed="0.000045"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:17:32.199130" elapsed="0.001722"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:17:32.198867" elapsed="0.002103"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:17:32.201035" elapsed="0.000045"/>
</return>
<msg time="2026-04-17T03:17:32.201300" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:17:32.197112" elapsed="0.004213"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:32.196649" elapsed="0.004711"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:32.201541" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:32.201387" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:32.196615" elapsed="0.005004"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:17:32.202314" 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-04-17T03:17:32.201767" elapsed="0.000576"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:17:32.202393" 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-04-17T03:17:32.192064" elapsed="0.010456"/>
</kw>
<msg time="2026-04-17T03:17:32.202583" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:32.178436" elapsed="0.024209"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:17:32.216337" elapsed="0.000047"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:17:32.229466" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:32.243117" elapsed="0.000050"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:32.243365" 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-04-17T03:17:32.243549" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:32.243966" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:32.243797" elapsed="0.000234"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:32.243780" elapsed="0.000282"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:32.244237" 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-04-17T03:17:32.244402" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:32.244564" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:17:32.243744" elapsed="0.000873"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:17:32.243629" elapsed="0.001014"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:32.244789" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:32.244867" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:17:32.245033" 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-04-17T03:17:32.174132" elapsed="0.070987"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:32.246489" 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-04-17T03:17:32.246209" elapsed="0.000356">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-04-17T03:17:32.246661" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:32.245809" elapsed="0.000877"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:32.247037" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:32.246756" elapsed="0.000341"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:17:32.247654" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:32.247354" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:32.247122" elapsed="0.000596"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:32.246738" elapsed="0.001001"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:32.250153" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:17:32.247892" elapsed="0.002289"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:17:32.250234" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:17:32.250394" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:17:32.245456" elapsed="0.004963"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:32.251694" 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-04-17T03:17:32.251446" elapsed="0.000312">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-04-17T03:17:32.251852" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:32.251072" elapsed="0.000804"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:17:32.252107" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:17:32.251964" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:32.251945" elapsed="0.000248"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:32.252339" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:32.252510" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:17:32.252576" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:17:32.256393" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:17:32.250731" elapsed="0.005700"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:32.257957" 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-04-17T03:17:32.257679" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:32.258423" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:32.258171" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:17:32.263607" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:32.465085" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:32.867195" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:32.869720" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:17:32.260726" elapsed="0.612807">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:17:32.258536" elapsed="0.615218">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:32.874493" elapsed="0.000074"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:32.873901" elapsed="0.000771"/>
</branch>
<status status="FAIL" start="2026-04-17T03:17:32.258518" elapsed="0.616212">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:32.875925" elapsed="0.000105"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:32.876311" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:32.876216" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:32.876171" elapsed="0.000300"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:32.876842" elapsed="0.000051"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:17:32.877041" elapsed="0.000036"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:17:32.256767" elapsed="0.620429">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:32.877284" 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-04-17T03:17:32.151518" elapsed="0.725879">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:32.877716" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:32.877504" elapsed="0.000292"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:32.877485" elapsed="0.000338"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:32.877858" elapsed="0.000017"/>
</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="FAIL" start="2026-04-17T03:17:32.145169" elapsed="0.732820">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:17:32.140417" elapsed="0.737692">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:17:33.955161" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:33.954728" elapsed="0.000467"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:33.956154" 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-04-17T03:17:33.955722" elapsed="0.000508">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-04-17T03:17:33.956329" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:33.955375" elapsed="0.000979"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:33.956922" 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-04-17T03:17:33.956525" elapsed="0.000457"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:17:33.957309" 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-04-17T03:17:33.957469" 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-04-17T03:17:33.957163" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:33.957907" 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-04-17T03:17:33.957655" 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-04-17T03:17:33.959253" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:33.958778" elapsed="0.000540"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:17:33.959875" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:17:33.959483" elapsed="0.000420"/>
</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-04-17T03:17:33.960345" elapsed="0.000047"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:33.961297" elapsed="0.000065"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:17:33.961675" elapsed="0.000054"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:17:33.960145" elapsed="0.001740"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:17:33.959977" elapsed="0.002006"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:17:33.962041" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:17:33.962315" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:17:33.958419" elapsed="0.003931"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:33.958050" elapsed="0.004346"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:33.962647" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:33.962432" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:33.958026" elapsed="0.004727"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:17:33.963620" 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-04-17T03:17:33.962975" elapsed="0.000683"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:17:33.963726" 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-04-17T03:17:33.954041" elapsed="0.009857"/>
</kw>
<msg time="2026-04-17T03:17:33.963998" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:33.939333" elapsed="0.024739"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:17:33.978896" elapsed="0.000042"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:17:33.991644" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:17:34.006845" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:34.007072" 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-04-17T03:17:34.007257" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:34.007625" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:34.007478" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:34.007463" 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-04-17T03:17:34.007844" 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-04-17T03:17:34.008027" 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-04-17T03:17:34.008196" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:17:34.007433" elapsed="0.000815"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:17:34.007332" elapsed="0.000942"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:34.008420" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:34.008494" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:17:34.008616" 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-04-17T03:17:33.934517" elapsed="0.074124"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:34.010027" 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-04-17T03:17:34.009731" elapsed="0.000385">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-04-17T03:17:34.010252" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:34.009382" elapsed="0.000903"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:34.010727" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:34.010382" elapsed="0.000425"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:17:34.011523" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:34.011112" elapsed="0.000448"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:34.010841" elapsed="0.000839"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:34.010357" elapsed="0.001356"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:34.015098" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:17:34.011949" elapsed="0.003191"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:17:34.015212" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:17:34.015430" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:17:34.008987" elapsed="0.006477"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:34.017230" 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-04-17T03:17:34.016845" elapsed="0.000485">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-04-17T03:17:34.017465" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:34.016371" elapsed="0.001128"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:17:34.017788" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-17T03:17:34.017598" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:34.017573" elapsed="0.000334"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:34.018177" elapsed="0.000045"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:34.018447" elapsed="0.000028"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:17:34.018540" elapsed="0.000021"/>
</return>
<msg time="2026-04-17T03:17:34.021507" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:17:34.015892" elapsed="0.005653"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:34.023139" 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-04-17T03:17:34.022863" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:34.023579" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:34.023339" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:17:34.028551" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:34.230477" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:34.633101" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:34.635444" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:17:34.025786" elapsed="0.613212">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:17:34.023687" elapsed="0.615481">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:34.639558" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:34.639234" elapsed="0.000441"/>
</branch>
<status status="FAIL" start="2026-04-17T03:17:34.023669" elapsed="0.616046">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:34.640494" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:34.640735" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:34.640661" elapsed="0.000145"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:34.640629" elapsed="0.000210"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:34.641089" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:17:34.641200" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:17:34.022005" elapsed="0.619371">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:34.641497" 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-04-17T03:17:33.901138" elapsed="0.740522">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:34.642146" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:34.641810" elapsed="0.000448"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:34.641784" elapsed="0.000512"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:34.642344" elapsed="0.000022"/>
</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="FAIL" start="2026-04-17T03:17:33.891955" elapsed="0.750544">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:17:33.878863" elapsed="0.763813">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:17:35.716097" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:35.715590" elapsed="0.000544"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:35.717227" 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-04-17T03:17:35.716735" elapsed="0.000575">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-04-17T03:17:35.717414" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:35.716322" elapsed="0.001119"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:35.718060" 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-04-17T03:17:35.717616" elapsed="0.000473"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:17:35.718418" 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-04-17T03:17:35.718664" 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-04-17T03:17:35.718265" elapsed="0.000427"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:35.719200" 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-04-17T03:17:35.718863" 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-04-17T03:17:35.720742" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:35.720226" elapsed="0.000583"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:17:35.721405" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:17:35.720995" elapsed="0.000437"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:35.721995" elapsed="0.000066"/>
</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-04-17T03:17:35.722887" elapsed="0.000089"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:17:35.723327" elapsed="0.000049"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:17:35.721716" elapsed="0.001785"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:17:35.721493" elapsed="0.002076"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:17:35.723624" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:17:35.723835" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:17:35.719739" elapsed="0.004124"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:35.719338" elapsed="0.004560"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:35.724169" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:35.723953" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:35.719311" elapsed="0.004980"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:17:35.725051" 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-04-17T03:17:35.724490" elapsed="0.000593"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:17:35.725137" 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-04-17T03:17:35.714671" elapsed="0.010606"/>
</kw>
<msg time="2026-04-17T03:17:35.725337" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:35.701271" elapsed="0.024127"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:17:35.740899" elapsed="0.000100"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:17:35.755739" elapsed="0.000086"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:17:35.769241" elapsed="0.000057"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:35.769627" 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-04-17T03:17:35.769815" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:35.770263" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:35.770108" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:35.770091" 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-04-17T03:17:35.770491" 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-04-17T03:17:35.770686" 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-04-17T03:17:35.770862" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:17:35.770052" elapsed="0.000864"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:17:35.769900" elapsed="0.001061"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:35.771137" elapsed="0.000024"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:35.771224" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:17:35.771389" 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-04-17T03:17:35.696599" elapsed="0.074818"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:35.772866" 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-04-17T03:17:35.772574" elapsed="0.000382">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-04-17T03:17:35.773053" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:35.772171" elapsed="0.000907"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:35.773418" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:35.773149" elapsed="0.000327"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:17:35.773999" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:35.773685" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:35.773500" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:35.773130" elapsed="0.000952"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:35.776495" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:17:35.774234" elapsed="0.002288"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:17:35.776575" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:17:35.776735" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:17:35.771791" elapsed="0.004969"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:35.778036" 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-04-17T03:17:35.777770" elapsed="0.000333">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-04-17T03:17:35.778198" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:35.777427" elapsed="0.000795"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:17:35.778428" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:17:35.778292" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:35.778274" elapsed="0.000239"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:35.778659" 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-04-17T03:17:35.778901" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:17:35.778985" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:17:35.781111" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:17:35.777092" elapsed="0.004046"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:35.782575" 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-04-17T03:17:35.782316" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:35.783038" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:35.782776" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:17:35.788337" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:35.990369" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:36.393378" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:36.395650" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:17:35.785364" elapsed="0.613751">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:17:35.783181" elapsed="0.616121">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:36.399699" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:36.399369" elapsed="0.000467"/>
</branch>
<status status="FAIL" start="2026-04-17T03:17:35.783158" elapsed="0.616715">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:36.400530" elapsed="0.000040"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:36.400741" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:36.400683" elapsed="0.000123"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:36.400654" elapsed="0.000183"/>
</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-04-17T03:17:36.401069" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:17:36.401191" elapsed="0.000025"/>
</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-04-17T03:17:35.781461" elapsed="0.619903">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:36.401478" 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-04-17T03:17:35.661420" elapsed="0.740205">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:36.402186" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:36.401839" elapsed="0.000460"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:36.401814" elapsed="0.000520"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:36.402382" elapsed="0.000022"/>
</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="FAIL" start="2026-04-17T03:17:35.652242" elapsed="0.750291">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:17:35.643514" elapsed="0.759253">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:17:37.464550" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:37.464097" elapsed="0.000487"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:37.465830" 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-04-17T03:17:37.465223" elapsed="0.000736">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-04-17T03:17:37.466093" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:37.464812" elapsed="0.001315"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:37.466748" 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-04-17T03:17:37.466317" elapsed="0.000458"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:17:37.467117" 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-04-17T03:17:37.467289" 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-04-17T03:17:37.466966" elapsed="0.000349"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:37.467732" 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-04-17T03:17:37.467478" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:37.469235" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:37.468658" elapsed="0.000648"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:17:37.470029" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:17:37.469496" elapsed="0.000562"/>
</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-04-17T03:17:37.470590" elapsed="0.000072"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:37.471547" elapsed="0.000059"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:17:37.472022" elapsed="0.000064"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:17:37.470327" elapsed="0.001928"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:17:37.470117" elapsed="0.002237"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:17:37.472432" elapsed="0.000055"/>
</return>
<msg time="2026-04-17T03:17:37.472689" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:17:37.468280" elapsed="0.004446"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:37.467862" elapsed="0.005049"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:37.473204" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:37.472980" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:37.467837" elapsed="0.005472"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:17:37.474192" 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-04-17T03:17:37.473514" elapsed="0.000716"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:17:37.474298" 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//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-04-17T03:17:37.463160" elapsed="0.011311"/>
</kw>
<msg time="2026-04-17T03:17:37.474553" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:37.448253" elapsed="0.026378"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:17:37.490949" elapsed="0.000076"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:17:37.507901" elapsed="0.000096"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:17:37.521586" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:37.521834" 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-04-17T03:17:37.522034" 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-04-17T03:17:37.522454" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:37.522302" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:37.522284" 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-04-17T03:17:37.522678" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:37.522848" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:37.523031" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:17:37.522243" elapsed="0.000842"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:17:37.522117" elapsed="0.000996"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:37.523260" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:37.523364" elapsed="0.000024"/>
</return>
<msg time="2026-04-17T03:17:37.523548" 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-04-17T03:17:37.443544" elapsed="0.080106"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:37.525227" 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-04-17T03:17:37.524904" elapsed="0.000401">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-04-17T03:17:37.525403" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:37.524429" 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-04-17T03:17:37.525770" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:37.525502" elapsed="0.000328"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:17:37.526356" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:37.526052" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:37.525855" elapsed="0.000564"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:37.525483" elapsed="0.000957"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:37.528824" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:17:37.526593" elapsed="0.002259"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:17:37.528982" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:17:37.529163" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:17:37.524058" elapsed="0.005134"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:37.530474" 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-04-17T03:17:37.530240" elapsed="0.000297">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-04-17T03:17:37.530631" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:37.529879" elapsed="0.000777"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:17:37.530862" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:17:37.530727" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:37.530709" elapsed="0.000254"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:37.531112" 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-04-17T03:17:37.531284" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:17:37.531350" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:17:37.533429" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:17:37.529552" elapsed="0.003904"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:37.534869" 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-04-17T03:17:37.534612" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:37.535329" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:37.535086" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:17:37.540481" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:37.742020" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:38.156242" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:38.159303" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:17:37.537514" elapsed="0.627075">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:17:37.535438" elapsed="0.629371">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:38.165404" elapsed="0.000292"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:38.164897" elapsed="0.000903"/>
</branch>
<status status="FAIL" start="2026-04-17T03:17:37.535421" elapsed="0.630433">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:38.166925" elapsed="0.000115"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:38.167316" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:38.167224" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:38.167180" elapsed="0.000291"/>
</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-04-17T03:17:38.167827" elapsed="0.000053"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:17:38.168031" elapsed="0.000038"/>
</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-04-17T03:17:37.533774" elapsed="0.634528">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:38.168490" elapsed="0.000039"/>
</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-04-17T03:17:37.419877" elapsed="0.748852">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:38.169460" elapsed="0.000187"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:38.168986" elapsed="0.000809"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:38.168917" elapsed="0.000940"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:38.169977" elapsed="0.000040"/>
</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="FAIL" start="2026-04-17T03:17:37.413089" elapsed="0.757141">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:17:37.403492" elapsed="0.766845">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:17:39.230077" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:39.229622" elapsed="0.000491"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:39.231149" 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-04-17T03:17:39.230703" elapsed="0.000523">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-04-17T03:17:39.231350" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:39.230307" elapsed="0.001081"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:39.232283" 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-04-17T03:17:39.231649" elapsed="0.000677"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:17:39.232804" 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-04-17T03:17:39.233051" 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-04-17T03:17:39.232580" elapsed="0.000512"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:39.233720" 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-04-17T03:17:39.233336" elapsed="0.000455"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:39.235636" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:39.235080" elapsed="0.000623"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:17:39.236281" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:17:39.235873" elapsed="0.000436"/>
</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-04-17T03:17:39.236736" elapsed="0.000048"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:39.237502" 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-04-17T03:17:39.237845" elapsed="0.000044"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:17:39.236539" elapsed="0.001485"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:17:39.236366" elapsed="0.001725"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:17:39.238141" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:17:39.238315" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:17:39.234450" elapsed="0.003890"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:39.233905" elapsed="0.004468"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:39.238571" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:39.238399" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:39.233873" elapsed="0.004785"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:17:39.239298" 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-04-17T03:17:39.238822" elapsed="0.000505"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:17:39.239376" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:17:39.228844" elapsed="0.010658"/>
</kw>
<msg time="2026-04-17T03:17:39.239558" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:39.215784" elapsed="0.023829"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:17:39.252475" elapsed="0.000042"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:17:39.265029" 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-04-17T03:17:39.277597" elapsed="0.000038"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:39.277845" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:39.278045" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:39.278473" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:39.278320" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:39.278299" 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-04-17T03:17:39.278714" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:39.278884" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:39.279070" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:17:39.278258" elapsed="0.000867"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:17:39.278130" elapsed="0.001023"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:39.279301" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:39.279380" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:17:39.279532" 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-04-17T03:17:39.211152" elapsed="0.068408"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:39.281006" 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-04-17T03:17:39.280677" elapsed="0.000404">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-04-17T03:17:39.281177" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:39.280284" elapsed="0.000918"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:39.281539" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:39.281273" elapsed="0.000324"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:17:39.282125" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:39.281805" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:39.281622" elapsed="0.000630"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:39.281255" elapsed="0.001022"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:39.284671" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:17:39.282432" elapsed="0.002266"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:17:39.284751" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:17:39.284913" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:17:39.279913" elapsed="0.005040"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:39.286201" 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-04-17T03:17:39.285959" elapsed="0.000307">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-04-17T03:17:39.286366" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:39.285601" elapsed="0.000789"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:17:39.286611" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:17:39.286461" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:39.286443" elapsed="0.000254"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:39.286846" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:39.287036" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:17:39.287103" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:17:39.291040" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:17:39.285269" elapsed="0.005799"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:39.292530" 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-04-17T03:17:39.292262" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:39.292997" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:39.292734" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:17:39.298108" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:39.499515" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:39.902019" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:39.904610" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:17:39.295247" elapsed="0.612858">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:17:39.293112" elapsed="0.615150">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:39.908684" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:39.908329" elapsed="0.000477"/>
</branch>
<status status="FAIL" start="2026-04-17T03:17:39.293092" elapsed="0.615759">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:39.909568" elapsed="0.000119"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:39.909884" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:39.909809" elapsed="0.000166"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:39.909774" elapsed="0.000233"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:39.910222" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:17:39.910326" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:17:39.291406" elapsed="0.619094">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:39.910626" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:17:39.187024" elapsed="0.723768">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:39.911292" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:39.910959" elapsed="0.000439"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:39.910908" elapsed="0.000523"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:39.911476" elapsed="0.000020"/>
</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="FAIL" start="2026-04-17T03:17:39.179101" elapsed="0.732519">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:17:39.171113" elapsed="0.740651">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:17:40.971262" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:40.970763" elapsed="0.000537"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:40.972270" 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-04-17T03:17:40.971837" elapsed="0.000513">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-04-17T03:17:40.972455" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:40.971481" elapsed="0.001001"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:40.973116" 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-04-17T03:17:40.972653" elapsed="0.000494"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:17:40.973518" 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-04-17T03:17:40.973684" 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-04-17T03:17:40.973344" elapsed="0.000425"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:40.974218" 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-04-17T03:17:40.973955" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:40.975563" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:40.975083" elapsed="0.000545"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:17:40.976276" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:17:40.975798" 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-04-17T03:17:40.976748" elapsed="0.000047"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:40.977503" elapsed="0.000053"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:17:40.977882" elapsed="0.000074"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:17:40.976554" elapsed="0.001528"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:17:40.976376" elapsed="0.001781"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:17:40.978214" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:17:40.978396" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:17:40.974694" elapsed="0.003729"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:40.974346" elapsed="0.004110"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:40.978634" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:40.978482" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:40.974322" elapsed="0.004390"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:17:40.979355" 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-04-17T03:17:40.978859" elapsed="0.000525"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:17:40.979434" 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-04-17T03:17:40.970085" elapsed="0.009477"/>
</kw>
<msg time="2026-04-17T03:17:40.979617" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:40.957215" elapsed="0.022455"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:17:40.992551" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:41.005098" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:41.020591" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:41.020799" 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-04-17T03:17:41.021051" 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-04-17T03:17:41.021434" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:41.021285" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:41.021270" 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-04-17T03:17:41.021661" 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-04-17T03:17:41.021862" 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-04-17T03:17:41.022063" elapsed="0.000024"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:17:41.021238" elapsed="0.000893"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:17:41.021130" elapsed="0.001029"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:41.022310" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:41.022386" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:17:41.022515" 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-04-17T03:17:40.952934" elapsed="0.069608"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:41.023859" 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-04-17T03:17:41.023591" elapsed="0.000360">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-04-17T03:17:41.024047" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:41.023228" elapsed="0.000844"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:41.024449" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:41.024141" elapsed="0.000367"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:17:41.025029" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:41.024714" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:41.024533" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:41.024124" elapsed="0.000987"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:41.027458" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:17:41.025263" elapsed="0.002222"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:17:41.027537" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:17:41.027692" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:17:41.022873" elapsed="0.004844"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:41.029002" 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-04-17T03:17:41.028745" elapsed="0.000321">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-04-17T03:17:41.029160" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:41.028407" elapsed="0.000778"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:17:41.029391" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:17:41.029255" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:41.029237" 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-04-17T03:17:41.029623" 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-04-17T03:17:41.029841" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:17:41.029908" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:17:41.032188" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:17:41.028042" elapsed="0.004215"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:41.033717" 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-04-17T03:17:41.033452" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:41.034179" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:41.033920" 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-04-17T03:17:41.039344" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:41.240924" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:41.643656" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:41.646443" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:17:41.036468" elapsed="0.615193">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:17:41.034291" elapsed="0.617526">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:41.652254" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:41.651888" elapsed="0.000472"/>
</branch>
<status status="FAIL" start="2026-04-17T03:17:41.034272" elapsed="0.618123">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:41.653083" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:41.653288" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:41.653230" elapsed="0.000122"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:41.653203" elapsed="0.000186"/>
</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-04-17T03:17:41.653610" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:17:41.653717" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:17:41.032595" elapsed="0.621293">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:41.654032" elapsed="0.000026"/>
</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-04-17T03:17:40.930151" elapsed="0.724034">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:41.654698" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:41.654411" elapsed="0.000400"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:41.654383" elapsed="0.000465"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:41.654900" elapsed="0.000021"/>
</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="FAIL" start="2026-04-17T03:17:40.921085" elapsed="0.733992">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:17:40.912523" elapsed="0.742710">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:17:42.718992" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:42.718492" elapsed="0.000538"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:42.720161" 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-04-17T03:17:42.719661" elapsed="0.000591">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-04-17T03:17:42.720368" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:42.719220" elapsed="0.001180"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:42.721047" 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-04-17T03:17:42.720606" elapsed="0.000469"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:17:42.721419" 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-04-17T03:17:42.721611" 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-04-17T03:17:42.721267" elapsed="0.000379"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:42.722274" 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-04-17T03:17:42.721922" elapsed="0.000413"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:42.723850" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:42.723350" elapsed="0.000600"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:17:42.724640" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:17:42.724167" 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-04-17T03:17:42.725268" elapsed="0.000062"/>
</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-04-17T03:17:42.726399" elapsed="0.000062"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:17:42.726820" elapsed="0.000055"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:17:42.725002" elapsed="0.002015"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:17:42.724752" elapsed="0.002336"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:17:42.727143" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:17:42.727327" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:17:42.722941" elapsed="0.004412"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:42.722464" elapsed="0.004986"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:42.727633" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:42.727479" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:42.722423" elapsed="0.005301"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:17:42.728371" 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-04-17T03:17:42.727878" elapsed="0.000522"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:17:42.728454" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:17:42.717609" elapsed="0.011008"/>
</kw>
<msg time="2026-04-17T03:17:42.728697" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:42.702061" elapsed="0.026699"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:17:42.742609" 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/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-04-17T03:17:42.755427" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:42.767973" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:42.768201" 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-04-17T03:17:42.768386" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:42.768795" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:42.768643" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:42.768625" 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-04-17T03:17:42.769036" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:42.769206" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:42.769371" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:17:42.768586" elapsed="0.000836"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:17:42.768465" elapsed="0.000985"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:42.769595" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:42.769672" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:17:42.769852" 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-04-17T03:17:42.697270" elapsed="0.072688"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:42.771379" 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-04-17T03:17:42.771096" elapsed="0.000357">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-04-17T03:17:42.771548" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:42.770689" elapsed="0.000884"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:42.771957" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:42.771645" elapsed="0.000375"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:17:42.772602" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:42.772229" elapsed="0.000410"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:42.772045" elapsed="0.000658"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:42.771626" elapsed="0.001111"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:42.775848" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:17:42.772980" elapsed="0.002896"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:17:42.775945" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:17:42.776111" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:17:42.770298" elapsed="0.005839"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:42.777473" 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-04-17T03:17:42.777235" elapsed="0.000304">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-17T03:17:42.777634" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:42.776869" elapsed="0.000795"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:17:42.777910" elapsed="0.000045"/>
</return>
<status status="PASS" start="2026-04-17T03:17:42.777747" elapsed="0.000244"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:42.777727" elapsed="0.000289"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:42.778167" 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-04-17T03:17:42.778341" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:17:42.778409" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:17:42.780738" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:17:42.776495" elapsed="0.004270"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:42.782308" 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-04-17T03:17:42.782007" elapsed="0.000361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:42.782849" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:42.782543" elapsed="0.000352"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:17:42.788281" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:42.989870" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:43.392911" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:43.395819" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:17:42.785171" elapsed="0.615397">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:17:42.782982" elapsed="0.617754">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:43.401157" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:43.400802" elapsed="0.000457"/>
</branch>
<status status="FAIL" start="2026-04-17T03:17:42.782963" elapsed="0.618332">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:43.402007" elapsed="0.000049"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:43.402257" elapsed="0.000049"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:43.402179" elapsed="0.000180"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:43.402143" elapsed="0.000249"/>
</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-04-17T03:17:43.402645" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:17:43.402751" elapsed="0.000024"/>
</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-04-17T03:17:42.781104" elapsed="0.621852">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:43.403105" elapsed="0.000030"/>
</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-04-17T03:17:42.673338" elapsed="0.729929">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:43.403695" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:43.403413" elapsed="0.000393"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:43.403380" elapsed="0.000463"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:43.403892" elapsed="0.000022"/>
</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="FAIL" start="2026-04-17T03:17:42.665227" elapsed="0.738853">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:17:42.656025" elapsed="0.748217">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:17:44.465694" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:44.465242" elapsed="0.000487"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:44.466743" 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-04-17T03:17:44.466289" elapsed="0.000533">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-04-17T03:17:44.466922" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:44.465910" elapsed="0.001068"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:44.467620" 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-04-17T03:17:44.467153" elapsed="0.000496"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:17:44.467992" 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-04-17T03:17:44.468159" 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-04-17T03:17:44.467819" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:44.468608" 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-04-17T03:17:44.468348" 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-04-17T03:17:44.470064" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:44.469542" elapsed="0.000587"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:17:44.470669" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:17:44.470301" elapsed="0.000396"/>
</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-04-17T03:17:44.471130" elapsed="0.000079"/>
</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-04-17T03:17:44.472105" 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-04-17T03:17:44.472601" elapsed="0.000069"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:17:44.470918" elapsed="0.001941"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:17:44.470752" elapsed="0.002239"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:17:44.473067" elapsed="0.000052"/>
</return>
<msg time="2026-04-17T03:17:44.473309" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:17:44.469175" elapsed="0.004169"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:44.468782" elapsed="0.004606"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:44.473657" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:44.473428" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:44.468748" elapsed="0.005023"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:17:44.474687" 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-04-17T03:17:44.474016" elapsed="0.000714"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:17:44.474804" 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/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-04-17T03:17:44.464323" elapsed="0.010689"/>
</kw>
<msg time="2026-04-17T03:17:44.475094" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:44.448676" elapsed="0.026495"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:17:44.494309" elapsed="0.000071"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:17:44.512588" elapsed="0.000096"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:17:44.529642" elapsed="0.000083"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:44.530088" 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-04-17T03:17:44.530356" 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-04-17T03:17:44.531012" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:44.530746" elapsed="0.000360"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:44.530719" elapsed="0.000424"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:44.531458" elapsed="0.000037"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:44.531724" 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-04-17T03:17:44.531992" elapsed="0.000039"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:17:44.530664" elapsed="0.001416"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:17:44.530467" elapsed="0.001651"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:44.532332" elapsed="0.000031"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:44.532445" elapsed="0.000024"/>
</return>
<msg time="2026-04-17T03:17:44.532687" 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-04-17T03:17:44.443857" elapsed="0.088871"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:44.534897" 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-04-17T03:17:44.534469" elapsed="0.000533">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-04-17T03:17:44.535106" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:44.533873" elapsed="0.001258"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:44.535535" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:44.535213" elapsed="0.000381"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:17:44.536152" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:44.535809" elapsed="0.000375"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:44.535620" elapsed="0.000678"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:44.535190" elapsed="0.001133"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:44.538995" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:17:44.536484" elapsed="0.002539"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:17:44.539080" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:17:44.539288" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:17:44.533339" elapsed="0.005977"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:44.540704" 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-04-17T03:17:44.540422" elapsed="0.000367">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-04-17T03:17:44.540888" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:44.540044" elapsed="0.000870"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:17:44.541163" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-17T03:17:44.541006" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:44.540986" elapsed="0.000272"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:44.541409" elapsed="0.000024"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:44.541672" elapsed="0.000035"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:17:44.541772" elapsed="0.000023"/>
</return>
<msg time="2026-04-17T03:17:44.544033" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:17:44.539650" elapsed="0.004415"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:44.545837" 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-04-17T03:17:44.545455" elapsed="0.000452"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:44.546503" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:44.546152" elapsed="0.000415"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:17:44.552785" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:44.754445" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:45.157181" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:45.159349" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:17:44.549540" elapsed="0.613047">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:17:44.546672" elapsed="0.616075">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:45.163184" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:45.162819" elapsed="0.000468"/>
</branch>
<status status="FAIL" start="2026-04-17T03:17:44.546640" elapsed="0.616684">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:45.164041" elapsed="0.000121"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:45.164303" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:45.164259" elapsed="0.000093"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:45.164237" elapsed="0.000136"/>
</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-04-17T03:17:45.164529" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:17:45.164601" elapsed="0.000024"/>
</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-04-17T03:17:44.544433" elapsed="0.620339">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:45.164878" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:17:44.420208" elapsed="0.744841">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:45.165387" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:45.165184" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:45.165163" elapsed="0.000324"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:45.165521" elapsed="0.000014"/>
</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="FAIL" start="2026-04-17T03:17:44.412444" elapsed="0.753183">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:17:44.404882" elapsed="0.760852">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:17:46.228855" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:46.228356" elapsed="0.000541"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:46.229945" 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-04-17T03:17:46.229490" elapsed="0.000548">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-04-17T03:17:46.230141" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:46.229099" elapsed="0.001067"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:46.230796" 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-04-17T03:17:46.230337" elapsed="0.000488"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:17:46.231190" 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-04-17T03:17:46.231365" 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-04-17T03:17:46.231029" elapsed="0.000437"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:46.231917" 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-04-17T03:17:46.231653" elapsed="0.000343"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:46.233483" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:46.233011" elapsed="0.000536"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:17:46.234123" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:17:46.233716" elapsed="0.000448"/>
</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-04-17T03:17:46.234627" elapsed="0.000047"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:46.235425" elapsed="0.000053"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:17:46.235776" elapsed="0.000045"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:17:46.234426" elapsed="0.001535"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:17:46.234242" elapsed="0.001806"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:17:46.236105" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:17:46.236287" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:17:46.232478" elapsed="0.003838"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:46.232095" elapsed="0.004279"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:46.236571" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:46.236407" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:46.232067" elapsed="0.004610"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:17:46.237391" 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-04-17T03:17:46.236856" elapsed="0.000565"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:17:46.237470" 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-04-17T03:17:46.227596" elapsed="0.010004"/>
</kw>
<msg time="2026-04-17T03:17:46.237657" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:46.214328" elapsed="0.023387"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:17:46.252237" 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-04-17T03:17:46.266480" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:46.280556" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:46.280793" elapsed="0.000079"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:46.281069" 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-04-17T03:17:46.281492" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:46.281325" elapsed="0.000232"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:46.281308" elapsed="0.000276"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:46.281744" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:46.281944" 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-04-17T03:17:46.282132" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:17:46.281274" elapsed="0.000915"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:17:46.281155" elapsed="0.001063"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:46.282381" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:46.282463" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:17:46.282604" 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-04-17T03:17:46.209732" elapsed="0.072900"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:46.284092" 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-04-17T03:17:46.283783" elapsed="0.000391">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-04-17T03:17:46.284273" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:46.283387" elapsed="0.000912"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:46.284691" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:46.284374" elapsed="0.000381"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:17:46.285325" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:46.285005" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:46.284782" elapsed="0.000609"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:46.284355" elapsed="0.001059"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:46.288092" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:17:46.285585" elapsed="0.002536"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:17:46.288177" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:17:46.288346" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:17:46.283012" elapsed="0.005361"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:46.289736" 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-04-17T03:17:46.289483" elapsed="0.000321">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-04-17T03:17:46.289904" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:46.289109" elapsed="0.000837"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:17:46.290170" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-04-17T03:17:46.290024" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:46.290004" elapsed="0.000259"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:46.290429" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:46.290665" elapsed="0.000023"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:17:46.290737" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:17:46.295148" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:17:46.288730" elapsed="0.006448"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:46.296770" 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-04-17T03:17:46.296468" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:46.297281" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:46.297011" elapsed="0.000318"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:17:46.302779" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:46.504475" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:46.907166" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:46.909496" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:17:46.299809" elapsed="0.611999">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:17:46.297402" elapsed="0.614518">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:46.912231" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:46.911985" elapsed="0.000317"/>
</branch>
<status status="FAIL" start="2026-04-17T03:17:46.297382" elapsed="0.614945">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:46.912841" elapsed="0.000031"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:46.913014" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:46.912971" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:46.912948" elapsed="0.000133"/>
</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-04-17T03:17:46.913328" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:17:46.913430" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:17:46.295537" elapsed="0.618051">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:46.913696" 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-04-17T03:17:46.183771" elapsed="0.730062">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:46.914321" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:46.914057" elapsed="0.000368"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:46.914032" elapsed="0.000428"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:46.914510" 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="FAIL" start="2026-04-17T03:17:46.175762" elapsed="0.738900">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:17:46.166544" elapsed="0.748271">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:17:47.974221" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:47.973697" elapsed="0.000560"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:47.975278" 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-04-17T03:17:47.974801" elapsed="0.000555">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-04-17T03:17:47.975455" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:47.974440" elapsed="0.001041"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:47.976071" 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-04-17T03:17:47.975654" elapsed="0.000445"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:17:47.976413" 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-04-17T03:17:47.976596" 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-04-17T03:17:47.976265" elapsed="0.000357"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:47.977126" 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-04-17T03:17:47.976825" 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-04-17T03:17:47.978614" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:47.978113" elapsed="0.000565"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:17:47.979274" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:17:47.978846" 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-04-17T03:17:47.979724" elapsed="0.000048"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:47.980512" 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-04-17T03:17:47.980877" elapsed="0.000065"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:17:47.979529" elapsed="0.001542"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:17:47.979359" elapsed="0.001781"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:17:47.981193" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:17:47.981374" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:17:47.977671" elapsed="0.003729"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:47.977289" elapsed="0.004282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:47.981766" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:47.981605" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:47.977262" elapsed="0.004584"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:17:47.982528" 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-04-17T03:17:47.982040" elapsed="0.000518"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:17:47.982612" 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-04-17T03:17:47.972892" elapsed="0.009851"/>
</kw>
<msg time="2026-04-17T03:17:47.982801" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:47.960009" elapsed="0.022849"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:17:47.996204" elapsed="0.000062"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:17:48.009297" elapsed="0.000059"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:17:48.023194" elapsed="0.000074"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:48.023609" elapsed="0.000035"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:48.024100" 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-04-17T03:17:48.024714" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:48.024496" elapsed="0.000284"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:48.024469" elapsed="0.000340"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:48.024982" 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-04-17T03:17:48.025157" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:48.025325" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:17:48.024413" elapsed="0.000967"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:17:48.024220" elapsed="0.001188"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:48.025556" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:48.025638" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:17:48.025816" 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-04-17T03:17:47.955444" elapsed="0.070533"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:48.027977" 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-04-17T03:17:48.027616" elapsed="0.000442">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-04-17T03:17:48.028160" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:48.027061" elapsed="0.001124"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:48.028536" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:48.028263" elapsed="0.000333"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:17:48.029416" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:48.029044" elapsed="0.000409"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:48.028621" elapsed="0.000880"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:48.028243" elapsed="0.001286"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:48.033257" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:17:48.029740" elapsed="0.003559"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:17:48.033385" elapsed="0.000053"/>
</return>
<msg time="2026-04-17T03:17:48.033634" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:17:48.026544" elapsed="0.007127"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:48.035682" 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-04-17T03:17:48.035308" elapsed="0.000470">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-04-17T03:17:48.035903" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:48.034779" elapsed="0.001174"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:17:48.036241" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-17T03:17:48.036053" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:48.036026" elapsed="0.000328"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:48.036568" 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-04-17T03:17:48.036818" elapsed="0.000031"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:17:48.036915" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:17:48.040170" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:17:48.034262" elapsed="0.005951"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:48.042464" 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-04-17T03:17:48.042008" elapsed="0.000531"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:48.043144" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:48.042769" elapsed="0.000442"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:17:48.049799" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:48.251461" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:48.653824" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:48.656062" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:17:48.046280" elapsed="0.616020">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:17:48.043310" elapsed="0.619384">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:48.663347" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:48.662830" elapsed="0.000686"/>
</branch>
<status status="FAIL" start="2026-04-17T03:17:48.043282" elapsed="0.620291">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:48.664093" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:48.664244" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:48.664201" elapsed="0.000090"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:48.664180" elapsed="0.000133"/>
</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-04-17T03:17:48.664462" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:17:48.664532" 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-04-17T03:17:48.040739" elapsed="0.623919">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:48.664739" 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-04-17T03:17:47.929916" elapsed="0.734925">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:48.665146" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:48.664955" elapsed="0.000267"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:48.664921" elapsed="0.000326"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:48.665280" elapsed="0.000014"/>
</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="FAIL" start="2026-04-17T03:17:47.920373" elapsed="0.745010">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:17:47.915339" elapsed="0.750174">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:17:49.726450" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:49.725999" elapsed="0.000495"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:49.727480" 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-04-17T03:17:49.727049" elapsed="0.000510">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-04-17T03:17:49.727660" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:49.726677" elapsed="0.001009"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:49.728289" 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-04-17T03:17:49.727860" elapsed="0.000457"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:17:49.728632" 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-04-17T03:17:49.728792" 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-04-17T03:17:49.728485" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:49.729257" 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-04-17T03:17:49.728999" 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-04-17T03:17:49.730563" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:49.730084" elapsed="0.000553"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:17:49.731196" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:17:49.730805" elapsed="0.000419"/>
</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-04-17T03:17:49.731711" elapsed="0.000053"/>
</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-04-17T03:17:49.732541" elapsed="0.000053"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:17:49.732895" elapsed="0.000072"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:17:49.731484" elapsed="0.001606"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:17:49.731278" elapsed="0.001880"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:17:49.733211" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:17:49.733387" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:17:49.729714" elapsed="0.003699"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:49.729383" elapsed="0.004063"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:49.733623" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:49.733471" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:49.729360" elapsed="0.004341"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:17:49.734334" 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-04-17T03:17:49.733847" elapsed="0.000517"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:17:49.734415" 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-04-17T03:17:49.725334" elapsed="0.009211"/>
</kw>
<msg time="2026-04-17T03:17:49.734602" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:49.711959" elapsed="0.022697"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:17:49.747940" elapsed="0.000042"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:17:49.760706" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:17:49.773171" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:49.773419" 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-04-17T03:17:49.773618" 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-04-17T03:17:49.774038" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:49.773869" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:49.773851" 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-04-17T03:17:49.774287" elapsed="0.000030"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:49.774504" 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-04-17T03:17:49.774748" elapsed="0.000031"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:17:49.773816" elapsed="0.001010"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:17:49.773700" elapsed="0.001160"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:49.775074" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:49.775158" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:17:49.775375" 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-04-17T03:17:49.707588" elapsed="0.067829"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:49.777002" 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-04-17T03:17:49.776685" elapsed="0.000397">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-04-17T03:17:49.777181" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:49.776281" elapsed="0.000925"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:49.777553" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:49.777283" elapsed="0.000330"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:17:49.778137" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:49.777820" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:49.777640" elapsed="0.000631"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:49.777262" elapsed="0.001034"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:49.780762" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:17:49.778450" elapsed="0.002339"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:17:49.780842" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:17:49.781020" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:17:49.775870" elapsed="0.005176"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:49.782269" 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-04-17T03:17:49.782032" elapsed="0.000301">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-04-17T03:17:49.782427" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:49.781681" elapsed="0.000770"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:17:49.782656" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-17T03:17:49.782521" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:49.782504" elapsed="0.000235"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:49.782886" 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-04-17T03:17:49.783074" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:17:49.783139" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:17:49.785298" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:17:49.781355" elapsed="0.003971"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:49.786744" 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-04-17T03:17:49.786483" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:49.787208" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:49.786960" 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-04-17T03:17:49.795133" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:50.002346" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:50.422841" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:50.425200" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:17:49.789489" elapsed="0.641180">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:17:49.787393" elapsed="0.643433">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:50.431232" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:50.430889" elapsed="0.000459"/>
</branch>
<status status="FAIL" start="2026-04-17T03:17:49.787305" elapsed="0.644078">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:50.432073" elapsed="0.000124"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:50.432370" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:50.432312" elapsed="0.000122"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:50.432283" elapsed="0.000182"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:50.432682" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:17:50.432785" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:17:49.785645" elapsed="0.647330">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:50.433119" elapsed="0.000030"/>
</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-04-17T03:17:49.684277" elapsed="0.749005">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:50.433771" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:50.433421" elapsed="0.000471"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:50.433397" elapsed="0.000552"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:50.434014" elapsed="0.000035"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}${folder_name}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-04-17T03:17:49.676570" elapsed="0.757623">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:17:49.666357" elapsed="0.768024">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:17:51.495501" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:51.495086" elapsed="0.000451"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:51.496502" 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-04-17T03:17:51.496074" elapsed="0.000539">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-04-17T03:17:51.496714" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:51.495715" elapsed="0.001023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:51.497355" 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-04-17T03:17:51.496906" elapsed="0.000477"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:17:51.497697" 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-04-17T03:17:51.497875" 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-04-17T03:17:51.497547" elapsed="0.000437"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:51.498407" 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-04-17T03:17:51.498149" 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-04-17T03:17:51.499693" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:51.499234" elapsed="0.000522"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:17:51.500301" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:17:51.499937" elapsed="0.000392"/>
</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-04-17T03:17:51.500754" elapsed="0.000047"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:51.501503" 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-04-17T03:17:51.501847" elapsed="0.000046"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:17:51.500545" elapsed="0.001502"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:17:51.500383" elapsed="0.001740"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:17:51.502175" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:17:51.502354" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:17:51.498862" elapsed="0.003517"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:51.498534" elapsed="0.003877"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:51.502584" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:51.502435" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:51.498510" elapsed="0.004150"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:17:51.503278" 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-04-17T03:17:51.502805" elapsed="0.000502"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:17:51.503355" 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-04-17T03:17:51.494397" elapsed="0.009084"/>
</kw>
<msg time="2026-04-17T03:17:51.503535" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:51.480186" elapsed="0.023401"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:17:51.516454" 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//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-04-17T03:17:51.530499" elapsed="0.000061"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:17:51.545534" elapsed="0.000082"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:51.545944" elapsed="0.000125"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:51.546285" 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-04-17T03:17:51.546804" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:51.546618" elapsed="0.000253"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:51.546599" elapsed="0.000300"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:51.547070" 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-04-17T03:17:51.547245" 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-04-17T03:17:51.547416" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:17:51.546555" elapsed="0.000915"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:17:51.546388" elapsed="0.001111"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:51.547649" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:51.547740" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:17:51.547917" 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-04-17T03:17:51.475158" elapsed="0.072805"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:51.549533" 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-04-17T03:17:51.549218" elapsed="0.000397">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-04-17T03:17:51.549718" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:51.548776" elapsed="0.000969"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:51.550117" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:51.549822" elapsed="0.000355"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:17:51.550697" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:51.550395" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:51.550205" elapsed="0.000561"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:51.549801" elapsed="0.000987"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:51.553380" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:17:51.550963" elapsed="0.002445"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:17:51.553466" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:17:51.553640" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:17:51.548356" elapsed="0.005316"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:51.555233" 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-04-17T03:17:51.554952" elapsed="0.000354">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-04-17T03:17:51.555403" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:51.554522" elapsed="0.000906"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:17:51.555650" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-17T03:17:51.555502" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:51.555483" elapsed="0.000283"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:51.556124" elapsed="0.000024"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:51.556397" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:17:51.556465" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:17:51.559217" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:17:51.554159" elapsed="0.005095"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:51.560952" 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-04-17T03:17:51.560588" elapsed="0.000418"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:51.561431" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:51.561164" elapsed="0.000313"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:17:51.566707" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:51.768024" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:52.170322" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:52.172759" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:17:51.563669" elapsed="0.613485">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:17:51.561559" elapsed="0.615794">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:52.177860" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:52.177439" elapsed="0.000590"/>
</branch>
<status status="FAIL" start="2026-04-17T03:17:51.561534" elapsed="0.616545">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:52.178895" elapsed="0.000079"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:52.179199" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:52.179120" elapsed="0.000173"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:52.179082" elapsed="0.000252"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:52.179625" elapsed="0.000047"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:17:52.179763" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:17:51.559644" elapsed="0.620373">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:52.180172" elapsed="0.000034"/>
</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-04-17T03:17:51.449865" elapsed="0.730508">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:52.181031" elapsed="0.000079"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:52.180644" elapsed="0.000560"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:52.180608" elapsed="0.000642"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:52.181303" elapsed="0.000022"/>
</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="FAIL" start="2026-04-17T03:17:51.441001" elapsed="0.740458">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:17:51.435070" elapsed="0.746580">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:17:53.243256" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:53.242803" elapsed="0.000490"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:53.244385" 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-04-17T03:17:53.243950" elapsed="0.000514">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-04-17T03:17:53.244564" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:53.243490" elapsed="0.001100"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:53.245223" 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-04-17T03:17:53.244761" elapsed="0.000491"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:17:53.245574" 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-04-17T03:17:53.245747" 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-04-17T03:17:53.245419" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:53.246252" 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-04-17T03:17:53.245994" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:53.247597" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:53.247116" elapsed="0.000544"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:17:53.248246" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:17:53.247826" elapsed="0.000454"/>
</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-04-17T03:17:53.248747" elapsed="0.000048"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:53.249599" elapsed="0.000068"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:17:53.250126" elapsed="0.000053"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:17:53.248552" elapsed="0.001755"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:17:53.248354" elapsed="0.002021"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:17:53.250435" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:17:53.250618" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:17:53.246718" elapsed="0.003926"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:53.246377" elapsed="0.004386"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:53.250977" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:53.250799" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:53.246353" elapsed="0.004704"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:17:53.251670" 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-04-17T03:17:53.251207" elapsed="0.000493"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:17:53.251749" 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-04-17T03:17:53.242079" elapsed="0.009798"/>
</kw>
<msg time="2026-04-17T03:17:53.251949" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:53.228701" elapsed="0.023302"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:17:53.265889" elapsed="0.000068"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:17:53.279145" 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-04-17T03:17:53.294039" elapsed="0.000040"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:53.294303" 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-04-17T03:17:53.294509" 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-04-17T03:17:53.295000" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:53.294810" elapsed="0.000266"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:53.294791" 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-04-17T03:17:53.295316" elapsed="0.000030"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:53.295569" 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-04-17T03:17:53.295803" elapsed="0.000030"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:17:53.294747" elapsed="0.001133"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:17:53.294606" elapsed="0.001305"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:53.296112" elapsed="0.000024"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:53.296198" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:17:53.296394" 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-04-17T03:17:53.224186" elapsed="0.072313"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:53.298156" 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-04-17T03:17:53.297750" elapsed="0.000498">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-04-17T03:17:53.298345" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:53.297332" elapsed="0.001038"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:53.298708" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:53.298440" elapsed="0.000346"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:17:53.299351" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:53.299050" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:53.298823" elapsed="0.000590"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:53.298422" elapsed="0.001012"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:53.302014" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:17:53.299587" elapsed="0.002455"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:17:53.302096" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:17:53.302259" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:17:53.296920" elapsed="0.005363"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:53.303731" 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-04-17T03:17:53.303470" elapsed="0.000331">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-04-17T03:17:53.303961" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:53.303038" elapsed="0.000955"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:17:53.304257" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-17T03:17:53.304086" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:53.304063" elapsed="0.000311"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:53.304565" 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-04-17T03:17:53.304753" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:17:53.304821" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:17:53.309803" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:17:53.302600" elapsed="0.007272"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:53.312285" 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-04-17T03:17:53.311833" elapsed="0.000524"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:53.312922" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:53.312577" 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-04-17T03:17:53.319454" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:53.521953" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:53.924188" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:53.927004" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:17:53.315956" elapsed="0.616373">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:17:53.313111" elapsed="0.619442">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:53.933125" elapsed="0.000058"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:53.932647" elapsed="0.000637"/>
</branch>
<status status="FAIL" start="2026-04-17T03:17:53.313081" elapsed="0.620259">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:53.934419" elapsed="0.000067"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:53.934752" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:53.934664" elapsed="0.000144"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:53.934620" elapsed="0.000216"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:53.935009" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:17:53.935085" 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-04-17T03:17:53.310393" elapsed="0.624825">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:53.935340" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:17:53.200043" elapsed="0.735445">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:53.935880" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:53.935628" elapsed="0.000354"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:53.935603" elapsed="0.000407"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:53.936045" elapsed="0.000016"/>
</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="FAIL" start="2026-04-17T03:17:53.191676" elapsed="0.744479">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:17:53.182263" elapsed="0.754002">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:17:54.998854" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:54.998333" elapsed="0.000565"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:55.000174" 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-04-17T03:17:54.999636" elapsed="0.000641">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-04-17T03:17:55.000401" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:54.999184" elapsed="0.001250"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:55.001186" 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-04-17T03:17:55.000659" elapsed="0.000563"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:17:55.001626" 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-04-17T03:17:55.001824" 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-04-17T03:17:55.001441" elapsed="0.000417"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:55.002412" 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-04-17T03:17:55.002093" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:55.004091" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:55.003459" elapsed="0.000700"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:17:55.004748" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:17:55.004330" elapsed="0.000446"/>
</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-04-17T03:17:55.005274" elapsed="0.000050"/>
</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-04-17T03:17:55.006198" elapsed="0.000060"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:17:55.006644" elapsed="0.000051"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:17:55.005058" elapsed="0.001766"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:17:55.004843" elapsed="0.002052"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:17:55.006967" elapsed="0.000097"/>
</return>
<msg time="2026-04-17T03:17:55.007240" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:17:55.002988" elapsed="0.004278"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:55.002570" elapsed="0.004729"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:55.007484" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:55.007327" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:55.002541" elapsed="0.005020"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:17:55.008203" 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-04-17T03:17:55.007707" elapsed="0.000525"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:17:55.008283" 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-04-17T03:17:54.997560" elapsed="0.010852"/>
</kw>
<msg time="2026-04-17T03:17:55.008469" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:54.983358" elapsed="0.025168"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:17:55.021448" 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/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-04-17T03:17:55.034268" elapsed="0.000048"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:17:55.047076" elapsed="0.000046"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:55.047386" 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-04-17T03:17:55.047598" 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-04-17T03:17:55.048041" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:55.047870" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:55.047851" 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-04-17T03:17:55.048273" 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-04-17T03:17:55.048442" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:55.048610" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:17:55.047812" elapsed="0.000852"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:17:55.047683" elapsed="0.001008"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:55.048838" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:55.048917" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:17:55.049096" 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-04-17T03:17:54.978510" elapsed="0.070614"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:55.050687" 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-04-17T03:17:55.050391" elapsed="0.000371">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-04-17T03:17:55.050861" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:55.049982" elapsed="0.000904"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:55.051273" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:55.050973" elapsed="0.000358"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:17:55.051878" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:55.051566" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:55.051355" elapsed="0.000672"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:55.050954" elapsed="0.001099"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:55.054848" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:17:55.052212" elapsed="0.002664"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:17:55.054958" elapsed="0.000056"/>
</return>
<msg time="2026-04-17T03:17:55.055226" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:17:55.049533" elapsed="0.005720"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:55.056584" 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-04-17T03:17:55.056327" elapsed="0.000328">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-04-17T03:17:55.056752" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:55.055977" elapsed="0.000799"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:17:55.057012" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-17T03:17:55.056854" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:55.056836" 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-04-17T03:17:55.057252" 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-04-17T03:17:55.057426" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:17:55.057493" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:17:55.059682" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:17:55.055595" elapsed="0.004113"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:55.061250" 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-04-17T03:17:55.060980" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:55.061749" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:55.061455" elapsed="0.000341"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:17:55.067186" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:55.268604" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:55.671064" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:55.673915" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:17:55.064148" elapsed="0.614166">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:17:55.061871" elapsed="0.616615">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:55.678871" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:55.678551" elapsed="0.000442"/>
</branch>
<status status="FAIL" start="2026-04-17T03:17:55.061846" elapsed="0.617183">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:55.679724" elapsed="0.000147"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:55.680101" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:55.680020" elapsed="0.000181"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:55.679989" elapsed="0.000245"/>
</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-04-17T03:17:55.680481" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:17:55.680587" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:17:55.060057" elapsed="0.620695">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:55.680865" 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-04-17T03:17:54.955099" elapsed="0.725978">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:55.681611" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:55.681272" elapsed="0.000467"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:55.681235" elapsed="0.000562"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:55.681854" elapsed="0.000022"/>
</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="FAIL" start="2026-04-17T03:17:54.948130" elapsed="0.733913">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:17:54.937029" elapsed="0.745166">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:17:56.746338" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:56.745890" elapsed="0.000483"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:56.747345" 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-04-17T03:17:56.746902" elapsed="0.000522">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-04-17T03:17:56.747522" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:56.746554" elapsed="0.000993"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:56.748151" 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-04-17T03:17:56.747718" elapsed="0.000480"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:17:56.748510" 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-04-17T03:17:56.748691" 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-04-17T03:17:56.748363" elapsed="0.000439"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:56.749304" 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-04-17T03:17:56.749039" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:56.750626" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:56.750169" elapsed="0.000519"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:17:56.751241" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:17:56.750853" elapsed="0.000414"/>
</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-04-17T03:17:56.751715" elapsed="0.000050"/>
</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-04-17T03:17:56.752524" 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-04-17T03:17:56.752874" elapsed="0.000047"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:17:56.751515" elapsed="0.001553"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:17:56.751327" elapsed="0.001808"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:17:56.753189" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:17:56.753385" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:17:56.749795" elapsed="0.003627"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:56.749435" elapsed="0.004031"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:56.753652" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:56.753495" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:56.749409" elapsed="0.004324"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:17:56.754435" 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-04-17T03:17:56.753882" elapsed="0.000583"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:17:56.754515" 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-04-17T03:17:56.745171" elapsed="0.009474"/>
</kw>
<msg time="2026-04-17T03:17:56.754702" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:56.731893" elapsed="0.022861"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:17:56.768259" 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-04-17T03:17:56.781174" elapsed="0.000033"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:56.793583" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:56.793802" elapsed="0.000089"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:56.794075" 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-04-17T03:17:56.794477" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:56.794326" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:56.794310" 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-04-17T03:17:56.794704" 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-04-17T03:17:56.794872" 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-04-17T03:17:56.795057" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:17:56.794274" elapsed="0.000837"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:17:56.794157" elapsed="0.000982"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:56.795287" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:56.795364" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:17:56.795511" 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-04-17T03:17:56.727356" elapsed="0.068183"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:56.796964" 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-04-17T03:17:56.796659" elapsed="0.000383">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-04-17T03:17:56.797137" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:56.796268" elapsed="0.000893"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:56.797493" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:56.797232" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:17:56.798071" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:56.797757" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:56.797575" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:56.797214" elapsed="0.000939"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:56.800529" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:17:56.798305" elapsed="0.002252"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:17:56.800608" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:17:56.800767" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:17:56.795871" elapsed="0.004920"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:56.802040" 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-04-17T03:17:56.801786" elapsed="0.000319">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-04-17T03:17:56.802200" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:56.801446" elapsed="0.000779"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:17:56.802431" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:17:56.802295" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:56.802277" 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-04-17T03:17:56.802660" 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-04-17T03:17:56.802903" elapsed="0.000036"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:17:56.802987" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:17:56.805182" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:17:56.801115" elapsed="0.004094"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:56.806640" 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-04-17T03:17:56.806381" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:56.807104" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:56.806841" 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-04-17T03:17:56.813054" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:57.015114" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:57.417617" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:57.419670" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:17:56.809731" elapsed="0.613203">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:17:56.807215" elapsed="0.615877">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:57.423470" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:57.423183" elapsed="0.000375"/>
</branch>
<status status="FAIL" start="2026-04-17T03:17:56.807197" elapsed="0.616393">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:57.424215" elapsed="0.000035"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:57.424407" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:57.424350" elapsed="0.000123"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:57.424321" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:57.424721" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:17:57.424809" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:17:56.805534" elapsed="0.619449">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:57.425086" 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-04-17T03:17:56.698062" elapsed="0.727156">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:57.425693" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:57.425429" elapsed="0.000363"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:57.425404" elapsed="0.000418"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:57.425861" elapsed="0.000019"/>
</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="FAIL" start="2026-04-17T03:17:56.691184" elapsed="0.734824">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:17:56.682849" elapsed="0.743432">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:17:58.490975" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:58.490345" elapsed="0.000679"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:58.492358" 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-04-17T03:17:58.491771" elapsed="0.000698">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-04-17T03:17:58.492609" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:58.491269" elapsed="0.001377"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:58.493412" 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-04-17T03:17:58.492876" elapsed="0.000574"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:17:58.493780" 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-04-17T03:17:58.493975" 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-04-17T03:17:58.493625" elapsed="0.000377"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:58.494427" 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-04-17T03:17:58.494167" 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-04-17T03:17:58.495859" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:58.495362" elapsed="0.000575"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:17:58.496475" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:17:58.496109" elapsed="0.000392"/>
</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-04-17T03:17:58.496921" elapsed="0.000071"/>
</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-04-17T03:17:58.497831" elapsed="0.000054"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:17:58.498200" elapsed="0.000046"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:17:58.496725" elapsed="0.001644"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:17:58.496557" elapsed="0.001880"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:17:58.498496" elapsed="0.000052"/>
</return>
<msg time="2026-04-17T03:17:58.498723" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:17:58.494970" elapsed="0.003784"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:58.494560" elapsed="0.004311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:58.499095" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:58.498911" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:58.494532" elapsed="0.004642"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:17:58.499846" 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-04-17T03:17:58.499324" elapsed="0.000550"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:17:58.499939" 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-04-17T03:17:58.489216" elapsed="0.010856"/>
</kw>
<msg time="2026-04-17T03:17:58.500133" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:17:58.473070" elapsed="0.027121"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:17:58.513887" elapsed="0.000093"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:17:58.527099" elapsed="0.000070"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:17:58.541033" elapsed="0.000082"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:58.541457" 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-04-17T03:17:58.541709" 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-04-17T03:17:58.542297" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:58.542112" elapsed="0.000246"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:58.542090" elapsed="0.000296"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:58.542537" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:58.542709" 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-04-17T03:17:58.542878" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:17:58.542036" elapsed="0.000914"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:17:58.541819" elapsed="0.001163"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:58.543138" elapsed="0.000028"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:58.543231" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:17:58.543422" 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-04-17T03:17:58.468293" elapsed="0.075251"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:58.545447" 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-04-17T03:17:58.544996" elapsed="0.000543">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-04-17T03:17:58.545645" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:58.544502" elapsed="0.001168"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:58.546054" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:58.545754" elapsed="0.000360"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:17:58.546822" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:17:58.546386" elapsed="0.000474"/>
</kw>
<status status="PASS" start="2026-04-17T03:17:58.546142" elapsed="0.000771"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:58.545731" elapsed="0.001235"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:17:58.550431" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:17:58.547190" elapsed="0.003289"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:17:58.550574" elapsed="0.000063"/>
</return>
<msg time="2026-04-17T03:17:58.550849" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:17:58.544001" elapsed="0.006886"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:17:58.552763" 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-04-17T03:17:58.552390" elapsed="0.000480">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-04-17T03:17:58.553031" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:17:58.551843" elapsed="0.001226"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:17:58.553459" elapsed="0.000046"/>
</return>
<status status="PASS" start="2026-04-17T03:17:58.553182" elapsed="0.000372"/>
</branch>
<status status="PASS" start="2026-04-17T03:17:58.553150" elapsed="0.000439"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:58.553803" 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-04-17T03:17:58.554081" elapsed="0.000032"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:17:58.554181" elapsed="0.000023"/>
</return>
<msg time="2026-04-17T03:17:58.557031" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:17:58.551372" elapsed="0.005694"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:58.559239" 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-04-17T03:17:58.558801" elapsed="0.000512"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:17:58.559873" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:17:58.559539" elapsed="0.000421"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:17:58.566668" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:58.768527" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:59.170859" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:59.174781" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:17:58.563193" elapsed="0.616994">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:17:58.560067" elapsed="0.620260">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:59.180671" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:59.180377" elapsed="0.000394"/>
</branch>
<status status="FAIL" start="2026-04-17T03:17:58.560035" elapsed="0.620785">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:59.181399" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:59.181591" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:17:59.181540" elapsed="0.000102"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:59.181513" elapsed="0.000171"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:17:59.181874" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:17:59.181966" elapsed="0.000017"/>
</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-04-17T03:17:58.557566" elapsed="0.624525">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:59.182201" 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-04-17T03:17:58.444079" elapsed="0.738237">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:17:59.182608" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:17:59.182414" elapsed="0.000268"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:17:59.182396" elapsed="0.000310"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:17:59.182739" elapsed="0.000015"/>
</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="FAIL" start="2026-04-17T03:17:58.435992" elapsed="0.746851">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:17:58.426896" elapsed="0.756070">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:18:00.243888" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:00.243421" elapsed="0.000520"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:00.244916" 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-04-17T03:18:00.244495" elapsed="0.000530">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-04-17T03:18:00.245125" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:00.244131" elapsed="0.001019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:00.245719" 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-04-17T03:18:00.245322" elapsed="0.000425"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:18:00.246081" 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-04-17T03:18:00.246248" 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-04-17T03:18:00.245912" elapsed="0.000364"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:00.246796" 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-04-17T03:18:00.246526" elapsed="0.000318"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:00.248213" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:00.247730" elapsed="0.000546"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:18:00.248822" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:18:00.248445" elapsed="0.000405"/>
</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-04-17T03:18:00.249329" elapsed="0.000048"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:00.250167" elapsed="0.000054"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:18:00.250572" elapsed="0.000049"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:18:00.249131" elapsed="0.001613"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:18:00.248906" elapsed="0.001910"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:18:00.250872" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:18:00.251093" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:18:00.247350" elapsed="0.003769"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:00.246954" elapsed="0.004199"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:00.251397" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:00.251182" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:00.246904" elapsed="0.004607"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:18:00.252423" 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-04-17T03:18:00.251716" elapsed="0.000738"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:18:00.252508" 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-04-17T03:18:00.242524" elapsed="0.010158"/>
</kw>
<msg time="2026-04-17T03:18:00.252765" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:18:00.228607" elapsed="0.024237"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:00.268097" elapsed="0.000074"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:00.281493" 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//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-04-17T03:18:00.295667" elapsed="0.000046"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:00.295958" 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-04-17T03:18:00.296150" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:00.296575" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:00.296422" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:00.296404" 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-04-17T03:18:00.296803" 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-04-17T03:18:00.296985" 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-04-17T03:18:00.297153" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:18:00.296364" elapsed="0.000842"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:18:00.296232" elapsed="0.001002"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:00.297382" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:00.297464" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:18:00.297628" 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-04-17T03:18:00.223658" elapsed="0.073998"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:00.299279" 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-04-17T03:18:00.298964" elapsed="0.000395">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-04-17T03:18:00.299461" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:00.298440" elapsed="0.001048"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:00.299867" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:00.299564" elapsed="0.000386"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:18:00.300502" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:00.300189" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:00.299978" elapsed="0.000657"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:00.299545" elapsed="0.001114"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:00.303118" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:18:00.300819" elapsed="0.002326"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:18:00.303199" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:18:00.303359" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:18:00.298037" elapsed="0.005347"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:00.304709" 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-04-17T03:18:00.304446" elapsed="0.000345">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-04-17T03:18:00.304908" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:00.304048" elapsed="0.000904"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:18:00.305172" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-17T03:18:00.305029" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:00.305009" elapsed="0.000253"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:00.305440" elapsed="0.000026"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:00.305647" elapsed="0.000028"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:18:00.305726" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:18:00.310025" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:18:00.303696" elapsed="0.006361"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:00.311852" 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-04-17T03:18:00.311472" elapsed="0.000434"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:00.312386" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:00.312091" elapsed="0.000343"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:18:00.317809" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:00.519458" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:00.922266" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:00.925212" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:18:00.314701" elapsed="0.615133">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:18:00.312510" elapsed="0.617531">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:00.930431" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:00.930111" elapsed="0.000419"/>
</branch>
<status status="FAIL" start="2026-04-17T03:18:00.312487" elapsed="0.618078">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:00.931298" elapsed="0.000186"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:00.931663" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:18:00.931604" elapsed="0.000125"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:00.931575" elapsed="0.000185"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:00.931997" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:18:00.932101" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:18:00.310454" elapsed="0.621810">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:00.932375" 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-04-17T03:18:00.198509" elapsed="0.734035">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:00.932983" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:00.932697" elapsed="0.000418"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:00.932667" elapsed="0.000500"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:00.933219" elapsed="0.000022"/>
</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="FAIL" start="2026-04-17T03:18:00.191330" elapsed="0.742040">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:18:00.183523" elapsed="0.749995">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:18:01.998723" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:01.998273" elapsed="0.000486"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:01.999826" 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-04-17T03:18:01.999314" elapsed="0.000638">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-04-17T03:18:02.000086" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:01.998957" elapsed="0.001162"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:02.000831" 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-04-17T03:18:02.000346" elapsed="0.000515"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:18:02.001210" 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-04-17T03:18:02.001426" 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-04-17T03:18:02.001044" elapsed="0.000479"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:02.001983" 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-04-17T03:18:02.001695" elapsed="0.000336"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:02.003456" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:02.002916" elapsed="0.000613"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:18:02.004315" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:18:02.003789" elapsed="0.000556"/>
</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-04-17T03:18:02.004801" elapsed="0.000065"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:02.005596" 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-04-17T03:18:02.006043" elapsed="0.000049"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:18:02.004577" elapsed="0.001672"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:18:02.004402" elapsed="0.001942"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:18:02.006402" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:18:02.006587" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:18:02.002470" elapsed="0.004142"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:02.002114" elapsed="0.004531"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:02.006853" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:02.006683" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:02.002089" elapsed="0.004878"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:18:02.007718" 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-04-17T03:18:02.007145" elapsed="0.000604"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:18:02.007800" 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-04-17T03:18:01.997413" elapsed="0.010532"/>
</kw>
<msg time="2026-04-17T03:18:02.008005" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:18:01.983450" elapsed="0.024611"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:02.022223" 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-04-17T03:18:02.039487" elapsed="0.000062"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:18:02.053295" elapsed="0.000080"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:02.053664" elapsed="0.000129"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:02.054029" 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-04-17T03:18:02.054595" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:02.054385" elapsed="0.000285"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:02.054364" 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-04-17T03:18:02.054884" 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-04-17T03:18:02.055121" 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-04-17T03:18:02.055320" elapsed="0.000026"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:18:02.054314" elapsed="0.001070"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:18:02.054140" elapsed="0.001273"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:02.055618" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:02.055705" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:18:02.055897" 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-04-17T03:18:01.978982" elapsed="0.076972"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:02.057535" 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-04-17T03:18:02.057224" elapsed="0.000391">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-04-17T03:18:02.057712" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:02.056717" elapsed="0.001020"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:02.058106" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:02.057812" elapsed="0.000355"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:18:02.058731" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:02.058385" elapsed="0.000373"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:02.058193" elapsed="0.000609"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:02.057793" elapsed="0.001036"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:02.061708" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:18:02.059054" elapsed="0.002685"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:18:02.061800" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:18:02.062010" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:18:02.056346" elapsed="0.005693"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:02.063410" 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-04-17T03:18:02.063135" elapsed="0.000348">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-04-17T03:18:02.063608" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:02.062751" elapsed="0.000886"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:18:02.063863" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:18:02.063713" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:02.063692" elapsed="0.000285"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:02.064133" 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-04-17T03:18:02.064399" elapsed="0.000023"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:18:02.064469" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:18:02.066709" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:18:02.062392" elapsed="0.004345"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:02.068312" 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-04-17T03:18:02.068042" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:02.068793" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:02.068514" elapsed="0.000327"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:18:02.074106" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:02.275663" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:02.678256" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:02.681232" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:18:02.071029" elapsed="0.615780">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:18:02.068916" elapsed="0.618172">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:02.687772" elapsed="0.000085"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:02.687197" elapsed="0.002443"/>
</branch>
<status status="FAIL" start="2026-04-17T03:18:02.068894" elapsed="0.620817">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:02.690913" elapsed="0.000100"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:02.691387" elapsed="0.000043"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:18:02.691209" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:02.691153" elapsed="0.000407"/>
</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-04-17T03:18:02.692044" elapsed="0.000063"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:18:02.692229" elapsed="0.000038"/>
</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-04-17T03:18:02.067100" elapsed="0.625409">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:02.692699" elapsed="0.000039"/>
</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-04-17T03:18:01.954117" elapsed="0.738878">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:02.693411" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:02.693210" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:02.693191" elapsed="0.000323"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:02.693549" elapsed="0.000016"/>
</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="FAIL" start="2026-04-17T03:18:01.943874" elapsed="0.749783">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:18:01.934218" elapsed="0.759548">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:18:03.759998" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:03.759523" elapsed="0.000511"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:03.761087" 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-04-17T03:18:03.760579" elapsed="0.000596">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-04-17T03:18:03.761279" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:03.760220" elapsed="0.001084"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:03.761884" 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-04-17T03:18:03.761480" elapsed="0.000432"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:18:03.762256" 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-04-17T03:18:03.762424" 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-04-17T03:18:03.762104" elapsed="0.000346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:03.762903" 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-04-17T03:18:03.762624" elapsed="0.000347"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:03.764362" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:03.763877" elapsed="0.000550"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:18:03.765090" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:18:03.764596" elapsed="0.000526"/>
</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-04-17T03:18:03.765551" elapsed="0.000050"/>
</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-04-17T03:18:03.766350" 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-04-17T03:18:03.766692" elapsed="0.000048"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:18:03.765353" elapsed="0.001511"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:18:03.765181" elapsed="0.001766"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:18:03.767002" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:18:03.767188" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:18:03.763462" elapsed="0.003752"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:03.763058" elapsed="0.004267"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:03.767512" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:03.767355" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:03.763030" elapsed="0.004560"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:18:03.768282" 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-04-17T03:18:03.767739" elapsed="0.000572"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:18:03.768362" 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-04-17T03:18:03.758696" elapsed="0.009801"/>
</kw>
<msg time="2026-04-17T03:18:03.768558" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:18:03.745620" elapsed="0.022997"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:03.782662" elapsed="0.000073"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:03.795644" elapsed="0.000061"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:18:03.808567" elapsed="0.000068"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:03.808942" 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-04-17T03:18:03.809144" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:03.809598" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:03.809445" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:03.809425" 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-04-17T03:18:03.809827" 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-04-17T03:18:03.810010" 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-04-17T03:18:03.810177" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:18:03.809382" elapsed="0.000847"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:18:03.809228" elapsed="0.001030"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:03.810403" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:03.810483" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:18:03.810655" 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-04-17T03:18:03.740648" elapsed="0.070120"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:03.812261" 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-04-17T03:18:03.811966" elapsed="0.000370">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-04-17T03:18:03.812433" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:03.811547" elapsed="0.000911"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:03.812881" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:03.812538" elapsed="0.000418"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:18:03.813489" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:03.813177" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:03.812984" elapsed="0.000567"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:03.812514" elapsed="0.001058"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:03.816057" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:18:03.813726" elapsed="0.002362"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:18:03.816150" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:18:03.816331" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:18:03.811177" elapsed="0.005179"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:03.818031" 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-04-17T03:18:03.817701" elapsed="0.000412">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-04-17T03:18:03.818214" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:03.817238" elapsed="0.001000"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:18:03.818483" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-04-17T03:18:03.818321" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:03.818298" elapsed="0.000277"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:03.818727" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:03.818903" elapsed="0.000036"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:18:03.818988" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:18:03.821493" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:18:03.816828" elapsed="0.004718"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:03.823711" 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-04-17T03:18:03.823295" elapsed="0.000489"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:03.824283" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:03.823994" elapsed="0.000334"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:18:03.830160" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:04.031798" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:04.434832" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:04.437385" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:18:03.826735" elapsed="0.616281">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:18:03.824410" elapsed="0.618836">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:04.443815" elapsed="0.000072"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:04.443341" elapsed="0.000713"/>
</branch>
<status status="FAIL" start="2026-04-17T03:18:03.824384" elapsed="0.619736">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:04.445221" elapsed="0.000066"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:04.445564" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:18:04.445473" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:04.445421" elapsed="0.000296"/>
</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-04-17T03:18:04.446107" elapsed="0.000053"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:18:04.446273" elapsed="0.000036"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:18:03.822078" elapsed="0.624457">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:04.446717" elapsed="0.000038"/>
</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-04-17T03:18:03.713569" elapsed="0.733411">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:04.447698" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:04.447212" elapsed="0.000655"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:04.447164" elapsed="0.000760"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:04.448046" elapsed="0.000033"/>
</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="FAIL" start="2026-04-17T03:18:03.703331" elapsed="0.744956">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:18:03.694358" elapsed="0.754165">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:18:05.517893" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:05.517416" elapsed="0.000527"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:05.518909" 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-04-17T03:18:05.518500" elapsed="0.000514">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-04-17T03:18:05.519113" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:05.518128" elapsed="0.001010"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:05.519706" 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-04-17T03:18:05.519309" elapsed="0.000424"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:18:05.520059" 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-04-17T03:18:05.520220" 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-04-17T03:18:05.519897" elapsed="0.000349"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:05.520671" 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-04-17T03:18:05.520405" 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-04-17T03:18:05.522049" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:05.521526" elapsed="0.000586"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:18:05.522650" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:18:05.522276" elapsed="0.000400"/>
</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-04-17T03:18:05.523110" elapsed="0.000048"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:05.523872" elapsed="0.000077"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:18:05.524262" elapsed="0.000046"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:18:05.522905" elapsed="0.001528"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:18:05.522738" elapsed="0.001761"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:18:05.524552" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:18:05.524725" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:18:05.521171" elapsed="0.003578"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:05.520798" elapsed="0.003982"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:05.524979" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:05.524805" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:05.520775" elapsed="0.004281"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:18:05.525802" 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-04-17T03:18:05.525259" elapsed="0.000572"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:18:05.525880" 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-04-17T03:18:05.516581" elapsed="0.009445"/>
</kw>
<msg time="2026-04-17T03:18:05.526081" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:18:05.501350" elapsed="0.024805"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:05.539553" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:18:05.552363" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:05.566082" elapsed="0.000042"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:05.566348" 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-04-17T03:18:05.566537" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:05.566997" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:05.566806" elapsed="0.000253"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:05.566789" elapsed="0.000296"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:05.567238" 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-04-17T03:18:05.567562" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:05.567736" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:18:05.566734" elapsed="0.001056"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:18:05.566616" elapsed="0.001202"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:05.567987" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:05.568069" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:18:05.568221" 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-04-17T03:18:05.495656" elapsed="0.072593"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:05.569698" 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-04-17T03:18:05.569399" elapsed="0.000453">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-04-17T03:18:05.569982" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:05.569009" elapsed="0.001001"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:05.570356" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:05.570085" elapsed="0.000331"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:18:05.570956" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:05.570627" elapsed="0.000358"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:05.570441" elapsed="0.000634"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:05.570066" elapsed="0.001034"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:05.573466" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:18:05.571265" elapsed="0.002229"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:18:05.573547" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:18:05.573745" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:18:05.568620" elapsed="0.005159"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:05.575154" 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-04-17T03:18:05.574867" elapsed="0.000354">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-04-17T03:18:05.575320" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:05.574484" elapsed="0.000863"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:18:05.575560" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:18:05.575419" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:05.575400" elapsed="0.000248"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:05.575801" 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-04-17T03:18:05.576001" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:18:05.576071" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:18:05.578247" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:18:05.574141" elapsed="0.004145"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:05.580388" 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-04-17T03:18:05.580014" elapsed="0.000443"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:05.581157" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:05.580738" elapsed="0.000485"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:18:05.586713" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:05.788439" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:06.191157" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:06.193163" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:18:05.583807" elapsed="0.612695">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:18:05.581322" elapsed="0.615346">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:06.197079" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:06.196732" elapsed="0.000453"/>
</branch>
<status status="FAIL" start="2026-04-17T03:18:05.581295" elapsed="0.615926">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:06.197871" elapsed="0.000147"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:06.198281" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:18:06.198216" elapsed="0.000135"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:06.198178" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:06.198612" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:18:06.198718" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:18:05.578746" elapsed="0.620148">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:06.199100" elapsed="0.000031"/>
</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-04-17T03:18:05.470003" elapsed="0.729242">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:06.199592" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:06.199345" elapsed="0.000331"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:06.199328" elapsed="0.000372"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:06.199734" elapsed="0.000015"/>
</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="FAIL" start="2026-04-17T03:18:05.459842" elapsed="0.740024">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:18:05.449204" elapsed="0.750799">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:18:07.264127" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:07.263627" elapsed="0.000537"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:07.265155" 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-04-17T03:18:07.264703" elapsed="0.000549">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-04-17T03:18:07.265355" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:07.264347" elapsed="0.001033"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:07.266019" 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-04-17T03:18:07.265562" elapsed="0.000486"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:18:07.266397" 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-04-17T03:18:07.266566" 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-04-17T03:18:07.266221" elapsed="0.000460"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:07.267159" 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-04-17T03:18:07.266883" elapsed="0.000326"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:07.268589" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:07.268107" elapsed="0.000546"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:18:07.269253" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:18:07.268840" elapsed="0.000440"/>
</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-04-17T03:18:07.269725" elapsed="0.000051"/>
</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-04-17T03:18:07.270535" 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-04-17T03:18:07.270974" elapsed="0.000051"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:18:07.269500" elapsed="0.001649"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:18:07.269335" elapsed="0.001882"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:18:07.271269" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:18:07.271454" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:18:07.267672" elapsed="0.003817"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:07.267296" elapsed="0.004238"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:07.271757" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:07.271571" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:07.267270" elapsed="0.004581"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:18:07.272566" 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-04-17T03:18:07.272019" elapsed="0.000580"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:18:07.272648" 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-04-17T03:18:07.262701" elapsed="0.010078"/>
</kw>
<msg time="2026-04-17T03:18:07.272836" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:18:07.248260" elapsed="0.024642"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:07.286840" elapsed="0.000068"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:07.300659" elapsed="0.000064"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:18:07.313203" elapsed="0.000055"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:07.313496" elapsed="0.000110"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:07.313774" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:07.314218" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:07.314064" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:07.314047" 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-04-17T03:18:07.314445" 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-04-17T03:18:07.314614" 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-04-17T03:18:07.314812" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:18:07.314009" elapsed="0.000859"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:18:07.313856" elapsed="0.001039"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:07.315059" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:07.315140" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:18:07.315325" 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-04-17T03:18:07.243662" elapsed="0.071693"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:07.316801" 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-04-17T03:18:07.316509" elapsed="0.000368">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-04-17T03:18:07.316987" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:07.316107" elapsed="0.000905"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:07.317348" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:07.317083" elapsed="0.000323"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:18:07.317912" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:07.317615" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:07.317431" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:07.317065" elapsed="0.000947"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:07.320410" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:18:07.318163" elapsed="0.002274"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:18:07.320492" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:18:07.320657" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:18:07.315728" elapsed="0.004953"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:07.322013" 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-04-17T03:18:07.321724" elapsed="0.000359">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-04-17T03:18:07.322179" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:07.321382" elapsed="0.000824"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:18:07.322421" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:18:07.322281" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:07.322262" elapsed="0.000245"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:07.322655" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:07.323031" elapsed="0.000023"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:18:07.323101" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:18:07.327074" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:18:07.321039" elapsed="0.006066"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:07.328661" 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-04-17T03:18:07.328370" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:07.329131" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:07.328867" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:18:07.334194" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:07.535493" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:07.937830" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:07.939970" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:18:07.331415" elapsed="0.611128">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:18:07.329251" elapsed="0.613417">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:07.942976" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:07.942715" elapsed="0.000346"/>
</branch>
<status status="FAIL" start="2026-04-17T03:18:07.329231" elapsed="0.613865">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:07.943919" elapsed="0.000068"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:07.944232" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:18:07.944141" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:07.944101" elapsed="0.000291"/>
</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-04-17T03:18:07.944712" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:18:07.944843" elapsed="0.000025"/>
</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-04-17T03:18:07.327485" elapsed="0.617604">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:07.945258" elapsed="0.000035"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:18:07.216631" elapsed="0.728843">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:07.946215" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:07.945778" elapsed="0.000556"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:07.945741" elapsed="0.000629"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:07.946617" 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="FAIL" start="2026-04-17T03:18:07.207351" elapsed="0.739478">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:18:07.200662" elapsed="0.746416">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:18:09.007392" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:09.006902" elapsed="0.000528"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:09.008548" 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-04-17T03:18:09.008068" elapsed="0.000560">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-04-17T03:18:09.008730" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:09.007615" elapsed="0.001141"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:09.009412" 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-04-17T03:18:09.008976" elapsed="0.000464"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:18:09.009758" 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-04-17T03:18:09.009941" 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-04-17T03:18:09.009608" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:09.010423" 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-04-17T03:18:09.010137" elapsed="0.000334"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:09.011965" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:09.011345" elapsed="0.000700"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:18:09.012781" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:18:09.012265" elapsed="0.000552"/>
</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-04-17T03:18:09.013396" elapsed="0.000064"/>
</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-04-17T03:18:09.014333" elapsed="0.000056"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:18:09.014684" elapsed="0.000045"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:18:09.013136" elapsed="0.001731"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:18:09.012889" elapsed="0.002068"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:18:09.015015" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:18:09.015207" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:18:09.010916" elapsed="0.004317"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:09.010552" elapsed="0.004795"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:09.015535" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:09.015376" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:09.010528" elapsed="0.005085"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:18:09.016392" 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-04-17T03:18:09.015805" elapsed="0.000617"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:18:09.016474" 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-04-17T03:18:09.006183" elapsed="0.010423"/>
</kw>
<msg time="2026-04-17T03:18:09.016666" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:18:08.992369" elapsed="0.024357"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:09.030367" elapsed="0.000059"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:18:09.046201" elapsed="0.000073"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:18:09.059561" elapsed="0.000068"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:09.059944" 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-04-17T03:18:09.060156" 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-04-17T03:18:09.060703" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:09.060498" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:09.060479" 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-04-17T03:18:09.061007" 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-04-17T03:18:09.061184" 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-04-17T03:18:09.061352" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:18:09.060433" elapsed="0.000971"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:18:09.060249" elapsed="0.001183"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:09.061579" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:09.061659" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:18:09.061825" 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-04-17T03:18:08.987804" elapsed="0.074146"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:09.063429" 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-04-17T03:18:09.063136" elapsed="0.000368">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-04-17T03:18:09.063602" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:09.062714" elapsed="0.000914"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:09.064081" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:09.063702" elapsed="0.000440"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:18:09.064704" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:09.064370" elapsed="0.000360"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:09.064168" elapsed="0.000615"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:09.063684" elapsed="0.001138"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:09.067426" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:18:09.065011" elapsed="0.002452"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:18:09.067559" elapsed="0.000047"/>
</return>
<msg time="2026-04-17T03:18:09.067779" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:18:09.062337" elapsed="0.005499"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:09.069547" 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-04-17T03:18:09.069201" elapsed="0.000438">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-04-17T03:18:09.069759" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:09.068732" elapsed="0.001058"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:18:09.070084" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-17T03:18:09.069885" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:09.069861" elapsed="0.000340"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:09.070408" elapsed="0.000030"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:09.070643" elapsed="0.000027"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:18:09.070729" elapsed="0.000021"/>
</return>
<msg time="2026-04-17T03:18:09.073041" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:18:09.068286" elapsed="0.004789"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:09.074611" 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-04-17T03:18:09.074318" elapsed="0.000345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:09.075100" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:09.074824" elapsed="0.000334"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:18:09.080668" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:09.282475" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:09.685457" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:09.687837" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:18:09.077667" elapsed="0.613396">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:18:09.075230" elapsed="0.615996">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:09.691622" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:09.691296" elapsed="0.000429"/>
</branch>
<status status="FAIL" start="2026-04-17T03:18:09.075211" elapsed="0.616550">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:09.692449" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:09.692640" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:18:09.692588" elapsed="0.000108"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:09.692560" elapsed="0.000163"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:09.692960" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:18:09.693052" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:18:09.073440" elapsed="0.619774">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:09.693320" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:18:08.963757" elapsed="0.729696">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:09.693851" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:09.693579" elapsed="0.000389"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:09.693555" elapsed="0.000445"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:09.694042" elapsed="0.000018"/>
</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="FAIL" start="2026-04-17T03:18:08.955235" elapsed="0.738937">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:18:08.947875" elapsed="0.746430">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:18:10.760211" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:10.759702" elapsed="0.000546"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:10.761291" 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-04-17T03:18:10.760844" elapsed="0.000531">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-04-17T03:18:10.761491" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:10.760435" elapsed="0.001091"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:10.762169" 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-04-17T03:18:10.761733" elapsed="0.000464"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:18:10.762540" 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-04-17T03:18:10.762707" 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-04-17T03:18:10.762381" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:10.763193" 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-04-17T03:18:10.762898" elapsed="0.000342"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:10.764548" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:10.764080" elapsed="0.000534"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:18:10.765198" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:18:10.764801" elapsed="0.000425"/>
</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-04-17T03:18:10.765693" 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-04-17T03:18:10.766580" elapsed="0.000058"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:18:10.767010" elapsed="0.000053"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:18:10.765454" elapsed="0.001748"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:18:10.765281" elapsed="0.001998"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:18:10.767340" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:18:10.767554" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:18:10.763699" elapsed="0.003888"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:10.763323" elapsed="0.004304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:10.767836" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:10.767657" elapsed="0.000244"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:10.763297" elapsed="0.004654"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:18:10.768678" 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-04-17T03:18:10.768139" elapsed="0.000572"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:18:10.768771" elapsed="0.000089"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:10.758633" elapsed="0.010367"/>
</kw>
<msg time="2026-04-17T03:18:10.769069" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:18:10.741616" elapsed="0.027518"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:10.786190" elapsed="0.000098"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:10.799549" elapsed="0.000061"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:18:10.813458" elapsed="0.000090"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:10.813987" elapsed="0.000040"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:10.814311" 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-04-17T03:18:10.815097" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:10.814799" elapsed="0.000397"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:10.814768" elapsed="0.000476"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:10.815507" elapsed="0.000037"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:10.815828" elapsed="0.000036"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:10.816162" elapsed="0.000040"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:18:10.814698" elapsed="0.001569"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:18:10.814451" elapsed="0.001873"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:10.816632" elapsed="0.000045"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:10.816798" elapsed="0.000070"/>
</return>
<msg time="2026-04-17T03:18:10.817185" 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-04-17T03:18:10.736533" elapsed="0.080707"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:10.820095" 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-04-17T03:18:10.819488" elapsed="0.000742">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-04-17T03:18:10.820403" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:10.818654" elapsed="0.001795"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:10.821201" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:10.820586" elapsed="0.000727"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:18:10.822057" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:10.821626" elapsed="0.000466"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:10.821354" elapsed="0.000873"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:10.820550" elapsed="0.001709"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:10.825610" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:18:10.822478" elapsed="0.003167"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:18:10.825713" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:18:10.825918" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:18:10.817967" elapsed="0.008000"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:10.827639" 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-04-17T03:18:10.827359" elapsed="0.000354">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-04-17T03:18:10.827811" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:10.826883" elapsed="0.000953"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:18:10.828075" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:18:10.827911" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:10.827892" 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-04-17T03:18:10.828313" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:10.828500" elapsed="0.000033"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:18:10.828579" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:18:10.830800" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:18:10.826425" elapsed="0.004403"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:10.832312" 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-04-17T03:18:10.832041" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:10.832767" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:10.832518" elapsed="0.000345"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:18:10.838128" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:11.039821" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:11.442333" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:11.444841" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:18:10.835036" elapsed="0.614603">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:18:10.832949" elapsed="0.616930">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:11.450426" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:11.450003" elapsed="0.000520"/>
</branch>
<status status="FAIL" start="2026-04-17T03:18:10.832916" elapsed="0.617643">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:11.451220" elapsed="0.000147"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:11.451545" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:18:11.451484" elapsed="0.000129"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:11.451455" elapsed="0.000189"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:11.451864" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:18:11.451983" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:18:10.831177" elapsed="0.620976">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:11.452265" 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-04-17T03:18:10.711096" elapsed="0.741311">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:11.452823" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:11.452542" elapsed="0.000381"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:11.452518" elapsed="0.000460"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:11.453026" elapsed="0.000020"/>
</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="FAIL" start="2026-04-17T03:18:10.701621" elapsed="0.751603">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:18:10.694969" elapsed="0.758417">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:18:12.532454" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:12.531793" elapsed="0.000712"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:12.533989" 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-04-17T03:18:12.533322" elapsed="0.000780">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-04-17T03:18:12.534243" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:12.532763" elapsed="0.001519"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:12.535138" 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-04-17T03:18:12.534535" elapsed="0.000642"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:18:12.535580" 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-04-17T03:18:12.535784" 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-04-17T03:18:12.535398" elapsed="0.000502"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:12.536510" 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-04-17T03:18:12.536152" elapsed="0.000426"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:12.538579" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:12.537868" elapsed="0.000809"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:18:12.539539" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:18:12.538982" elapsed="0.000595"/>
</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-04-17T03:18:12.540187" elapsed="0.000068"/>
</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-04-17T03:18:12.541239" elapsed="0.000074"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:18:12.541744" elapsed="0.000129"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:18:12.539883" elapsed="0.002194"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:18:12.539652" elapsed="0.002531"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:18:12.542266" elapsed="0.000064"/>
</return>
<msg time="2026-04-17T03:18:12.542548" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:18:12.537241" elapsed="0.005348"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:12.536696" elapsed="0.005942"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:12.542913" elapsed="0.000084"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:12.542682" elapsed="0.000371"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:12.536658" elapsed="0.006428"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:18:12.544103" 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-04-17T03:18:12.543312" elapsed="0.000832"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:18:12.544219" 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/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-04-17T03:18:12.530619" elapsed="0.013793"/>
</kw>
<msg time="2026-04-17T03:18:12.544502" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:18:12.511451" elapsed="0.033134"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:12.563651" elapsed="0.000089"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:12.582441" elapsed="0.000087"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:18:12.600851" elapsed="0.000107"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:12.601309" elapsed="0.000135"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:12.601690" 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-04-17T03:18:12.602401" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:12.602160" elapsed="0.000331"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:12.602131" elapsed="0.000404"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:12.602746" elapsed="0.000046"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:12.603023" 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-04-17T03:18:12.603284" elapsed="0.000031"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:18:12.602068" elapsed="0.001296"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:18:12.601814" elapsed="0.001595"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:12.603623" elapsed="0.000030"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:12.603736" elapsed="0.000025"/>
</return>
<msg time="2026-04-17T03:18:12.603991" 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-04-17T03:18:12.504709" elapsed="0.099328"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:12.606258" 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-04-17T03:18:12.605743" elapsed="0.000630">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-04-17T03:18:12.606518" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:12.605149" elapsed="0.001406"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:12.607081" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:12.606658" elapsed="0.000507"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:18:12.607914" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:12.607478" elapsed="0.000497"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:12.607202" elapsed="0.000827"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:12.606632" elapsed="0.001431"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:12.611722" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:18:12.608300" elapsed="0.003466"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:18:12.611853" elapsed="0.000054"/>
</return>
<msg time="2026-04-17T03:18:12.612139" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:18:12.604587" elapsed="0.007591"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:12.614199" 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-04-17T03:18:12.613749" elapsed="0.000552">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-04-17T03:18:12.614439" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:12.613228" elapsed="0.001247"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:18:12.614794" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-04-17T03:18:12.614580" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:12.614554" elapsed="0.000393"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:12.615175" 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-04-17T03:18:12.615542" elapsed="0.000034"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:18:12.615648" elapsed="0.000024"/>
</return>
<msg time="2026-04-17T03:18:12.618800" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:18:12.612683" elapsed="0.006156"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:12.621071" 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-04-17T03:18:12.620647" elapsed="0.000493"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:12.621743" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:12.621373" 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-04-17T03:18:12.628885" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:12.830575" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:13.232779" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:13.234724" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:18:12.625118" elapsed="0.612269">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:18:12.621981" elapsed="0.615523">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:13.237784" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:13.237551" elapsed="0.000313"/>
</branch>
<status status="FAIL" start="2026-04-17T03:18:12.621950" elapsed="0.615948">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:13.238488" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:13.238674" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:18:13.238629" elapsed="0.000095"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:13.238601" elapsed="0.000144"/>
</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-04-17T03:18:13.238923" elapsed="0.000051"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:18:13.239028" 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-04-17T03:18:12.619348" elapsed="0.619803">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:13.239231" 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-04-17T03:18:12.470757" elapsed="0.768579">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:13.239837" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:13.239537" elapsed="0.000481"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:13.239511" elapsed="0.000546"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:13.240110" elapsed="0.000022"/>
</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="FAIL" start="2026-04-17T03:18:12.461301" elapsed="0.778968">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:18:12.454209" elapsed="0.786220">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:18:14.302781" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:14.302282" elapsed="0.000591"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:14.303862" 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-04-17T03:18:14.303451" elapsed="0.000519">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-04-17T03:18:14.304070" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:14.303089" elapsed="0.001006"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:14.304674" 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-04-17T03:18:14.304272" elapsed="0.000430"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:18:14.305027" 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-04-17T03:18:14.305191" 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-04-17T03:18:14.304865" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:14.305638" 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-04-17T03:18:14.305377" 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-04-17T03:18:14.307073" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:14.306518" elapsed="0.000618"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:18:14.307770" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:18:14.307316" elapsed="0.000481"/>
</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-04-17T03:18:14.308282" elapsed="0.000048"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:14.309074" 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-04-17T03:18:14.309422" elapsed="0.000046"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:18:14.308060" elapsed="0.001533"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:18:14.307851" elapsed="0.001811"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:18:14.309714" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:18:14.309893" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:18:14.306154" elapsed="0.003766"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:14.305766" elapsed="0.004268"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:14.310215" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:14.310062" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:14.305740" elapsed="0.004553"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:18:14.310997" 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-04-17T03:18:14.310440" elapsed="0.000591"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:18:14.311082" 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-04-17T03:18:14.301366" elapsed="0.009847"/>
</kw>
<msg time="2026-04-17T03:18:14.311270" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:18:14.286962" elapsed="0.024362"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:14.328660" elapsed="0.000072"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:14.342476" elapsed="0.000067"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:18:14.356078" elapsed="0.000077"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:14.356465" 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-04-17T03:18:14.356680" 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-04-17T03:18:14.357198" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:14.357037" elapsed="0.000236"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:14.357017" elapsed="0.000293"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:14.357476" 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-04-17T03:18:14.357702" 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-04-17T03:18:14.357963" elapsed="0.000029"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:18:14.356970" elapsed="0.001064"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:18:14.356768" elapsed="0.001299"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:14.358247" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:14.358345" elapsed="0.000025"/>
</return>
<msg time="2026-04-17T03:18:14.358567" 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-04-17T03:18:14.281912" elapsed="0.076778"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:14.360520" 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-04-17T03:18:14.360165" elapsed="0.000461">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-04-17T03:18:14.360730" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:14.359687" elapsed="0.001068"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:14.361151" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:14.360847" elapsed="0.000364"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:18:14.361763" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:14.361432" elapsed="0.000358"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:14.361236" elapsed="0.000590"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:14.360820" elapsed="0.001034"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:14.364631" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:18:14.362032" elapsed="0.002633"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:18:14.364735" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:18:14.364950" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:18:14.359228" elapsed="0.005751"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:14.366680" 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-04-17T03:18:14.366363" elapsed="0.000408">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-04-17T03:18:14.366962" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:14.365897" elapsed="0.001094"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:18:14.367224" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-17T03:18:14.367071" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:14.367051" elapsed="0.000285"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:14.367497" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:14.367706" elapsed="0.000024"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:18:14.367779" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:18:14.372303" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:18:14.365422" elapsed="0.006916"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:14.374326" 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-04-17T03:18:14.373943" elapsed="0.000454"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:14.374979" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:14.374615" elapsed="0.000418"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:18:14.380891" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:14.582358" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:14.985412" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:14.987834" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:18:14.377732" elapsed="0.615944">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:18:14.375118" elapsed="0.618846">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:14.994510" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:14.994064" elapsed="0.000605"/>
</branch>
<status status="FAIL" start="2026-04-17T03:18:14.375091" elapsed="0.619650">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:14.995844" elapsed="0.000064"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:14.996199" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:18:14.996111" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:14.996067" elapsed="0.000277"/>
</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-04-17T03:18:14.996770" elapsed="0.000056"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:18:14.996974" elapsed="0.000039"/>
</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-04-17T03:18:14.372775" elapsed="0.624461">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:14.997408" elapsed="0.000036"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:18:14.256120" elapsed="0.741508">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:14.998280" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:14.997836" elapsed="0.000609"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:14.997799" elapsed="0.000699"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:14.998570" elapsed="0.000031"/>
</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="FAIL" start="2026-04-17T03:18:14.248173" elapsed="0.750621">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:18:14.241064" elapsed="0.757984">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:18:16.057980" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:16.057555" elapsed="0.000461"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:16.058980" 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-04-17T03:18:16.058543" elapsed="0.000516">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-04-17T03:18:16.059158" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:16.058196" elapsed="0.000986"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:16.059742" 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-04-17T03:18:16.059351" elapsed="0.000418"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:18:16.060122" 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-04-17T03:18:16.060283" 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-04-17T03:18:16.059976" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:16.060726" 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-04-17T03:18:16.060469" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:16.062006" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:16.061546" elapsed="0.000523"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:18:16.062590" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:18:16.062232" 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-04-17T03:18:16.063116" elapsed="0.000058"/>
</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-04-17T03:18:16.064019" elapsed="0.000079"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:18:16.064460" elapsed="0.000058"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:18:16.062839" elapsed="0.001830"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:18:16.062671" elapsed="0.002081"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:18:16.064825" elapsed="0.000052"/>
</return>
<msg time="2026-04-17T03:18:16.065092" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:18:16.061190" elapsed="0.003939"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:16.060853" elapsed="0.004323"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:16.065405" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:16.065211" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:16.060828" elapsed="0.004677"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:18:16.066349" 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-04-17T03:18:16.065713" elapsed="0.000673"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:18:16.066454" 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//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-04-17T03:18:16.056909" elapsed="0.009729"/>
</kw>
<msg time="2026-04-17T03:18:16.066715" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:18:16.044025" elapsed="0.022767"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:16.081379" 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//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-04-17T03:18:16.095395" elapsed="0.000041"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:18:16.108458" elapsed="0.000035"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:16.108708" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:16.108911" elapsed="0.000038"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:16.109370" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:16.109196" elapsed="0.000236"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:16.109176" 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-04-17T03:18:16.109627" 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-04-17T03:18:16.109823" 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-04-17T03:18:16.110013" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:18:16.109136" elapsed="0.000935"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:18:16.109012" elapsed="0.001090"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:16.110255" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:16.110336" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:18:16.110496" 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-04-17T03:18:16.039710" elapsed="0.070815"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:16.112017" 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-04-17T03:18:16.111662" elapsed="0.000432">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-04-17T03:18:16.112190" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:16.111261" elapsed="0.000953"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:16.112549" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:16.112284" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:18:16.113129" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:16.112813" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:16.112631" elapsed="0.000618"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:16.112266" elapsed="0.001008"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:16.115693" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:18:16.113428" elapsed="0.002300"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:18:16.115791" elapsed="0.000059"/>
</return>
<msg time="2026-04-17T03:18:16.116000" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:18:16.110868" elapsed="0.005158"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:16.117373" 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-04-17T03:18:16.117135" elapsed="0.000302">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-04-17T03:18:16.117533" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:16.116778" elapsed="0.000779"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:18:16.117765" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:18:16.117627" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:16.117610" elapsed="0.000239"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:16.118011" 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-04-17T03:18:16.118185" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:18:16.118250" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:18:16.120388" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:18:16.116430" elapsed="0.003985"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:16.121984" 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-04-17T03:18:16.121578" elapsed="0.000453"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:16.122428" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:16.122185" 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-04-17T03:18:16.127602" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:16.329348" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:16.731665" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:16.734217" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:18:16.124638" elapsed="0.613372">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:18:16.122536" elapsed="0.615674">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:16.738630" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:16.738283" elapsed="0.000453"/>
</branch>
<status status="FAIL" start="2026-04-17T03:18:16.122519" elapsed="0.616263">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:16.739682" elapsed="0.000187"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:16.740130" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:18:16.740064" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:16.740019" elapsed="0.000274"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:16.740559" elapsed="0.000035"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:18:16.740668" elapsed="0.000034"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:18:16.120734" elapsed="0.620137">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:16.741016" 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-04-17T03:18:16.016449" elapsed="0.724723">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:16.741629" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:16.741315" elapsed="0.000423"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:16.741290" elapsed="0.000484"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:16.741839" elapsed="0.000021"/>
</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="FAIL" start="2026-04-17T03:18:16.010122" elapsed="0.731890">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:18:15.999883" elapsed="0.742285">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:18:17.805902" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:17.805478" elapsed="0.000481"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:17.806888" 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-04-17T03:18:17.806488" elapsed="0.000505">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-04-17T03:18:17.807093" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:17.806140" elapsed="0.000978"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:17.807684" 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-04-17T03:18:17.807288" elapsed="0.000425"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:18:17.808042" 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-04-17T03:18:17.808206" 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-04-17T03:18:17.807877" elapsed="0.000420"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:17.808724" 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-04-17T03:18:17.808463" 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-04-17T03:18:17.810103" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:17.809622" elapsed="0.000545"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:18:17.810704" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:18:17.810332" elapsed="0.000399"/>
</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-04-17T03:18:17.811174" elapsed="0.000047"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:17.811906" elapsed="0.000084"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:18:17.812281" elapsed="0.000047"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:18:17.810981" elapsed="0.001472"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:18:17.810786" elapsed="0.001736"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:18:17.812574" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:18:17.812751" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:18:17.809268" elapsed="0.003547"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:17.808883" elapsed="0.003974"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:17.813062" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:17.812891" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:17.808849" elapsed="0.004293"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:18:17.813748" 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-04-17T03:18:17.813290" elapsed="0.000486"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:18:17.813826" 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-04-17T03:18:17.804756" elapsed="0.009217"/>
</kw>
<msg time="2026-04-17T03:18:17.814029" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:18:17.791433" elapsed="0.022648"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:17.827845" elapsed="0.000044"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:18:17.840573" elapsed="0.000046"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:18:17.853720" elapsed="0.000047"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:17.854020" elapsed="0.000118"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:17.854312" 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-04-17T03:18:17.854791" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:17.854630" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:17.854612" 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-04-17T03:18:17.855051" 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-04-17T03:18:17.855227" 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-04-17T03:18:17.855395" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:18:17.854569" elapsed="0.000881"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:18:17.854425" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:17.855627" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:17.855707" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:18:17.855870" 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-04-17T03:18:17.785472" elapsed="0.070427"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:17.857593" 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-04-17T03:18:17.857264" elapsed="0.000409">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-04-17T03:18:17.857770" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:17.856840" elapsed="0.000956"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:17.858157" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:17.857866" elapsed="0.000351"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:18:17.858779" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:17.858438" elapsed="0.000371"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:17.858242" elapsed="0.000603"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:17.857848" elapsed="0.001018"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:17.861269" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:18:17.859038" elapsed="0.002258"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:18:17.861349" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:18:17.861511" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:18:17.856441" elapsed="0.005102"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:17.862860" 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-04-17T03:18:17.862617" elapsed="0.000323">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-17T03:18:17.863041" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:17.862231" elapsed="0.000835"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:18:17.863277" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:18:17.863136" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:17.863119" elapsed="0.000244"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:17.863513" 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-04-17T03:18:17.863734" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:18:17.863802" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:18:17.865953" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:18:17.861884" elapsed="0.004098"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:17.867422" 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-04-17T03:18:17.867158" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:17.867899" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:17.867646" elapsed="0.000316"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:18:17.872911" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:18.074536" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:18.476653" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:18.479690" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:18:17.870174" elapsed="0.615232">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:18:17.868031" elapsed="0.617603">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:18.486270" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:18.485726" elapsed="0.000711"/>
</branch>
<status status="FAIL" start="2026-04-17T03:18:17.868013" elapsed="0.618479">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:18.487269" elapsed="0.000043"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:18.487490" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:18:18.487429" elapsed="0.000130"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:18.487399" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:18.487817" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:18:18.487921" elapsed="0.000044"/>
</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-04-17T03:18:17.866304" elapsed="0.621815">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:18.488237" 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-04-17T03:18:17.758562" elapsed="0.729826">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:18.488910" elapsed="0.000066"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:18.488621" elapsed="0.000430"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:18.488593" elapsed="0.000497"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:18.489141" elapsed="0.000072"/>
</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="FAIL" start="2026-04-17T03:18:17.750158" elapsed="0.739194">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:18:17.742818" elapsed="0.746692">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:18:19.552201" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:19.551685" elapsed="0.000554"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:19.553236" 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-04-17T03:18:19.552788" elapsed="0.000530">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-04-17T03:18:19.553426" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:19.552425" elapsed="0.001032"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:19.554140" 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-04-17T03:18:19.553654" elapsed="0.000515"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:18:19.554512" 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-04-17T03:18:19.554680" 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-04-17T03:18:19.554338" elapsed="0.000368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:19.555235" 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-04-17T03:18:19.554895" 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-04-17T03:18:19.556668" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:19.556203" elapsed="0.000528"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:18:19.557295" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:18:19.556905" 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-04-17T03:18:19.557765" elapsed="0.000056"/>
</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-04-17T03:18:19.558568" elapsed="0.000054"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:18:19.558964" elapsed="0.000051"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:18:19.557547" elapsed="0.001596"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:18:19.557379" elapsed="0.001834"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:18:19.559266" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:18:19.559448" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:18:19.555819" elapsed="0.003655"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:19.555405" elapsed="0.004173"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:19.559768" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:19.559609" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:19.555371" elapsed="0.004485"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:18:19.560524" 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-04-17T03:18:19.560027" elapsed="0.000526"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:18:19.560603" 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-04-17T03:18:19.550648" elapsed="0.010086"/>
</kw>
<msg time="2026-04-17T03:18:19.560793" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:18:19.536532" elapsed="0.024324"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:19.574677" elapsed="0.000064"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:18:19.588200" 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/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-04-17T03:18:19.602235" elapsed="0.000064"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:19.602688" 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-04-17T03:18:19.603162" 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-04-17T03:18:19.603747" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:19.603539" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:19.603514" 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-04-17T03:18:19.604081" 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-04-17T03:18:19.604318" 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-04-17T03:18:19.604549" elapsed="0.000028"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:18:19.603459" elapsed="0.001162"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:18:19.603274" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:19.604865" elapsed="0.000028"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:19.604993" elapsed="0.000025"/>
</return>
<msg time="2026-04-17T03:18:19.605209" 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-04-17T03:18:19.531628" elapsed="0.073704"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:19.607358" 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-04-17T03:18:19.606967" elapsed="0.000489">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-04-17T03:18:19.607582" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:19.606389" elapsed="0.001228"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:19.608095" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:19.607716" elapsed="0.000455"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:18:19.608855" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:19.608452" elapsed="0.000438"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:19.608203" elapsed="0.000754"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:19.607691" elapsed="0.001297"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:19.612452" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:18:19.609197" elapsed="0.003290"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:18:19.612558" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:18:19.612970" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:18:19.605886" elapsed="0.007121"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:19.614710" 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-04-17T03:18:19.614393" elapsed="0.000406">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-04-17T03:18:19.614942" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:19.613915" elapsed="0.001062"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:18:19.615248" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-17T03:18:19.615071" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:19.615047" elapsed="0.000316"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:19.615564" 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-04-17T03:18:19.615803" elapsed="0.000030"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:18:19.615895" elapsed="0.000021"/>
</return>
<msg time="2026-04-17T03:18:19.618889" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:18:19.613432" elapsed="0.005512"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:19.620873" 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-04-17T03:18:19.620519" elapsed="0.000437"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:19.621494" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:19.621173" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:18:19.628287" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:19.829880" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:20.232478" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:20.235583" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:18:19.624636" elapsed="0.615701">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:18:19.621643" elapsed="0.618857">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:20.240908" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:20.240566" elapsed="0.000471"/>
</branch>
<status status="FAIL" start="2026-04-17T03:18:19.621617" elapsed="0.619456">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:20.241872" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:20.242211" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:18:20.242091" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:20.242059" elapsed="0.000257"/>
</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-04-17T03:18:20.242594" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:18:20.242687" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:18:19.619385" elapsed="0.623444">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:20.242960" elapsed="0.000029"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:18:19.507133" elapsed="0.735964">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:20.243406" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:20.243200" elapsed="0.000282"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:20.243180" elapsed="0.000326"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:20.243538" elapsed="0.000016"/>
</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="FAIL" start="2026-04-17T03:18:19.500393" elapsed="0.743308">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:18:19.490428" elapsed="0.753394">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:18:21.307438" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:21.306819" elapsed="0.000659"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:21.308557" 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-04-17T03:18:21.308095" elapsed="0.000554">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-04-17T03:18:21.308754" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:21.307684" elapsed="0.001096"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:21.309414" 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-04-17T03:18:21.308983" elapsed="0.000460"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:18:21.309765" 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-04-17T03:18:21.310084" 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-04-17T03:18:21.309613" elapsed="0.000499"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:21.310533" 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-04-17T03:18:21.310277" 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-04-17T03:18:21.312113" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:21.311578" elapsed="0.000600"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:18:21.312817" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:18:21.312348" 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-04-17T03:18:21.313295" elapsed="0.000047"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:21.314106" 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-04-17T03:18:21.314459" elapsed="0.000048"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:18:21.313099" elapsed="0.001533"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:18:21.312901" elapsed="0.001859"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:18:21.314818" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:18:21.315025" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:18:21.311162" elapsed="0.003889"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:21.310662" elapsed="0.004424"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:21.315271" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:21.315115" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:21.310637" elapsed="0.004712"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:18:21.316010" 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-04-17T03:18:21.315497" elapsed="0.000541"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:18:21.316088" 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-04-17T03:18:21.305641" elapsed="0.010576"/>
</kw>
<msg time="2026-04-17T03:18:21.316276" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:18:21.291653" elapsed="0.024681"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:21.330979" elapsed="0.000070"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:21.347379" elapsed="0.000127"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:18:21.361117" elapsed="0.000081"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:21.361595" elapsed="0.000036"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:21.361878" 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-04-17T03:18:21.362595" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:21.362334" elapsed="0.000355"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:21.362307" elapsed="0.000461"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:21.363031" 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-04-17T03:18:21.363290" 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-04-17T03:18:21.363539" elapsed="0.000030"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:18:21.362222" elapsed="0.001397"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:18:21.362028" elapsed="0.001632"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:21.363881" elapsed="0.000030"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:21.364020" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:18:21.364260" 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-04-17T03:18:21.287071" elapsed="0.077231"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:21.367324" 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-04-17T03:18:21.366528" elapsed="0.000934">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-04-17T03:18:21.367621" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:21.365753" elapsed="0.001903"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:21.368037" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:21.367740" elapsed="0.000356"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:18:21.368658" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:21.368326" elapsed="0.000359"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:21.368124" elapsed="0.000668"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:21.367716" elapsed="0.001100"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:21.371532" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:18:21.368993" elapsed="0.002574"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:18:21.371638" elapsed="0.000045"/>
</return>
<msg time="2026-04-17T03:18:21.371830" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:18:21.365187" elapsed="0.006669"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:21.373557" 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-04-17T03:18:21.373253" elapsed="0.000381">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-04-17T03:18:21.373736" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:21.372732" elapsed="0.001029"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:18:21.374022" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-04-17T03:18:21.373839" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:21.373817" elapsed="0.000324"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:21.374336" elapsed="0.000026"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:21.374521" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:18:21.374589" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:18:21.378988" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:18:21.372338" elapsed="0.006688"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:21.380749" 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-04-17T03:18:21.380375" elapsed="0.000430"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:21.381242" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:21.380988" 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="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:18:21.386514" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:21.588318" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:21.990524" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:21.992765" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:18:21.383568" elapsed="0.613399">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:18:21.381362" elapsed="0.615775">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:21.997527" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:21.997201" elapsed="0.000430"/>
</branch>
<status status="FAIL" start="2026-04-17T03:18:21.381339" elapsed="0.616328">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:21.998413" elapsed="0.000124"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:21.998751" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:18:21.998688" elapsed="0.000133"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:21.998652" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:21.999136" elapsed="0.000040"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:18:21.999272" 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-04-17T03:18:21.379452" elapsed="0.620017">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:21.999604" elapsed="0.000031"/>
</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-04-17T03:18:21.261649" elapsed="0.738160">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:22.000442" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:22.000049" elapsed="0.000542"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:22.000012" elapsed="0.000628"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:22.000701" elapsed="0.000023"/>
</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="FAIL" start="2026-04-17T03:18:21.253659" elapsed="0.747200">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:18:21.244648" elapsed="0.756389">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:18:23.064022" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:23.063397" elapsed="0.000673"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:23.065342" 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-04-17T03:18:23.064798" elapsed="0.000640">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-04-17T03:18:23.065560" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:23.064318" elapsed="0.001271"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:23.066312" 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-04-17T03:18:23.065807" elapsed="0.000539"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:18:23.066730" 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-04-17T03:18:23.066960" 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-04-17T03:18:23.066552" elapsed="0.000524"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:23.067637" 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-04-17T03:18:23.067279" elapsed="0.000419"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:23.069256" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:23.068713" elapsed="0.000609"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:18:23.069863" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:18:23.069491" elapsed="0.000399"/>
</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-04-17T03:18:23.070325" elapsed="0.000047"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:23.071093" 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-04-17T03:18:23.071447" elapsed="0.000047"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:18:23.070134" elapsed="0.001510"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:18:23.069965" elapsed="0.001750"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:18:23.071769" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:18:23.071967" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:18:23.068296" elapsed="0.003698"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:23.067798" elapsed="0.004229"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:23.072206" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:23.072053" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:23.067767" elapsed="0.004517"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:18:23.072981" 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-04-17T03:18:23.072455" elapsed="0.000556"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:18:23.073061" 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-04-17T03:18:23.062420" elapsed="0.010770"/>
</kw>
<msg time="2026-04-17T03:18:23.073247" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:18:23.045569" elapsed="0.027734"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:23.087439" elapsed="0.000056"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:18:23.100705" 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/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-04-17T03:18:23.114250" elapsed="0.000035"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:23.114500" elapsed="0.000108"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:23.114777" 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-04-17T03:18:23.115251" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:23.115092" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:23.115073" 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-04-17T03:18:23.115505" 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-04-17T03:18:23.115720" 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-04-17T03:18:23.115898" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:18:23.115032" elapsed="0.000937"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:18:23.114865" elapsed="0.001133"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:23.116147" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:23.116229" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:18:23.116393" 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-04-17T03:18:23.038745" elapsed="0.077677"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:23.117915" 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-04-17T03:18:23.117620" elapsed="0.000394">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-04-17T03:18:23.118112" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:23.117207" elapsed="0.000931"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:23.118483" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:23.118211" elapsed="0.000331"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:18:23.119085" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:23.118758" elapsed="0.000354"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:23.118568" elapsed="0.000580"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:23.118191" elapsed="0.000978"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:23.121612" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:18:23.119321" elapsed="0.002318"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:18:23.121695" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:18:23.121865" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:18:23.116816" elapsed="0.005073"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:23.123201" 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-04-17T03:18:23.122953" elapsed="0.000330">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-04-17T03:18:23.123392" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:23.122594" elapsed="0.000823"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:18:23.123667" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-17T03:18:23.123490" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:23.123471" 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-04-17T03:18:23.123945" elapsed="0.000026"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:23.124194" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:18:23.124263" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:18:23.126443" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:18:23.122252" elapsed="0.004218"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:23.127952" 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-04-17T03:18:23.127673" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:23.128402" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:23.128157" 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-04-17T03:18:23.133867" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:23.335255" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:23.737531" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:23.740239" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:18:23.130707" elapsed="0.614998">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:18:23.128512" elapsed="0.617340">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:23.746253" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:23.745922" elapsed="0.000431"/>
</branch>
<status status="FAIL" start="2026-04-17T03:18:23.128494" elapsed="0.617894">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:23.747060" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:23.747268" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:18:23.747211" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:23.747182" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:23.747568" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:18:23.747667" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:18:23.126798" elapsed="0.621037">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:23.748003" elapsed="0.000027"/>
</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-04-17T03:18:23.014322" elapsed="0.733834">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:23.748637" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:23.748370" elapsed="0.000374"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:23.748345" elapsed="0.000432"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:23.748826" elapsed="0.000021"/>
</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="FAIL" start="2026-04-17T03:18:23.007673" elapsed="0.741339">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:18:23.001811" elapsed="0.747355">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:18:24.813735" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:24.813306" elapsed="0.000464"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:24.814726" 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-04-17T03:18:24.814311" elapsed="0.000491">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-04-17T03:18:24.814901" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:24.813962" elapsed="0.000987"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:24.815523" 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-04-17T03:18:24.815124" elapsed="0.000427"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:18:24.815868" 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-04-17T03:18:24.816057" 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-04-17T03:18:24.815718" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:24.816501" 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-04-17T03:18:24.816246" 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-04-17T03:18:24.817799" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:24.817349" elapsed="0.000512"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:18:24.818405" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:18:24.818041" elapsed="0.000390"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:24.818838" 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-04-17T03:18:24.819576" 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-04-17T03:18:24.819913" elapsed="0.000073"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:18:24.818648" elapsed="0.001458"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:18:24.818485" elapsed="0.001689"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:18:24.820226" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:18:24.820400" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:18:24.816996" elapsed="0.003429"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:24.816643" elapsed="0.003913"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:24.820736" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:24.820584" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:24.816620" elapsed="0.004196"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:18:24.821434" 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-04-17T03:18:24.820978" elapsed="0.000485"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:18:24.821514" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:24.812620" elapsed="0.009021"/>
</kw>
<msg time="2026-04-17T03:18:24.821698" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:18:24.799712" 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/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-04-17T03:18:24.834602" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:18:24.847425" elapsed="0.000050"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:18:24.860303" elapsed="0.000038"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:24.860588" 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-04-17T03:18:24.860776" 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-04-17T03:18:24.861206" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:24.861052" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:24.861034" 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-04-17T03:18:24.861432" 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-04-17T03:18:24.861600" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:24.861766" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:18:24.860994" elapsed="0.000830"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:18:24.860862" elapsed="0.000990"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:24.862015" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:24.862096" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:18:24.862248" 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-04-17T03:18:24.794520" elapsed="0.067831"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:24.863815" 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-04-17T03:18:24.863487" elapsed="0.000404">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-04-17T03:18:24.864005" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:24.863064" elapsed="0.000966"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:24.864369" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:24.864102" elapsed="0.000325"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:18:24.864965" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:24.864649" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:24.864452" elapsed="0.000577"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:24.864085" elapsed="0.000965"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:24.867412" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:18:24.865213" elapsed="0.002226"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:18:24.867491" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:18:24.867649" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:18:24.862693" elapsed="0.004981"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:24.868976" 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-04-17T03:18:24.868724" elapsed="0.000317">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-04-17T03:18:24.869136" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:24.868330" elapsed="0.000831"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:18:24.869370" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:18:24.869233" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:24.869215" elapsed="0.000240"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:24.869601" 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-04-17T03:18:24.869772" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:18:24.869838" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:18:24.871967" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:18:24.867999" elapsed="0.003997"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:24.873430" 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-04-17T03:18:24.873170" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:24.873873" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:24.873630" 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-04-17T03:18:24.879026" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:25.080392" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:25.482410" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:25.484313" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:18:24.876068" elapsed="0.610668">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:18:24.873999" elapsed="0.612845">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:25.487155" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:25.486890" elapsed="0.000340"/>
</branch>
<status status="FAIL" start="2026-04-17T03:18:24.873981" elapsed="0.613275">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:25.487720" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:25.487871" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:18:25.487828" elapsed="0.000302"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:25.487808" elapsed="0.000347"/>
</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-04-17T03:18:25.488309" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:18:25.488382" elapsed="0.000017"/>
</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-04-17T03:18:24.872313" elapsed="0.616189">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:25.488584" 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-04-17T03:18:24.766572" elapsed="0.722117">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:25.489015" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:25.488790" elapsed="0.000302"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:25.488771" elapsed="0.000347"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:25.489153" elapsed="0.000015"/>
</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="FAIL" start="2026-04-17T03:18:24.757962" elapsed="0.731297">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:18:24.750025" elapsed="0.739341">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:18:26.548650" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:26.548156" elapsed="0.000531"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:26.549766" 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-04-17T03:18:26.549242" elapsed="0.000614">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-04-17T03:18:26.550004" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:26.548871" elapsed="0.001160"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:26.550601" 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-04-17T03:18:26.550203" elapsed="0.000426"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:18:26.550996" 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-04-17T03:18:26.551171" 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-04-17T03:18:26.550820" elapsed="0.000378"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:26.551623" 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-04-17T03:18:26.551366" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:26.552909" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:26.552449" elapsed="0.000539"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:18:26.553593" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:18:26.553154" elapsed="0.000469"/>
</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-04-17T03:18:26.554076" elapsed="0.000047"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:26.554822" 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-04-17T03:18:26.555190" elapsed="0.000046"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:18:26.553863" elapsed="0.001494"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:18:26.553678" elapsed="0.001746"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:18:26.555476" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:18:26.555648" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:18:26.552095" elapsed="0.003579"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:26.551748" elapsed="0.003957"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:26.555888" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:26.555730" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:26.551725" elapsed="0.004256"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:18:26.556580" 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-04-17T03:18:26.556126" elapsed="0.000482"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:18:26.556656" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:26.547422" elapsed="0.009358"/>
</kw>
<msg time="2026-04-17T03:18:26.556833" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:18:26.534220" elapsed="0.022663"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:26.570889" 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-04-17T03:18:26.583657" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:18:26.596422" elapsed="0.000039"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:26.596675" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:26.596858" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:26.597280" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:26.597130" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:26.597113" 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-04-17T03:18:26.597599" 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-04-17T03:18:26.597791" 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-04-17T03:18:26.598017" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:18:26.597076" elapsed="0.000996"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:18:26.596952" elapsed="0.001146"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:26.598245" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:26.598323" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:18:26.598484" 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-04-17T03:18:26.529834" elapsed="0.068678"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:26.599970" 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-04-17T03:18:26.599657" elapsed="0.000391">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-04-17T03:18:26.600142" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:26.599257" elapsed="0.000910"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:26.600500" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:26.600237" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:18:26.601078" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:26.600760" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:26.600580" elapsed="0.000615"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:26.600219" elapsed="0.001000"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:26.603669" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:18:26.601418" elapsed="0.002278"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:18:26.603747" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:18:26.603906" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:18:26.598880" elapsed="0.005064"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:26.605227" 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-04-17T03:18:26.604961" elapsed="0.000345">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-04-17T03:18:26.605425" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:26.604588" elapsed="0.000915"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:18:26.605725" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:18:26.605584" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:26.605565" elapsed="0.000252"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:26.605981" elapsed="0.000024"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:26.606157" elapsed="0.000025"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:18:26.606228" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:18:26.608294" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:18:26.604253" elapsed="0.004067"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:26.609786" 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-04-17T03:18:26.609511" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:26.610335" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:26.610008" 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-04-17T03:18:26.615238" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:26.831379" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:27.234148" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:27.237218" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:18:26.612514" elapsed="0.630692">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:18:26.610447" elapsed="0.632965">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:27.243836" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:27.243499" elapsed="0.000459"/>
</branch>
<status status="FAIL" start="2026-04-17T03:18:26.610429" elapsed="0.633565">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:27.244656" elapsed="0.000112"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:27.244960" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:18:27.244882" elapsed="0.000145"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:27.244855" elapsed="0.000203"/>
</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-04-17T03:18:27.245279" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:18:27.245382" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:18:26.608640" elapsed="0.636927">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:27.245715" elapsed="0.000032"/>
</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-04-17T03:18:26.507036" elapsed="0.738962">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:27.246650" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:27.246314" elapsed="0.000444"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:27.246288" elapsed="0.000505"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:27.246839" 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="FAIL" start="2026-04-17T03:18:26.498445" elapsed="0.748554">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:18:26.490309" elapsed="0.756803">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:18:28.306136" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:28.305631" elapsed="0.000541"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:28.307219" 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-04-17T03:18:28.306752" elapsed="0.000547">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-04-17T03:18:28.307400" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:28.306398" elapsed="0.001028"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:28.308021" 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-04-17T03:18:28.307601" elapsed="0.000450"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:18:28.308391" 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-04-17T03:18:28.308566" 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-04-17T03:18:28.308216" elapsed="0.000456"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:28.309178" 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-04-17T03:18:28.308846" elapsed="0.000380"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:28.310689" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:28.310099" elapsed="0.000655"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:18:28.311395" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:18:28.310953" elapsed="0.000469"/>
</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-04-17T03:18:28.311858" elapsed="0.000048"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:28.312642" 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-04-17T03:18:28.313005" elapsed="0.000047"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:18:28.311658" elapsed="0.001517"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:18:28.311478" elapsed="0.001767"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:18:28.313298" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:18:28.313480" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:18:28.309683" elapsed="0.003822"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:28.309311" elapsed="0.004227"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:28.313720" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:28.313565" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:28.309286" elapsed="0.004514"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:18:28.314507" 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-04-17T03:18:28.313963" elapsed="0.000576"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:18:28.314590" 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-04-17T03:18:28.304853" elapsed="0.009865"/>
</kw>
<msg time="2026-04-17T03:18:28.314774" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:18:28.291485" elapsed="0.023344"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:28.330318" elapsed="0.000116"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:28.348810" elapsed="0.000046"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:18:28.364457" elapsed="0.000032"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:28.364695" elapsed="0.000107"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:28.364989" 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-04-17T03:18:28.365404" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:28.365250" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:28.365233" 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-04-17T03:18:28.365629" 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-04-17T03:18:28.365807" 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-04-17T03:18:28.365998" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:18:28.365195" elapsed="0.000858"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:18:28.365074" elapsed="0.001005"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:28.366228" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:28.366307" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:18:28.366480" 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-04-17T03:18:28.286762" elapsed="0.079747"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:28.367952" 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-04-17T03:18:28.367633" elapsed="0.000397">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-04-17T03:18:28.368126" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:28.367227" elapsed="0.000937"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:28.368501" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:28.368236" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:18:28.369123" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:28.368764" elapsed="0.000385"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:28.368583" elapsed="0.000601"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:28.368218" elapsed="0.000987"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:28.371604" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:18:28.369356" elapsed="0.002275"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:18:28.371684" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:18:28.371844" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:18:28.366848" elapsed="0.005021"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:28.373255" 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-04-17T03:18:28.372871" elapsed="0.000449">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-04-17T03:18:28.373415" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:28.372532" elapsed="0.000908"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:18:28.373646" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:18:28.373510" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:28.373492" elapsed="0.000239"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:28.373877" 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-04-17T03:18:28.374113" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:18:28.374181" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:18:28.378286" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:18:28.372204" elapsed="0.006110"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:28.379822" 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-04-17T03:18:28.379557" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:28.380283" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:28.380039" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:18:28.385241" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:28.586753" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:28.990005" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:28.992645" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:18:28.382475" elapsed="0.614798">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:18:28.380394" elapsed="0.617027">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:28.997811" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:28.997480" elapsed="0.000439"/>
</branch>
<status status="FAIL" start="2026-04-17T03:18:28.380375" elapsed="0.617613">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:28.998597" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:28.998818" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:18:28.998763" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:28.998735" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:28.999133" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:18:28.999249" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:18:28.378685" elapsed="0.620742">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:28.999539" 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-04-17T03:18:28.263772" elapsed="0.735905">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:29.000230" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:28.999879" elapsed="0.000458"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:28.999855" elapsed="0.000515"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:29.000415" elapsed="0.000020"/>
</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="FAIL" start="2026-04-17T03:18:28.254381" elapsed="0.746177">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:18:28.247654" elapsed="0.753045">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:18:30.084070" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:30.083640" elapsed="0.000464"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:30.085067" 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-04-17T03:18:30.084627" elapsed="0.000521">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-04-17T03:18:30.085247" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:30.084283" elapsed="0.000990"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:30.085849" 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-04-17T03:18:30.085446" elapsed="0.000432"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:18:30.086212" 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-04-17T03:18:30.086377" 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-04-17T03:18:30.086064" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:30.086829" 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-04-17T03:18:30.086571" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:30.088280" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:30.087789" elapsed="0.000557"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:18:30.088880" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:18:30.088512" elapsed="0.000395"/>
</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-04-17T03:18:30.089366" elapsed="0.000049"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:30.090173" 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-04-17T03:18:30.090523" elapsed="0.000046"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:18:30.089170" elapsed="0.001526"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:18:30.088989" elapsed="0.001775"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:18:30.090815" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:18:30.091009" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:18:30.087387" elapsed="0.003648"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:30.086973" elapsed="0.004154"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:30.091338" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:30.091154" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:30.086946" elapsed="0.004486"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:18:30.092095" 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-04-17T03:18:30.091611" elapsed="0.000512"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:18:30.092174" 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-04-17T03:18:30.082955" elapsed="0.009348"/>
</kw>
<msg time="2026-04-17T03:18:30.092360" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:18:30.068643" elapsed="0.023770"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:30.105408" elapsed="0.000042"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:18:30.118214" 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-04-17T03:18:30.130916" elapsed="0.000057"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:30.131339" 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-04-17T03:18:30.131564" 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-04-17T03:18:30.132037" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:30.131847" elapsed="0.000250"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:30.131827" elapsed="0.000296"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:30.132272" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:30.132441" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:30.132608" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:18:30.131786" elapsed="0.000875"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:18:30.131653" elapsed="0.001036"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:30.132865" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:30.132973" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:18:30.133142" 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-04-17T03:18:30.063658" elapsed="0.069607"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:30.134823" 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-04-17T03:18:30.134519" elapsed="0.000384">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-04-17T03:18:30.135019" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:30.134060" elapsed="0.001002"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:30.135451" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:30.135144" elapsed="0.000367"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:18:30.136043" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:30.135720" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:30.135535" elapsed="0.000570"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:30.135125" elapsed="0.001000"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:30.138623" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:18:30.136277" elapsed="0.002375"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:18:30.138706" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:18:30.138869" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:18:30.133660" elapsed="0.005234"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:30.140241" 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-04-17T03:18:30.140001" elapsed="0.000306">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-04-17T03:18:30.140402" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:30.139642" elapsed="0.000784"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:18:30.140632" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:18:30.140497" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:30.140478" elapsed="0.000239"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:30.140866" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:30.141061" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:18:30.141128" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:18:30.143544" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:18:30.139241" elapsed="0.004331"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:30.145116" 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-04-17T03:18:30.144836" elapsed="0.000511"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:30.145751" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:30.145503" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:18:30.150999" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:30.352460" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:30.755094" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:30.757778" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:18:30.148007" elapsed="0.614882">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:18:30.145861" elapsed="0.617283">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:30.763718" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:30.763233" elapsed="0.000644"/>
</branch>
<status status="FAIL" start="2026-04-17T03:18:30.145843" elapsed="0.618120">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:30.764469" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:30.764621" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:18:30.764578" elapsed="0.000090"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:30.764557" elapsed="0.000132"/>
</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-04-17T03:18:30.764839" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:18:30.764909" 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-04-17T03:18:30.144000" elapsed="0.621049">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:30.765129" 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-04-17T03:18:30.038278" elapsed="0.726955">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:30.765612" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:30.765362" elapsed="0.000346"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:30.765332" elapsed="0.000408"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:30.765783" elapsed="0.000018"/>
</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="FAIL" start="2026-04-17T03:18:30.032083" elapsed="0.733833">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:18:30.021303" elapsed="0.744751">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:18:31.835097" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:31.834500" elapsed="0.000637"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:31.836288" 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-04-17T03:18:31.835697" elapsed="0.000675">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-04-17T03:18:31.836475" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:31.835332" elapsed="0.001169"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:31.837142" 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-04-17T03:18:31.836675" elapsed="0.000495"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:18:31.837494" 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-04-17T03:18:31.837691" 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-04-17T03:18:31.837343" elapsed="0.000376"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:31.838189" 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-04-17T03:18:31.837905" 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-04-17T03:18:31.839587" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:31.839123" elapsed="0.000528"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:18:31.840242" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:18:31.839821" elapsed="0.000464"/>
</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-04-17T03:18:31.840755" elapsed="0.000050"/>
</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-04-17T03:18:31.841823" elapsed="0.000078"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:31.842366" elapsed="0.000069"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:18:31.840533" elapsed="0.002084"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:18:31.840353" elapsed="0.002403"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:18:31.843056" elapsed="0.000069"/>
</return>
<msg time="2026-04-17T03:18:31.843362" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:18:31.838709" elapsed="0.004691"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:31.838322" elapsed="0.005129"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:31.843759" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:31.843496" elapsed="0.000375"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:31.838295" elapsed="0.005620"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:18:31.845185" 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-04-17T03:18:31.844336" elapsed="0.000886"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:18:31.845295" 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/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-04-17T03:18:31.833609" elapsed="0.011842"/>
</kw>
<msg time="2026-04-17T03:18:31.845516" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:18:31.816047" elapsed="0.029530"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:18:31.859192" elapsed="0.000072"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:31.872071" elapsed="0.000066"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:18:31.885875" elapsed="0.000087"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:31.886228" 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-04-17T03:18:31.886421" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:31.886872" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:31.886716" elapsed="0.000231"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:31.886696" 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-04-17T03:18:31.887124" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:31.887295" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:31.887461" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:18:31.886657" elapsed="0.000859"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:18:31.886509" elapsed="0.001035"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:31.887692" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:31.887774" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:18:31.887970" 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-04-17T03:18:31.811239" elapsed="0.076762"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:31.889641" 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-04-17T03:18:31.889328" elapsed="0.000394">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-04-17T03:18:31.889822" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:31.888861" 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-04-17T03:18:31.890215" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:31.889938" elapsed="0.000339"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:18:31.890798" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:31.890492" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:31.890303" elapsed="0.000649"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:31.889903" elapsed="0.001076"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:31.893439" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:18:31.891136" elapsed="0.002330"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:18:31.893520" elapsed="0.000050"/>
</return>
<msg time="2026-04-17T03:18:31.893750" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:18:31.888477" elapsed="0.005306"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:31.895407" 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-04-17T03:18:31.895095" elapsed="0.000403">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-04-17T03:18:31.895630" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:31.894685" elapsed="0.000981"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:18:31.895973" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-04-17T03:18:31.895767" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:31.895739" elapsed="0.000358"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:31.896356" 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-04-17T03:18:31.896599" elapsed="0.000028"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:18:31.896677" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:18:31.900986" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:18:31.894227" elapsed="0.006822"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:31.904166" 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-04-17T03:18:31.903534" elapsed="0.000816"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:31.905146" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:31.904686" elapsed="0.000523"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:18:31.911381" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:32.113136" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:32.515795" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:32.517995" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:18:31.908017" elapsed="0.614411">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:18:31.905314" elapsed="0.617318">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:32.523186" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:32.522738" elapsed="0.000557"/>
</branch>
<status status="FAIL" start="2026-04-17T03:18:31.905281" elapsed="0.618049">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:32.524055" elapsed="0.000132"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:32.524365" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:18:32.524303" elapsed="0.000143"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:32.524274" elapsed="0.000205"/>
</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-04-17T03:18:32.524896" elapsed="0.000099"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:18:32.525077" elapsed="0.000024"/>
</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-04-17T03:18:31.901752" elapsed="0.623520">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:32.525398" 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-04-17T03:18:31.785678" elapsed="0.739866">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:32.526022" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:32.525696" elapsed="0.000436"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:32.525670" elapsed="0.000496"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:32.526227" 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="FAIL" start="2026-04-17T03:18:31.775899" elapsed="0.750504">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:18:31.766588" elapsed="0.759972">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:18:33.590895" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:33.590456" elapsed="0.000490"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:33.591923" 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-04-17T03:18:33.591513" elapsed="0.000514">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-04-17T03:18:33.592126" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:33.591129" elapsed="0.001027"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:33.592784" 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-04-17T03:18:33.592358" elapsed="0.000455"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:18:33.593193" 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-04-17T03:18:33.593361" 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-04-17T03:18:33.593018" elapsed="0.000456"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:33.593967" 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-04-17T03:18:33.593671" elapsed="0.000348"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:33.595388" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:33.594888" elapsed="0.000565"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:18:33.596050" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:18:33.595620" elapsed="0.000460"/>
</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-04-17T03:18:33.596500" elapsed="0.000048"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:33.597532" 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-04-17T03:18:33.597888" elapsed="0.000082"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:18:33.596307" elapsed="0.001790"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:18:33.596139" elapsed="0.002029"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:18:33.598222" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:18:33.598625" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:18:33.594464" elapsed="0.004198"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:33.594102" elapsed="0.004603"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:33.598910" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:33.598739" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:33.594077" elapsed="0.004959"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:18:33.599673" 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-04-17T03:18:33.599190" elapsed="0.000511"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:18:33.599753" 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-04-17T03:18:33.589694" elapsed="0.010188"/>
</kw>
<msg time="2026-04-17T03:18:33.599956" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:18:33.576406" elapsed="0.023608"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:33.613996" elapsed="0.000056"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:18:33.627277" elapsed="0.000042"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:18:33.639692" elapsed="0.000053"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:33.640005" elapsed="0.000107"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:33.640283" 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-04-17T03:18:33.640709" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:33.640556" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:33.640538" 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-04-17T03:18:33.640949" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:33.641157" 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-04-17T03:18:33.641352" elapsed="0.000024"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:18:33.640500" elapsed="0.000911"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:18:33.640368" elapsed="0.001071"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:33.641592" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:33.641673" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:18:33.641844" 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-04-17T03:18:33.571695" elapsed="0.070179"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:33.643490" 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-04-17T03:18:33.643161" elapsed="0.000411">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-04-17T03:18:33.643672" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:33.642704" 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-04-17T03:18:33.644062" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:33.643770" elapsed="0.000358"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:18:33.644655" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:33.644342" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:33.644154" elapsed="0.000564"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:33.643752" elapsed="0.000987"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:33.647267" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:18:33.644894" elapsed="0.002402"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:18:33.647351" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:18:33.647522" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:18:33.642310" elapsed="0.005237"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:33.648922" 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-04-17T03:18:33.648658" elapsed="0.000351">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-04-17T03:18:33.649109" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:33.648298" elapsed="0.000894"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:18:33.649416" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:18:33.649270" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:33.649250" elapsed="0.000254"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:33.649657" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:33.649901" elapsed="0.000037"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:18:33.649996" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:18:33.652130" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:18:33.647889" elapsed="0.004271"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:33.653787" 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-04-17T03:18:33.653504" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:33.654267" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:33.654007" 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-04-17T03:18:33.659727" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:33.861600" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:34.264564" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:34.267456" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:18:33.656477" elapsed="0.615359">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:18:33.654384" elapsed="0.617637">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:34.272418" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:34.272089" elapsed="0.000432"/>
</branch>
<status status="FAIL" start="2026-04-17T03:18:33.654364" elapsed="0.618192">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:34.273302" elapsed="0.000045"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:34.273552" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:18:34.273490" elapsed="0.000130"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:34.273436" elapsed="0.000216"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:34.273976" elapsed="0.000051"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:18:34.274147" elapsed="0.000042"/>
</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-04-17T03:18:33.652510" elapsed="0.621894">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:34.274571" elapsed="0.000030"/>
</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-04-17T03:18:33.547147" elapsed="0.727603">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:34.275349" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:34.275018" elapsed="0.000458"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:34.274989" elapsed="0.000525"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:34.275565" 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="FAIL" start="2026-04-17T03:18:33.537011" elapsed="0.738758">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:18:33.527283" elapsed="0.748676">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:18:35.342577" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:35.341916" elapsed="0.000708"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:35.343795" 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-04-17T03:18:35.343374" elapsed="0.000496">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-04-17T03:18:35.344005" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:35.342866" elapsed="0.001170"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:35.344602" 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-04-17T03:18:35.344211" elapsed="0.000418"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:18:35.344953" 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-04-17T03:18:35.345119" 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-04-17T03:18:35.344792" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:35.345562" 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-04-17T03:18:35.345310" 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-04-17T03:18:35.346949" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:35.346484" elapsed="0.000530"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:18:35.347535" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:18:35.347177" 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-04-17T03:18:35.347994" elapsed="0.000053"/>
</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-04-17T03:18:35.348902" elapsed="0.000110"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:18:35.349411" elapsed="0.000066"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:18:35.347773" elapsed="0.001867"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:18:35.347615" elapsed="0.002121"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:18:35.349807" elapsed="0.000052"/>
</return>
<msg time="2026-04-17T03:18:35.350119" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:18:35.346117" elapsed="0.004042"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:35.345685" elapsed="0.004598"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:35.350545" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:35.350323" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:35.345661" elapsed="0.005005"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:18:35.351539" 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-04-17T03:18:35.350880" elapsed="0.000698"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:18:35.351646" 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//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-04-17T03:18:35.340996" elapsed="0.010818"/>
</kw>
<msg time="2026-04-17T03:18:35.351888" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:18:35.326202" elapsed="0.025771"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:35.369653" elapsed="0.000082"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:35.385635" elapsed="0.000062"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:18:35.400520" elapsed="0.000067"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:35.400904" elapsed="0.000049"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:35.401186" 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-04-17T03:18:35.401766" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:35.401551" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:35.401527" elapsed="0.000359"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:35.402142" 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-04-17T03:18:35.402393" 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-04-17T03:18:35.402648" elapsed="0.000030"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:18:35.401475" elapsed="0.001251"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:18:35.401300" elapsed="0.001465"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:35.403009" elapsed="0.000031"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:35.403121" elapsed="0.000025"/>
</return>
<msg time="2026-04-17T03:18:35.403330" 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-04-17T03:18:35.320841" elapsed="0.082607"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:35.405432" 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-04-17T03:18:35.405030" elapsed="0.000500">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-04-17T03:18:35.405663" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:35.404464" elapsed="0.001235"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:35.406227" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:35.405800" elapsed="0.000693"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:18:35.407233" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:35.406786" elapsed="0.000484"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:35.406528" elapsed="0.000792"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:35.405774" elapsed="0.001577"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:35.410735" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:18:35.407568" elapsed="0.003205"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:18:35.410848" elapsed="0.000049"/>
</return>
<msg time="2026-04-17T03:18:35.411098" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:18:35.403966" elapsed="0.007167"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:35.412895" 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-04-17T03:18:35.412550" elapsed="0.000461">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-04-17T03:18:35.413144" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:35.412068" elapsed="0.001111"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:18:35.413478" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-04-17T03:18:35.413282" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:35.413255" elapsed="0.000348"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:35.413816" 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-04-17T03:18:35.414157" elapsed="0.000032"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:18:35.414254" elapsed="0.000021"/>
</return>
<msg time="2026-04-17T03:18:35.419273" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:18:35.411585" elapsed="0.007727"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:35.421065" 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-04-17T03:18:35.420695" elapsed="0.000421"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:35.421678" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:35.421339" elapsed="0.000394"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:18:35.427650" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:35.629217" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:36.032002" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:36.034441" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:18:35.424453" elapsed="0.613946">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:18:35.421807" elapsed="0.616751">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:36.038965" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:36.038621" elapsed="0.000448"/>
</branch>
<status status="FAIL" start="2026-04-17T03:18:35.421785" elapsed="0.617319">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:36.039750" elapsed="0.000040"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:36.039984" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:18:36.039901" elapsed="0.000153"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:36.039873" elapsed="0.000212"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:36.040300" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:18:36.040401" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:18:35.419705" elapsed="0.620927">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:36.040764" elapsed="0.000026"/>
</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-04-17T03:18:35.295560" elapsed="0.745356">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:36.041360" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:36.041084" elapsed="0.000385"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:36.041058" elapsed="0.000445"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:36.041551" elapsed="0.000020"/>
</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="FAIL" start="2026-04-17T03:18:35.287587" elapsed="0.754113">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:18:35.276658" elapsed="0.765192">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:18:37.105305" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:37.104832" elapsed="0.000705"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:37.106576" 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-04-17T03:18:37.106114" elapsed="0.000562">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-04-17T03:18:37.106778" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:37.105723" elapsed="0.001081"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:37.107523" 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-04-17T03:18:37.107030" elapsed="0.000531"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:18:37.108007" 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-04-17T03:18:37.108208" 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-04-17T03:18:37.107790" elapsed="0.000446"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:37.108656" 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-04-17T03:18:37.108400" 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-04-17T03:18:37.110018" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:37.109542" elapsed="0.000539"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:18:37.110608" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:18:37.110246" elapsed="0.000388"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:37.111128" elapsed="0.000051"/>
</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-04-17T03:18:37.111883" elapsed="0.000089"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:18:37.112275" elapsed="0.000048"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:18:37.110851" elapsed="0.001598"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:18:37.110689" elapsed="0.001827"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:18:37.112568" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:18:37.112748" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:18:37.109176" elapsed="0.003599"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:37.108785" elapsed="0.004023"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:37.113003" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:37.112834" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:37.108759" elapsed="0.004324"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:18:37.113706" 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-04-17T03:18:37.113230" elapsed="0.000505"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:18:37.113787" 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-04-17T03:18:37.104089" elapsed="0.009828"/>
</kw>
<msg time="2026-04-17T03:18:37.113993" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:18:37.090267" elapsed="0.023783"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:37.128786" elapsed="0.000059"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:18:37.142124" 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/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-04-17T03:18:37.154856" elapsed="0.000058"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:37.155212" 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-04-17T03:18:37.155402" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:37.155828" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:37.155676" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:37.155658" 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-04-17T03:18:37.156074" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:37.156248" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:37.156415" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:18:37.155620" elapsed="0.000848"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:18:37.155487" elapsed="0.001007"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:37.156639" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:37.156718" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:18:37.156884" 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-04-17T03:18:37.085663" elapsed="0.071248"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:37.158380" 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-04-17T03:18:37.158080" elapsed="0.000374">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-04-17T03:18:37.158551" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:37.157655" elapsed="0.000921"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:37.158913" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:37.158647" elapsed="0.000376"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:18:37.159626" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:37.159282" elapsed="0.000380"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:37.159054" elapsed="0.000712"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:37.158630" elapsed="0.001159"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:37.163247" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:18:37.159962" elapsed="0.003327"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:18:37.163371" elapsed="0.000050"/>
</return>
<msg time="2026-04-17T03:18:37.163611" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:18:37.157293" elapsed="0.006355"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:37.165597" 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-04-17T03:18:37.165228" elapsed="0.000465">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-04-17T03:18:37.165833" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:37.164671" elapsed="0.001198"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:18:37.166232" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-04-17T03:18:37.166001" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:37.165971" elapsed="0.000389"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:37.166571" 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-04-17T03:18:37.166814" elapsed="0.000030"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:18:37.166908" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:18:37.169202" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:18:37.164162" elapsed="0.005068"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:37.170727" 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-04-17T03:18:37.170455" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:37.171218" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:37.170939" 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-04-17T03:18:37.176293" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:37.378302" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:37.781764" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:37.785384" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:18:37.173410" elapsed="0.614559">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:18:37.171330" elapsed="0.616761">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:37.788437" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:37.788146" elapsed="0.000368"/>
</branch>
<status status="FAIL" start="2026-04-17T03:18:37.171311" elapsed="0.617228">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:37.789074" elapsed="0.000116"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:37.789322" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:18:37.789279" elapsed="0.000094"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:37.789256" elapsed="0.000138"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:37.789545" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:18:37.789615" 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-04-17T03:18:37.169583" elapsed="0.620157">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:37.789821" 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-04-17T03:18:37.061117" elapsed="0.728806">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:37.790241" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:37.790049" elapsed="0.000271"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:37.790031" elapsed="0.000312"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:37.790376" elapsed="0.000014"/>
</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="FAIL" start="2026-04-17T03:18:37.052407" elapsed="0.738072">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:18:37.042495" elapsed="0.748089">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:18:38.864412" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:38.863908" elapsed="0.000544"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:38.865488" 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-04-17T03:18:38.865045" elapsed="0.000548">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-04-17T03:18:38.865701" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:38.864654" elapsed="0.001072"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:38.866449" 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-04-17T03:18:38.865977" elapsed="0.000500"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:18:38.866832" 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-04-17T03:18:38.867061" 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-04-17T03:18:38.866666" elapsed="0.000503"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:38.867658" 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-04-17T03:18:38.867351" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:38.869282" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:38.868779" elapsed="0.000568"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:18:38.869980" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:18:38.869515" elapsed="0.000498"/>
</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-04-17T03:18:38.870491" 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-04-17T03:18:38.871355" elapsed="0.000053"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:18:38.871720" elapsed="0.000048"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:18:38.870265" elapsed="0.001693"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:18:38.870081" elapsed="0.001953"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:18:38.872094" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:18:38.872295" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:18:38.868380" elapsed="0.003941"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:38.867822" elapsed="0.004531"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:38.872544" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:38.872383" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:38.867783" elapsed="0.004840"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:18:38.873339" 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-04-17T03:18:38.872786" elapsed="0.000586"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:18:38.873424" elapsed="0.000035"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:18:38.862914" elapsed="0.010647"/>
</kw>
<msg time="2026-04-17T03:18:38.873620" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:18:38.841622" elapsed="0.032061"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:38.888980" elapsed="0.000107"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:38.905330" elapsed="0.000073"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:18:38.918974" elapsed="0.000059"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:38.919329" elapsed="0.000159"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:38.919688" 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-04-17T03:18:38.920252" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:38.920084" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:38.920062" 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-04-17T03:18:38.920490" 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-04-17T03:18:38.920660" 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-04-17T03:18:38.920832" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:18:38.920011" elapsed="0.000876"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:18:38.919783" elapsed="0.001134"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:38.921086" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:38.921172" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:18:38.921375" 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-04-17T03:18:38.836623" elapsed="0.084789"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:38.923140" 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-04-17T03:18:38.922792" elapsed="0.000431">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-04-17T03:18:38.923321" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:38.922343" 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-04-17T03:18:38.923697" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:38.923418" elapsed="0.000338"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:18:38.924402" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:38.924059" elapsed="0.000379"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:38.923784" elapsed="0.000704"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:38.923399" elapsed="0.001112"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:38.927019" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:18:38.924682" elapsed="0.002365"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:18:38.927104" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:18:38.927304" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:18:38.921873" elapsed="0.005457"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:38.928796" 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-04-17T03:18:38.928506" elapsed="0.000363">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-04-17T03:18:38.928986" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:38.928113" elapsed="0.000899"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:18:38.929233" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-17T03:18:38.929087" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:38.929066" elapsed="0.000255"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:38.929472" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:38.929728" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:18:38.929796" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:18:38.932169" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:18:38.927671" elapsed="0.004530"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:38.933803" 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-04-17T03:18:38.933523" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:38.934329" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:38.934024" elapsed="0.000352"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:18:38.939682" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:39.141571" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:39.544433" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:39.547428" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:18:38.936764" elapsed="0.614451">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:18:38.934449" elapsed="0.616952">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:39.551917" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:39.551478" elapsed="0.000572"/>
</branch>
<status status="FAIL" start="2026-04-17T03:18:38.934427" elapsed="0.617659">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:39.552874" elapsed="0.000044"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:39.553131" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:18:39.553063" elapsed="0.000164"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:39.553028" elapsed="0.000237"/>
</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-04-17T03:18:39.553529" elapsed="0.000042"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:18:39.553650" elapsed="0.000026"/>
</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-04-17T03:18:38.932560" elapsed="0.621299">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:39.554018" elapsed="0.000034"/>
</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-04-17T03:18:38.809789" elapsed="0.744419">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:39.554733" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:39.554454" elapsed="0.000382"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:39.554428" elapsed="0.000442"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:39.554918" elapsed="0.000043"/>
</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="FAIL" start="2026-04-17T03:18:38.801209" elapsed="0.753884">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:18:38.791541" elapsed="0.763706">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:18:40.621410" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:40.620892" elapsed="0.000558"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:40.622505" 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-04-17T03:18:40.622070" elapsed="0.000522">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-04-17T03:18:40.622692" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:40.621653" elapsed="0.001065"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:40.623497" 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-04-17T03:18:40.622968" elapsed="0.000565"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:18:40.623999" 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-04-17T03:18:40.624218" 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-04-17T03:18:40.623756" elapsed="0.000498"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:40.624722" 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-04-17T03:18:40.624460" elapsed="0.000342"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:40.626252" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:40.625760" elapsed="0.000555"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:18:40.626851" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:18:40.626481" elapsed="0.000396"/>
</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-04-17T03:18:40.627330" elapsed="0.000048"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:40.628132" 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-04-17T03:18:40.628497" elapsed="0.000048"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:18:40.627135" elapsed="0.001536"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:18:40.626950" elapsed="0.001790"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:18:40.628841" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:18:40.629049" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:18:40.625339" elapsed="0.003737"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:40.624941" elapsed="0.004256"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:40.629382" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:40.629226" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:40.624885" elapsed="0.004573"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:18:40.630147" 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-04-17T03:18:40.629605" elapsed="0.000572"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:18:40.630226" 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-04-17T03:18:40.620026" elapsed="0.010328"/>
</kw>
<msg time="2026-04-17T03:18:40.630413" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:18:40.605488" elapsed="0.024980"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:40.644611" 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/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-04-17T03:18:40.657821" elapsed="0.000041"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:18:40.671158" elapsed="0.000055"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:40.671492" 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-04-17T03:18:40.671772" 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-04-17T03:18:40.672481" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:40.672243" elapsed="0.000329"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:40.672213" elapsed="0.000404"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:40.672868" 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-04-17T03:18:40.673141" elapsed="0.000029"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:40.673329" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:18:40.672143" elapsed="0.001240"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:18:40.671910" elapsed="0.001502"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:40.673562" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:40.673646" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:18:40.673837" 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-04-17T03:18:40.600578" elapsed="0.073388"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:40.675578" 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-04-17T03:18:40.675222" elapsed="0.000446">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-04-17T03:18:40.675767" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:40.674754" elapsed="0.001038"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:40.676161" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:40.675866" elapsed="0.000352"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:18:40.676727" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:40.676429" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:40.676242" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:40.675847" elapsed="0.000983"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:40.679333" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:18:40.677001" elapsed="0.002374"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:18:40.679450" elapsed="0.000045"/>
</return>
<msg time="2026-04-17T03:18:40.679645" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:18:40.674344" elapsed="0.005328"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:40.680979" 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-04-17T03:18:40.680691" elapsed="0.000356">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-04-17T03:18:40.681141" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:40.680348" elapsed="0.000817"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:18:40.681376" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-17T03:18:40.681236" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:40.681218" elapsed="0.000241"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:40.681607" 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-04-17T03:18:40.681780" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:18:40.681846" elapsed="0.000014"/>
</return>
<msg time="2026-04-17T03:18:40.684010" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:18:40.680013" elapsed="0.004024"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:40.685801" 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-04-17T03:18:40.685490" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:40.686269" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:40.686022" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:18:40.692976" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:40.894800" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:41.297505" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:41.300221" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:18:40.689175" elapsed="0.615443">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:18:40.686380" elapsed="0.618447">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:41.305315" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:41.304920" elapsed="0.000508"/>
</branch>
<status status="FAIL" start="2026-04-17T03:18:40.686361" elapsed="0.619105">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:41.306402" elapsed="0.000059"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:41.306666" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:18:41.306607" elapsed="0.000127"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:41.306574" elapsed="0.000193"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:41.307021" elapsed="0.000040"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:18:41.307137" elapsed="0.000024"/>
</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-04-17T03:18:40.684409" elapsed="0.622910">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:41.307478" elapsed="0.000034"/>
</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-04-17T03:18:40.572980" elapsed="0.734709">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:41.308325" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:41.307899" elapsed="0.000588"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:41.307861" elapsed="0.000682"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:41.308613" elapsed="0.000032"/>
</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="FAIL" start="2026-04-17T03:18:40.566200" elapsed="0.742633">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:18:40.556222" elapsed="0.752879">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:18:42.371053" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:42.370570" elapsed="0.000532"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:42.372119" 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-04-17T03:18:42.371687" elapsed="0.000509">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-04-17T03:18:42.372294" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:42.371306" elapsed="0.001013"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:42.372885" 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-04-17T03:18:42.372492" elapsed="0.000420"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:18:42.373242" 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-04-17T03:18:42.373428" 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-04-17T03:18:42.373097" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:42.373908" 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-04-17T03:18:42.373614" elapsed="0.000357"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:42.375246" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:42.374776" elapsed="0.000535"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:18:42.375885" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:18:42.375474" elapsed="0.000439"/>
</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-04-17T03:18:42.376393" elapsed="0.000063"/>
</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-04-17T03:18:42.377330" 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-04-17T03:18:42.377764" elapsed="0.000049"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:18:42.376149" elapsed="0.001805"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:18:42.375985" elapsed="0.002039"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:18:42.378109" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:18:42.378304" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:18:42.374418" elapsed="0.003912"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:42.374053" elapsed="0.004310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:42.378547" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:42.378391" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:42.374029" elapsed="0.004596"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:18:42.379327" 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-04-17T03:18:42.378773" elapsed="0.000584"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:18:42.379407" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:18:42.369798" elapsed="0.009740"/>
</kw>
<msg time="2026-04-17T03:18:42.379597" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:18:42.356092" elapsed="0.023560"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:42.393734" 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//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-04-17T03:18:42.406917" elapsed="0.000064"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:18:42.419528" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:42.419764" 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-04-17T03:18:42.419961" 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-04-17T03:18:42.420368" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:42.420217" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:42.420199" 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-04-17T03:18:42.420592" 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-04-17T03:18:42.420778" 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-04-17T03:18:42.420964" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:18:42.420162" elapsed="0.000858"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:18:42.420045" elapsed="0.001001"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:42.421193" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:42.421272" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:18:42.421427" 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-04-17T03:18:42.350222" elapsed="0.071232"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:42.423001" 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-04-17T03:18:42.422694" elapsed="0.000404">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-04-17T03:18:42.423201" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:42.422282" elapsed="0.000944"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:42.423566" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:42.423298" elapsed="0.000326"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:18:42.424179" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:42.423859" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:42.423649" elapsed="0.000661"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:42.423280" elapsed="0.001055"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:42.426759" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:18:42.424494" elapsed="0.002292"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:18:42.426840" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:18:42.427017" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:18:42.421830" elapsed="0.005212"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:42.428287" 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-04-17T03:18:42.428048" elapsed="0.000304">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-17T03:18:42.428447" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:42.427693" elapsed="0.000778"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:18:42.428678" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:18:42.428541" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:42.428524" elapsed="0.000239"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:42.428908" elapsed="0.000037"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:42.429109" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:18:42.429176" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:18:42.433059" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:18:42.427360" elapsed="0.005729"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:42.434670" 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-04-17T03:18:42.434375" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:42.435138" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:42.434873" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:18:42.440514" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:42.642675" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:43.045452" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:43.048198" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:18:42.437326" elapsed="0.616308">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:18:42.435250" elapsed="0.618612">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:43.054460" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:43.053987" elapsed="0.000635"/>
</branch>
<status status="FAIL" start="2026-04-17T03:18:42.435231" elapsed="0.619448">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:43.055891" elapsed="0.000183"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:43.056347" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:18:43.056256" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:43.056213" elapsed="0.000291"/>
</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-04-17T03:18:43.056855" elapsed="0.000051"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:18:43.057057" elapsed="0.000038"/>
</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-04-17T03:18:42.433424" elapsed="0.623903">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:43.057513" elapsed="0.000037"/>
</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-04-17T03:18:42.325863" elapsed="0.731886">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:43.058439" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:43.058000" elapsed="0.000512"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:43.057958" elapsed="0.000578"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:43.058733" elapsed="0.000014"/>
</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="FAIL" start="2026-04-17T03:18:42.316532" elapsed="0.742303">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:18:42.309977" elapsed="0.748972">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:18:44.119302" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:44.118848" elapsed="0.000488"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:44.120542" 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-04-17T03:18:44.120122" elapsed="0.000501">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-04-17T03:18:44.120721" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:44.119518" elapsed="0.001228"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:44.121346" 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-04-17T03:18:44.120914" elapsed="0.000460"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:18:44.121684" 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-04-17T03:18:44.121876" 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-04-17T03:18:44.121539" elapsed="0.000435"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:44.122422" 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-04-17T03:18:44.122142" elapsed="0.000346"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:44.123908" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:44.123411" elapsed="0.000578"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:18:44.124516" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:18:44.124154" elapsed="0.000390"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:44.124965" elapsed="0.000048"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:44.125695" 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-04-17T03:18:44.126067" elapsed="0.000046"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:18:44.124761" elapsed="0.001475"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:18:44.124599" elapsed="0.001704"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:18:44.126355" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:18:44.126532" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:18:44.123048" elapsed="0.003509"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:44.122575" elapsed="0.004015"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:44.126788" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:44.126638" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:44.122549" elapsed="0.004315"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:18:44.127489" 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-04-17T03:18:44.127026" elapsed="0.000492"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:18:44.127566" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:44.118059" elapsed="0.009632"/>
</kw>
<msg time="2026-04-17T03:18:44.127746" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:18:44.104818" elapsed="0.022981"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:44.140904" elapsed="0.000081"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:44.155108" 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/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-04-17T03:18:44.168099" elapsed="0.000056"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:44.168410" elapsed="0.000160"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:44.168777" 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-04-17T03:18:44.169256" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:44.169089" elapsed="0.000236"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:44.169071" 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-04-17T03:18:44.169526" 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-04-17T03:18:44.169757" elapsed="0.000029"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:44.169985" elapsed="0.000024"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:18:44.169030" elapsed="0.001016"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:18:44.168870" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:44.170231" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:44.170318" elapsed="0.000025"/>
</return>
<msg time="2026-04-17T03:18:44.170517" 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-04-17T03:18:44.100181" elapsed="0.070368"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:44.172354" 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-04-17T03:18:44.172048" elapsed="0.000397">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-04-17T03:18:44.172548" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:44.171386" elapsed="0.001189"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:44.172942" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:44.172649" elapsed="0.000356"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:18:44.173538" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:44.173223" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:44.173032" elapsed="0.000571"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:44.172630" elapsed="0.000996"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:44.176136" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:18:44.173785" elapsed="0.002381"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:18:44.176222" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:18:44.176391" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:18:44.170994" elapsed="0.005423"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:44.178106" 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-04-17T03:18:44.177831" elapsed="0.000345">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-04-17T03:18:44.178286" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:44.177327" elapsed="0.000986"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:18:44.178532" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-17T03:18:44.178388" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:44.178369" elapsed="0.000252"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:44.178817" elapsed="0.000038"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:44.179129" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:18:44.179200" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:18:44.181445" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:18:44.176959" elapsed="0.004515"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:44.183039" 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-04-17T03:18:44.182747" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:44.183504" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:44.183249" 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-04-17T03:18:44.188730" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:44.390133" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:44.793070" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:44.795786" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:18:44.185775" elapsed="0.615080">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:18:44.183620" elapsed="0.617418">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:44.801444" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:44.801128" elapsed="0.000420"/>
</branch>
<status status="FAIL" start="2026-04-17T03:18:44.183601" elapsed="0.617983">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:44.802264" elapsed="0.000040"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:44.802474" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:18:44.802414" elapsed="0.000127"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:44.802386" elapsed="0.000188"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:44.802815" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:18:44.802919" elapsed="0.000082"/>
</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-04-17T03:18:44.181817" elapsed="0.621347">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:44.803279" 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-04-17T03:18:44.076900" elapsed="0.726534">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:44.803984" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:44.803674" elapsed="0.000434"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:44.803640" elapsed="0.000518"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:44.804207" elapsed="0.000023"/>
</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="FAIL" start="2026-04-17T03:18:44.067609" elapsed="0.736751">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:18:44.059720" elapsed="0.744896">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:18:45.865462" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:45.865048" elapsed="0.000449"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:45.866557" 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-04-17T03:18:45.866130" elapsed="0.000507">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-04-17T03:18:45.866737" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:45.865675" elapsed="0.001087"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:45.867389" 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-04-17T03:18:45.866964" elapsed="0.000454"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:18:45.867770" 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-04-17T03:18:45.867957" 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-04-17T03:18:45.867620" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:45.868412" 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-04-17T03:18:45.868154" 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-04-17T03:18:45.869720" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:45.869254" elapsed="0.000530"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:18:45.870336" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:18:45.869964" elapsed="0.000399"/>
</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-04-17T03:18:45.870991" elapsed="0.000055"/>
</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-04-17T03:18:45.871808" elapsed="0.000054"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:18:45.872200" elapsed="0.000049"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:18:45.870580" elapsed="0.001793"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:18:45.870417" elapsed="0.002025"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:18:45.872494" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:18:45.872701" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:18:45.868877" elapsed="0.003860"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:45.868539" elapsed="0.004296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:45.873043" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:45.872865" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:45.868516" elapsed="0.004608"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:18:45.873738" 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-04-17T03:18:45.873271" elapsed="0.000495"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:18:45.873816" 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-04-17T03:18:45.864325" elapsed="0.009641"/>
</kw>
<msg time="2026-04-17T03:18:45.874023" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:18:45.851133" elapsed="0.022945"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:45.887284" elapsed="0.000039"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:18:45.900571" elapsed="0.000048"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:18:45.914935" elapsed="0.000037"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:45.915206" elapsed="0.000035"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:45.915422" 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-04-17T03:18:45.915956" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:45.915762" elapsed="0.000255"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:45.915743" elapsed="0.000301"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:45.916190" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:45.916362" 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-04-17T03:18:45.916530" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:18:45.915700" elapsed="0.000885"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:18:45.915507" elapsed="0.001106"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:45.916760" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:45.916841" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:18:45.917010" 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-04-17T03:18:45.846602" elapsed="0.070505"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:45.918534" 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-04-17T03:18:45.918245" elapsed="0.000364">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-04-17T03:18:45.918706" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:45.917826" elapsed="0.000906"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:45.919139" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:45.918806" elapsed="0.000394"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:18:45.919795" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:45.919407" elapsed="0.000414"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:45.919224" elapsed="0.000632"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:45.918787" elapsed="0.001091"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:45.922260" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:18:45.920046" elapsed="0.002241"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:18:45.922340" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:18:45.922507" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:18:45.917466" elapsed="0.005067"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:45.923842" 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-04-17T03:18:45.923599" elapsed="0.000307">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-04-17T03:18:45.924021" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:45.923210" elapsed="0.000836"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:18:45.924255" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:18:45.924117" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:45.924099" elapsed="0.000240"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:45.924486" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:45.924656" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:18:45.924721" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:18:45.926802" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:18:45.922847" elapsed="0.003982"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:45.928363" 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-04-17T03:18:45.928092" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:45.928811" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:45.928565" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:18:45.934220" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:46.136170" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:46.539587" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:46.542420" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:18:45.931034" elapsed="0.614719">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:18:45.928921" elapsed="0.616978">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:46.546296" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:46.545988" elapsed="0.000514"/>
</branch>
<status status="FAIL" start="2026-04-17T03:18:45.928903" elapsed="0.617663">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:46.547403" elapsed="0.000055"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:46.547664" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:18:46.547579" elapsed="0.000152"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:46.547550" elapsed="0.000210"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:46.548041" elapsed="0.000047"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:18:46.548160" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:18:45.927166" elapsed="0.621161">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:46.548438" 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-04-17T03:18:45.822566" elapsed="0.726037">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:46.553398" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:46.548748" elapsed="0.004783"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:46.548723" elapsed="0.004839"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:46.553600" elapsed="0.000016"/>
</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="FAIL" start="2026-04-17T03:18:45.813870" elapsed="0.739851">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:18:45.805397" elapsed="0.748439">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:18:47.616881" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:47.616377" elapsed="0.000541"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:47.617905" 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-04-17T03:18:47.617489" elapsed="0.000537">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-04-17T03:18:47.618130" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:47.617124" elapsed="0.001033"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:47.618750" 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-04-17T03:18:47.618336" elapsed="0.000442"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:18:47.619120" 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-04-17T03:18:47.619318" 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-04-17T03:18:47.618966" elapsed="0.000387"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:47.619823" 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-04-17T03:18:47.619558" 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-04-17T03:18:47.621302" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:47.620814" elapsed="0.000554"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:18:47.621937" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:18:47.621537" 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-04-17T03:18:47.622410" elapsed="0.000050"/>
</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-04-17T03:18:47.623192" elapsed="0.000063"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:18:47.623579" elapsed="0.000055"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:18:47.622208" elapsed="0.001552"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:18:47.622027" elapsed="0.001806"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:18:47.623887" elapsed="0.000077"/>
</return>
<msg time="2026-04-17T03:18:47.624117" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:18:47.620382" elapsed="0.003761"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:47.619984" elapsed="0.004192"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:47.624358" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:47.624204" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:47.619954" elapsed="0.004518"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:18:47.625146" 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-04-17T03:18:47.624638" elapsed="0.000539"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:18:47.625235" elapsed="0.000035"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:18:47.615384" elapsed="0.009991"/>
</kw>
<msg time="2026-04-17T03:18:47.625433" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:18:47.601307" elapsed="0.024182"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:47.639010" elapsed="0.000061"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:47.652324" elapsed="0.000043"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:18:47.665016" elapsed="0.000054"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:47.665301" 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-04-17T03:18:47.665485" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:47.665900" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:47.665749" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:47.665731" 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-04-17T03:18:47.666143" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:47.666310" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:47.666475" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:18:47.665694" elapsed="0.000834"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:18:47.665567" elapsed="0.000988"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:47.666700" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:47.666779" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:18:47.666947" 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-04-17T03:18:47.596455" elapsed="0.070522"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:47.668489" 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-04-17T03:18:47.668167" elapsed="0.000405">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-04-17T03:18:47.668667" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:47.667704" 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-04-17T03:18:47.669166" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:47.668762" elapsed="0.000462"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:18:47.669734" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:47.669433" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:47.669249" elapsed="0.000611"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:47.668743" elapsed="0.001141"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:47.672321" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:18:47.670055" elapsed="0.002293"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:18:47.672402" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:18:47.672609" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:18:47.667343" elapsed="0.005291"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:47.673937" 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-04-17T03:18:47.673665" elapsed="0.000342">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-04-17T03:18:47.674101" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:47.673321" elapsed="0.000805"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:18:47.674341" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:18:47.674196" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:47.674178" elapsed="0.000247"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:47.674572" 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-04-17T03:18:47.674744" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:18:47.674809" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:18:47.676945" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:18:47.672976" elapsed="0.003997"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:47.678402" 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-04-17T03:18:47.678143" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:47.678845" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:47.678602" 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-04-17T03:18:47.684021" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:47.888911" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:48.291253" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:48.293670" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:18:47.681125" elapsed="0.615773">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:18:47.678970" elapsed="0.618088">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:48.297445" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:48.297129" elapsed="0.000416"/>
</branch>
<status status="FAIL" start="2026-04-17T03:18:47.678951" elapsed="0.618629">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:48.298212" elapsed="0.000096"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:48.298441" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:18:48.298398" elapsed="0.000091"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:48.298376" elapsed="0.000134"/>
</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-04-17T03:18:48.298680" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:18:48.298785" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:18:47.677296" elapsed="0.621676">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:48.299090" 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-04-17T03:18:47.570694" elapsed="0.728545">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:48.299667" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:48.299383" elapsed="0.000387"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:48.299355" elapsed="0.000448"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:48.299841" elapsed="0.000015"/>
</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="FAIL" start="2026-04-17T03:18:47.562424" elapsed="0.737544">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:18:47.554404" elapsed="0.745683">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:18:49.361744" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:49.361230" elapsed="0.000563"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:49.362810" 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-04-17T03:18:49.362395" elapsed="0.000494">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-04-17T03:18:49.363022" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:49.362013" elapsed="0.001034"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:49.363634" 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-04-17T03:18:49.363233" elapsed="0.000430"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:18:49.363992" 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-04-17T03:18:49.364157" 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-04-17T03:18:49.363827" elapsed="0.000421"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:49.364676" 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-04-17T03:18:49.364413" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:49.366164" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:49.365681" elapsed="0.000547"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:18:49.366758" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:18:49.366394" elapsed="0.000402"/>
</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-04-17T03:18:49.367307" elapsed="0.000050"/>
</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-04-17T03:18:49.368082" 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-04-17T03:18:49.368427" elapsed="0.000047"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:18:49.367094" elapsed="0.001502"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:18:49.366875" elapsed="0.001789"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:18:49.368716" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:18:49.368897" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:18:49.365236" elapsed="0.003702"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:49.364821" elapsed="0.004154"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:49.369176" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:49.369001" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:49.364781" elapsed="0.004491"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:18:49.369998" 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-04-17T03:18:49.369490" elapsed="0.000537"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:18:49.370077" 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-04-17T03:18:49.360464" elapsed="0.009742"/>
</kw>
<msg time="2026-04-17T03:18:49.370261" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:18:49.346286" elapsed="0.024026"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:49.384461" 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//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-04-17T03:18:49.397323" 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-04-17T03:18:49.411521" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:49.411765" elapsed="0.000102"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:49.412053" 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-04-17T03:18:49.412468" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:49.412315" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:49.412298" 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-04-17T03:18:49.412694" 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-04-17T03:18:49.412873" 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-04-17T03:18:49.413058" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:18:49.412259" elapsed="0.000853"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:18:49.412139" elapsed="0.001001"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:49.413286" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:49.413363" elapsed="0.000047"/>
</return>
<msg time="2026-04-17T03:18:49.413556" 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-04-17T03:18:49.341288" elapsed="0.072295"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:49.415082" 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-04-17T03:18:49.414751" elapsed="0.000409">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-04-17T03:18:49.415255" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:49.414310" elapsed="0.000970"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:49.415653" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:49.415350" elapsed="0.000363"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:18:49.416269" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:49.415966" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:49.415738" elapsed="0.000593"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:49.415333" elapsed="0.001018"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:49.418825" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:18:49.416503" elapsed="0.002361"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:18:49.418918" elapsed="0.000050"/>
</return>
<msg time="2026-04-17T03:18:49.419100" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:18:49.413948" elapsed="0.005176"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:49.420386" 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-04-17T03:18:49.420140" elapsed="0.000311">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-04-17T03:18:49.420545" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:49.419760" elapsed="0.000809"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:18:49.420777" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:18:49.420640" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:49.420622" elapsed="0.000251"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:49.421043" elapsed="0.000024"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:49.421267" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:18:49.421334" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:18:49.425019" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:18:49.419434" elapsed="0.005614"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:49.426612" 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-04-17T03:18:49.426305" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:49.427081" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:49.426817" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:18:49.432333" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:49.634015" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:50.036714" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:50.039402" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:18:49.429247" elapsed="0.615154">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:18:49.427194" elapsed="0.617370">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:50.044981" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:50.044632" elapsed="0.000465"/>
</branch>
<status status="FAIL" start="2026-04-17T03:18:49.427175" elapsed="0.617977">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:50.045806" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:50.046028" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:18:50.045970" elapsed="0.000121"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:50.045922" elapsed="0.000197"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:50.046323" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:18:50.046418" 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-04-17T03:18:49.425374" elapsed="0.621245">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:50.046764" 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-04-17T03:18:49.316822" elapsed="0.730088">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:50.047407" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:50.047145" elapsed="0.000363"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:50.047120" elapsed="0.000421"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:50.047585" elapsed="0.000019"/>
</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="FAIL" start="2026-04-17T03:18:49.310496" elapsed="0.737228">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:18:49.300786" elapsed="0.747079">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:18:51.110347" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:51.109889" elapsed="0.000494"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:51.111352" 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-04-17T03:18:51.110912" elapsed="0.000516">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-04-17T03:18:51.111526" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:51.110562" elapsed="0.000990"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:51.112140" 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-04-17T03:18:51.111719" elapsed="0.000448"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:18:51.112477" 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-04-17T03:18:51.112641" 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-04-17T03:18:51.112332" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:51.113115" 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-04-17T03:18:51.112831" 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-04-17T03:18:51.114467" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:51.113996" elapsed="0.000534"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:18:51.115076" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:18:51.114694" elapsed="0.000408"/>
</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-04-17T03:18:51.115510" 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-04-17T03:18:51.116465" elapsed="0.000071"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:18:51.117122" elapsed="0.000111"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:18:51.115322" elapsed="0.002250"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:18:51.115158" elapsed="0.002669"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:18:51.118026" elapsed="0.000090"/>
</return>
<msg time="2026-04-17T03:18:51.118598" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:18:51.113605" elapsed="0.005064"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:51.113242" elapsed="0.005565"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:51.119083" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:51.118847" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:51.113218" elapsed="0.005978"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:18:51.119877" 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-04-17T03:18:51.119371" elapsed="0.000535"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:18:51.119997" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:18:51.109209" elapsed="0.010939"/>
</kw>
<msg time="2026-04-17T03:18:51.120221" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:18:51.095825" elapsed="0.024470"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:51.134141" elapsed="0.000065"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:18:51.147599" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:18:51.161202" elapsed="0.000069"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:51.161530" 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-04-17T03:18:51.161750" 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-04-17T03:18:51.162245" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:51.162086" elapsed="0.000307"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:51.162067" elapsed="0.000356"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:51.162580" 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-04-17T03:18:51.162754" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:51.162922" elapsed="0.000037"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:18:51.162025" elapsed="0.000970"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:18:51.161863" elapsed="0.001161"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:51.163175" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:51.163257" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:18:51.163432" 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-04-17T03:18:51.091236" elapsed="0.072335"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:51.165295" 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-04-17T03:18:51.164920" elapsed="0.000455">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-04-17T03:18:51.165491" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:51.164390" elapsed="0.001132"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:51.165914" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:51.165612" elapsed="0.000408"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:18:51.166581" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:51.166244" elapsed="0.000363"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:51.166051" elapsed="0.000591"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:51.165589" elapsed="0.001075"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:51.169104" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:18:51.166816" elapsed="0.002315"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:18:51.169185" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:18:51.169348" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:18:51.163989" elapsed="0.005384"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:51.170758" 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-04-17T03:18:51.170511" elapsed="0.000311">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-04-17T03:18:51.170918" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:51.170104" elapsed="0.000856"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:18:51.171173" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-17T03:18:51.171033" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:51.171015" elapsed="0.000244"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:51.171409" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:51.171585" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:18:51.171654" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:18:51.173828" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:18:51.169723" elapsed="0.004132"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:51.175404" 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-04-17T03:18:51.175130" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:51.175853" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:51.175609" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:18:51.181123" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:51.382896" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:51.785493" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:51.788242" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:18:51.178131" elapsed="0.614157">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:18:51.175982" elapsed="0.616502">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:51.792873" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:51.792569" elapsed="0.000428"/>
</branch>
<status status="FAIL" start="2026-04-17T03:18:51.175963" elapsed="0.617069">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:51.793640" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:51.793840" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:18:51.793783" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:51.793757" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:51.794161" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:18:51.794260" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:18:51.174215" elapsed="0.620210">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:51.794535" 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-04-17T03:18:51.067483" elapsed="0.727219">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:51.795130" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:51.794839" elapsed="0.000396"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:51.794814" elapsed="0.000455"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:51.795314" elapsed="0.000021"/>
</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="FAIL" start="2026-04-17T03:18:51.059700" elapsed="0.735759">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:18:51.048625" elapsed="0.746976">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:18:52.855887" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:52.855453" elapsed="0.000495"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:52.856897" 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-04-17T03:18:52.856496" elapsed="0.000507">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-04-17T03:18:52.857106" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:52.856145" elapsed="0.000986"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:52.857749" 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-04-17T03:18:52.857303" elapsed="0.000475"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:18:52.858297" 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-04-17T03:18:52.858509" 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-04-17T03:18:52.858127" elapsed="0.000417"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:52.859177" 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-04-17T03:18:52.858779" elapsed="0.000461"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:52.861144" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:52.860429" elapsed="0.000792"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:18:52.861833" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:18:52.861418" 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-04-17T03:18:52.862309" elapsed="0.000047"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:52.863101" 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-04-17T03:18:52.863468" elapsed="0.000049"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:18:52.862118" elapsed="0.001541"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:18:52.861918" elapsed="0.001809"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:18:52.863781" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:18:52.863979" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:18:52.859786" elapsed="0.004226"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:52.859351" elapsed="0.004717"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:52.864256" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:52.864099" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:52.859318" elapsed="0.005017"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:18:52.865016" 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-04-17T03:18:52.864483" elapsed="0.000563"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:18:52.865096" 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-04-17T03:18:52.854669" elapsed="0.010558"/>
</kw>
<msg time="2026-04-17T03:18:52.865283" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:18:52.841522" elapsed="0.023817"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:52.878671" 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//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-04-17T03:18:52.891720" elapsed="0.000045"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:18:52.904347" elapsed="0.000037"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:52.904601" 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-04-17T03:18:52.904790" 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-04-17T03:18:52.905249" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:52.905079" elapsed="0.000252"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:52.905061" elapsed="0.000296"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:52.905554" 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-04-17T03:18:52.905778" 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-04-17T03:18:52.906009" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:18:52.905021" elapsed="0.001047"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:18:52.904876" elapsed="0.001221"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:52.906248" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:52.906329" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:18:52.906493" 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-04-17T03:18:52.836861" elapsed="0.069662"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:52.908064" 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-04-17T03:18:52.907718" elapsed="0.000425">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-04-17T03:18:52.908242" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:52.907300" elapsed="0.000971"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:52.908662" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:52.908374" elapsed="0.000349"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:18:52.909381" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:52.908956" elapsed="0.000454"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:52.908749" elapsed="0.000762"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:52.908351" elapsed="0.001185"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:52.912088" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:18:52.909711" elapsed="0.002406"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:18:52.912172" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:18:52.912336" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:18:52.906899" elapsed="0.005463"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:52.913664" 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-04-17T03:18:52.913424" elapsed="0.000305">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-04-17T03:18:52.913825" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:52.913077" elapsed="0.000773"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:18:52.914079" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:18:52.913937" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:52.913904" 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-04-17T03:18:52.914316" 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-04-17T03:18:52.914491" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:18:52.914557" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:18:52.916637" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:18:52.912677" elapsed="0.003988"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:52.918171" 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-04-17T03:18:52.917890" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:52.918629" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:52.918378" 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="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:18:52.923755" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:53.125184" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:53.527760" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:53.530451" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:18:52.920895" elapsed="0.613575">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:18:52.918744" elapsed="0.615916">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:53.535222" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:53.534741" elapsed="0.000627"/>
</branch>
<status status="FAIL" start="2026-04-17T03:18:52.918724" elapsed="0.616692">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:53.536236" elapsed="0.000187"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:53.536636" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:18:53.536569" elapsed="0.000139"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:53.536533" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:53.536982" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:18:53.537086" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:18:52.917046" elapsed="0.620262">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:53.537429" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:18:52.813470" elapsed="0.724105">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:53.537986" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:53.537712" elapsed="0.000378"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:53.537689" elapsed="0.000427"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:53.538151" elapsed="0.000016"/>
</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="FAIL" start="2026-04-17T03:18:52.806187" elapsed="0.732080">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:18:52.796356" elapsed="0.742035">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:18:54.612182" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:54.611563" elapsed="0.000667"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:54.613523" 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-04-17T03:18:54.612992" elapsed="0.000635">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-04-17T03:18:54.613762" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:54.612482" elapsed="0.001317"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:54.614590" 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-04-17T03:18:54.614065" elapsed="0.000559"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:18:54.615139" 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-04-17T03:18:54.615350" 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-04-17T03:18:54.614849" elapsed="0.000618"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:54.616079" 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-04-17T03:18:54.615701" elapsed="0.000444"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:54.617912" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:54.617272" elapsed="0.000748"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:18:54.618790" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:18:54.618251" elapsed="0.000577"/>
</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-04-17T03:18:54.619435" elapsed="0.000070"/>
</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-04-17T03:18:54.620511" elapsed="0.000072"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:18:54.621019" elapsed="0.000065"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:18:54.619158" elapsed="0.002101"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:18:54.618902" elapsed="0.002454"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:18:54.621427" elapsed="0.000050"/>
</return>
<msg time="2026-04-17T03:18:54.621667" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:18:54.616743" elapsed="0.004961"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:54.616256" elapsed="0.005493"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:54.622020" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:54.621786" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:54.616224" elapsed="0.005906"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:18:54.623009" 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-04-17T03:18:54.622336" elapsed="0.000711"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:18:54.623113" 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-04-17T03:18:54.610495" elapsed="0.012791"/>
</kw>
<msg time="2026-04-17T03:18:54.623363" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:18:54.592375" elapsed="0.031060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:54.641326" elapsed="0.000072"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:54.658717" elapsed="0.000089"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:18:54.679075" elapsed="0.000070"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:54.679412" elapsed="0.000131"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:54.679717" 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-04-17T03:18:54.680181" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:54.680024" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:54.680005" 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-04-17T03:18:54.680419" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:54.680591" 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-04-17T03:18:54.680839" elapsed="0.000026"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:18:54.679957" elapsed="0.000945"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:18:54.679803" elapsed="0.001150"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:54.681123" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:54.681207" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:18:54.681427" 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-04-17T03:18:54.586009" elapsed="0.095449"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:54.683014" 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-04-17T03:18:54.682652" elapsed="0.000440">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-04-17T03:18:54.683224" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:54.682237" elapsed="0.001016"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:54.683599" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:54.683329" elapsed="0.000329"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:18:54.684224" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:54.683898" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:54.683704" elapsed="0.000583"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:54.683310" elapsed="0.000999"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:54.686736" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:18:54.684503" elapsed="0.002261"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:18:54.686818" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:18:54.687009" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:18:54.681847" elapsed="0.005188"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:54.688501" 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-04-17T03:18:54.688247" elapsed="0.000322">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-04-17T03:18:54.688668" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:54.687695" elapsed="0.001017"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:18:54.688990" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-17T03:18:54.688805" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:54.688782" elapsed="0.000310"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:54.689254" 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-04-17T03:18:54.689529" elapsed="0.000024"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:18:54.689602" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:18:54.691915" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:18:54.687359" elapsed="0.004602"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:54.693725" 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-04-17T03:18:54.693441" elapsed="0.000345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:54.694403" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:54.694146" 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-04-17T03:18:54.699521" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:54.901289" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:55.304103" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:55.307278" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:18:54.696575" elapsed="0.615442">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:18:54.694518" elapsed="0.617648">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:55.312535" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:55.312228" elapsed="0.000402"/>
</branch>
<status status="FAIL" start="2026-04-17T03:18:54.694498" elapsed="0.618166">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:55.313310" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:55.313511" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:18:55.313455" elapsed="0.000160"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:55.313428" elapsed="0.000230"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:55.313902" elapsed="0.000071"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:18:55.314076" 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-04-17T03:18:54.692345" elapsed="0.621916">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:55.314372" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:18:54.554248" elapsed="0.760265">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:55.315016" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:55.314717" elapsed="0.000402"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:55.314692" elapsed="0.000489"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:55.315256" elapsed="0.000030"/>
</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="FAIL" start="2026-04-17T03:18:54.545471" elapsed="0.769963">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:18:54.538920" elapsed="0.776663">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:18:56.382714" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:56.382265" elapsed="0.000485"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:56.383710" 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-04-17T03:18:56.383312" elapsed="0.000493">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-04-17T03:18:56.383912" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:56.382949" elapsed="0.001030"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:56.384561" 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-04-17T03:18:56.384163" elapsed="0.000425"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:18:56.384898" 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-04-17T03:18:56.385102" 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-04-17T03:18:56.384752" elapsed="0.000376"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:56.385541" 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-04-17T03:18:56.385290" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:56.386897" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:56.386432" elapsed="0.000557"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:18:56.387553" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:18:56.387179" elapsed="0.000400"/>
</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-04-17T03:18:56.388043" elapsed="0.000055"/>
</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-04-17T03:18:56.388855" elapsed="0.000097"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:18:56.389348" elapsed="0.000062"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:18:56.387802" elapsed="0.001772"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:18:56.387636" elapsed="0.002028"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:18:56.389733" elapsed="0.000047"/>
</return>
<msg time="2026-04-17T03:18:56.389982" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:18:56.386038" elapsed="0.003979"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:56.385666" elapsed="0.004486"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:56.390422" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:56.390189" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:56.385642" elapsed="0.004885"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:18:56.391363" 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-04-17T03:18:56.390729" elapsed="0.000672"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:18:56.391487" 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//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-04-17T03:18:56.381490" elapsed="0.010211"/>
</kw>
<msg time="2026-04-17T03:18:56.391775" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:18:56.368016" elapsed="0.023827"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:56.407982" 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/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-04-17T03:18:56.422714" elapsed="0.000080"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:18:56.436514" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:56.436753" 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-04-17T03:18:56.436952" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:56.437552" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:56.437400" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:56.437382" 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-04-17T03:18:56.437799" 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-04-17T03:18:56.438005" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:56.438171" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:18:56.437342" elapsed="0.000882"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:18:56.437211" elapsed="0.001041"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:56.438398" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:56.438476" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:18:56.438636" 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-04-17T03:18:56.362168" elapsed="0.076568"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:56.440241" 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-04-17T03:18:56.439941" elapsed="0.000377">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-04-17T03:18:56.440413" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:56.439502" elapsed="0.000936"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:56.440774" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:56.440508" elapsed="0.000323"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:18:56.441419" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:56.441065" elapsed="0.000380"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:56.440855" elapsed="0.000626"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:56.440490" elapsed="0.001011"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:56.443914" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:18:56.441663" elapsed="0.002291"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:18:56.444007" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:18:56.444165" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:18:56.439094" elapsed="0.005095"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:56.445624" 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-04-17T03:18:56.445336" elapsed="0.000352">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-04-17T03:18:56.445781" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:56.444828" elapsed="0.000977"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:18:56.446031" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:18:56.445874" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:56.445857" elapsed="0.000257"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:56.446267" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:56.446438" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:18:56.446502" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:18:56.450260" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:18:56.444499" elapsed="0.005789"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:56.451713" 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-04-17T03:18:56.451449" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:56.452170" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:56.451912" 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-04-17T03:18:56.457081" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:56.658909" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:57.061677" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:57.064223" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:18:56.454396" elapsed="0.615573">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:18:56.452279" elapsed="0.617817">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:57.070391" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:57.070144" elapsed="0.000320"/>
</branch>
<status status="FAIL" start="2026-04-17T03:18:56.452261" elapsed="0.618227">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:57.070974" elapsed="0.000031"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:57.071128" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:18:57.071085" elapsed="0.000091"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:57.071065" elapsed="0.000133"/>
</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-04-17T03:18:57.071347" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:18:57.071417" 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-04-17T03:18:56.450608" elapsed="0.620929">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:57.071631" 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-04-17T03:18:56.333328" elapsed="0.738406">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:57.072048" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:57.071831" elapsed="0.000293"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:57.071813" elapsed="0.000336"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:57.072181" elapsed="0.000015"/>
</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="FAIL" start="2026-04-17T03:18:56.323410" elapsed="0.748875">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:18:56.316418" elapsed="0.755971">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:18:58.219696" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:58.219261" elapsed="0.000471"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:58.220987" 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-04-17T03:18:58.220474" elapsed="0.000776">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-04-17T03:18:58.221357" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:58.219911" elapsed="0.001476"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:58.222071" 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-04-17T03:18:58.221579" elapsed="0.000522"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:18:58.222423" 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-04-17T03:18:58.222594" 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-04-17T03:18:58.222270" elapsed="0.000350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:58.223080" 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-04-17T03:18:58.222785" elapsed="0.000344"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:58.224419" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:58.223947" elapsed="0.000539"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:18:58.225088" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:18:58.224683" elapsed="0.000432"/>
</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-04-17T03:18:58.225622" 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-04-17T03:18:58.226615" elapsed="0.000061"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:18:58.227040" elapsed="0.000049"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:18:58.225346" elapsed="0.001869"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:18:58.225173" elapsed="0.002111"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:18:58.227340" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:18:58.227528" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:18:58.223565" elapsed="0.003994"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:58.223212" elapsed="0.004390"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:58.227790" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:58.227631" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:58.223186" elapsed="0.004682"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:18:58.228725" 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-04-17T03:18:58.228031" elapsed="0.000731"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:18:58.228827" 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-04-17T03:18:58.218540" elapsed="0.010479"/>
</kw>
<msg time="2026-04-17T03:18:58.229087" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:18:58.205299" elapsed="0.023851"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:58.242339" elapsed="0.000042"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:18:58.254807" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:18:58.267306" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:58.267548" 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-04-17T03:18:58.267735" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:58.268366" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:58.268016" elapsed="0.000406"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:58.267997" elapsed="0.000452"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:58.268644" 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-04-17T03:18:58.268826" 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-04-17T03:18:58.269230" elapsed="0.000030"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:18:58.267956" elapsed="0.001342"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:18:58.267822" elapsed="0.001506"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:58.269481" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:58.269564" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:18:58.269758" 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-04-17T03:18:58.200435" elapsed="0.069354"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:58.271390" 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-04-17T03:18:58.271021" elapsed="0.000454">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-04-17T03:18:58.271575" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:58.270558" elapsed="0.001043"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:58.272006" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:58.271674" elapsed="0.000400"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:18:58.272664" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:58.272318" elapsed="0.000375"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:58.272101" elapsed="0.000843"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:58.271655" elapsed="0.001326"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:58.275779" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:18:58.273188" elapsed="0.002620"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:18:58.275865" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:18:58.276054" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:18:58.270161" elapsed="0.005920"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:58.277491" 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-04-17T03:18:58.277195" elapsed="0.000369">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-04-17T03:18:58.277675" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:58.276793" elapsed="0.000908"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:18:58.277917" elapsed="0.000046"/>
</return>
<status status="PASS" start="2026-04-17T03:18:58.277774" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:58.277755" 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-04-17T03:18:58.278198" 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-04-17T03:18:58.278398" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:18:58.278468" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:18:58.280808" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:18:58.276421" elapsed="0.004417"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:58.282459" 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-04-17T03:18:58.282179" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:58.282962" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:58.282670" elapsed="0.000341"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:18:58.288411" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:58.490111" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:58.892120" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:58.893978" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:18:58.285446" elapsed="0.611705">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:18:58.283081" elapsed="0.614215">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:58.897675" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:58.897359" elapsed="0.000415"/>
</branch>
<status status="FAIL" start="2026-04-17T03:18:58.283062" elapsed="0.614748">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:58.898467" elapsed="0.000098"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:58.898734" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:18:58.898677" elapsed="0.000111"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:58.898649" elapsed="0.000161"/>
</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-04-17T03:18:58.899040" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:18:58.899141" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:18:58.281212" elapsed="0.618089">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:58.899411" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:18:58.176216" elapsed="0.723366">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:18:58.899913" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:58.899709" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:18:58.899686" elapsed="0.000347"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:18:58.900067" elapsed="0.000015"/>
</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="FAIL" start="2026-04-17T03:18:58.169667" elapsed="0.730506">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:18:58.072852" elapsed="0.827426">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:18:59.962177" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:18:59.961669" elapsed="0.000544"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:18:59.963226" 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-04-17T03:18:59.962789" elapsed="0.000515">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-04-17T03:18:59.963403" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:18:59.962411" elapsed="0.001018"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:18:59.964043" 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-04-17T03:18:59.963600" elapsed="0.000472"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:18:59.964383" 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-04-17T03:18:59.964549" 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-04-17T03:18:59.964237" elapsed="0.000402"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:18:59.965180" 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-04-17T03:18:59.964838" 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-04-17T03:18:59.966696" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:18:59.966208" elapsed="0.000553"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:18:59.967318" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:18:59.966946" elapsed="0.000399"/>
</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-04-17T03:18:59.967766" elapsed="0.000054"/>
</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-04-17T03:18:59.968588" elapsed="0.000053"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:18:59.968971" elapsed="0.000067"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:18:59.967572" elapsed="0.001635"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:18:59.967403" elapsed="0.001887"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:18:59.969371" elapsed="0.000052"/>
</return>
<msg time="2026-04-17T03:18:59.969629" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:18:59.965806" elapsed="0.003862"/>
</kw>
<status status="PASS" start="2026-04-17T03:18:59.965339" elapsed="0.004368"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:18:59.969953" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:18:59.969735" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-17T03:18:59.965301" elapsed="0.004738"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:18:59.970684" 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-04-17T03:18:59.970193" elapsed="0.000521"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:18:59.970766" 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-04-17T03:18:59.960710" elapsed="0.010189"/>
</kw>
<msg time="2026-04-17T03:18:59.970977" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:18:59.947211" elapsed="0.023825"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:18:59.989197" 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//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-04-17T03:19:00.004039" elapsed="0.000079"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:19:00.019699" elapsed="0.000059"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:00.020021" elapsed="0.000141"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:00.020342" 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-04-17T03:19:00.020824" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:00.020638" elapsed="0.000246"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:00.020620" elapsed="0.000291"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:00.021082" 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-04-17T03:19:00.021255" 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-04-17T03:19:00.021424" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:19:00.020578" elapsed="0.000900"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:19:00.020432" elapsed="0.001076"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:00.021659" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:00.021743" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:19:00.021909" 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-04-17T03:18:59.942543" elapsed="0.079412"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:00.023529" 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-04-17T03:19:00.023202" elapsed="0.000407">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-04-17T03:19:00.023707" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:00.022730" elapsed="0.001002"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:00.024097" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:00.023807" elapsed="0.000350"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:19:00.024698" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:00.024372" elapsed="0.000359"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:00.024182" elapsed="0.000590"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:00.023787" elapsed="0.001007"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:00.027322" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:19:00.024977" elapsed="0.002373"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:19:00.027404" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:19:00.027572" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:19:00.022343" elapsed="0.005254"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:00.029012" 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-04-17T03:19:00.028709" elapsed="0.000375">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-04-17T03:19:00.029182" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:00.028289" elapsed="0.000918"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:19:00.029421" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:19:00.029279" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:00.029260" elapsed="0.000248"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:00.029660" 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-04-17T03:19:00.029966" elapsed="0.000023"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:19:00.030037" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:19:00.032229" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:19:00.027941" elapsed="0.004316"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:00.033906" 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-04-17T03:19:00.033615" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:00.034404" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:00.034133" elapsed="0.000332"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:19:00.040139" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:00.242561" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:00.644805" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:00.647420" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:19:00.036740" elapsed="0.615023">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:19:00.034540" elapsed="0.617434">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:00.652408" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:00.652067" elapsed="0.000466"/>
</branch>
<status status="FAIL" start="2026-04-17T03:19:00.034520" elapsed="0.618053">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:00.653353" elapsed="0.000051"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:00.653589" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:19:00.653528" elapsed="0.000125"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:00.653499" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:00.653901" elapsed="0.000059"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:19:00.654051" 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-04-17T03:19:00.032618" elapsed="0.621617">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:00.654352" 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-04-17T03:18:59.917261" elapsed="0.737241">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:00.655037" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:00.654727" elapsed="0.000425"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:00.654699" elapsed="0.000491"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:00.655240" elapsed="0.000023"/>
</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="FAIL" start="2026-04-17T03:18:59.906023" elapsed="0.749384">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:18:59.900741" elapsed="0.754824">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:19:01.720679" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:01.720149" elapsed="0.000567"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:01.721754" 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-04-17T03:19:01.721303" elapsed="0.000532">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-04-17T03:19:01.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-04-17T03:19:01.720911" elapsed="0.001088"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:01.722637" 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-04-17T03:19:01.722192" elapsed="0.000474"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:19:01.723025" 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-04-17T03:19:01.723220" 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-04-17T03:19:01.722849" elapsed="0.000413"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:01.723699" 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-04-17T03:19:01.723438" 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-04-17T03:19:01.725076" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:01.724588" elapsed="0.000559"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:19:01.725765" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:19:01.725366" elapsed="0.000427"/>
</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-04-17T03:19:01.726364" elapsed="0.000052"/>
</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-04-17T03:19:01.727144" elapsed="0.000058"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:19:01.727688" elapsed="0.000047"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:19:01.726090" elapsed="0.001770"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:19:01.725852" elapsed="0.002109"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:19:01.728019" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:19:01.728434" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:19:01.724228" elapsed="0.004243"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:01.723830" elapsed="0.004772"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:01.728819" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:01.728642" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:01.723804" elapsed="0.005110"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:19:01.729795" 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-04-17T03:19:01.729158" elapsed="0.000676"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:19:01.729901" elapsed="0.000059"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:19:01.719307" elapsed="0.010791"/>
</kw>
<msg time="2026-04-17T03:19:01.730191" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:19:01.705161" elapsed="0.025104"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:19:01.744923" elapsed="0.000099"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:19:01.759959" elapsed="0.000070"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:19:01.775695" elapsed="0.000074"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:01.776117" 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-04-17T03:19:01.776386" 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-04-17T03:19:01.776972" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:01.776759" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:01.776735" 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-04-17T03:19:01.777251" 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-04-17T03:19:01.777470" 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-04-17T03:19:01.777648" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:19:01.776684" elapsed="0.001019"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:19:01.776504" elapsed="0.001259"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:01.777955" elapsed="0.000030"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:01.778054" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:19:01.778271" 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-04-17T03:19:01.700094" elapsed="0.078315"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:01.780072" 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-04-17T03:19:01.779734" elapsed="0.000432">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-04-17T03:19:01.780298" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:01.779294" elapsed="0.001032"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:01.780765" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:01.780405" elapsed="0.000455"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:19:01.781593" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:01.781175" elapsed="0.000454"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:01.780893" elapsed="0.000788"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:01.780385" elapsed="0.001344"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:01.784708" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:19:01.781908" elapsed="0.002829"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:19:01.784795" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:19:01.785004" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:19:01.778879" elapsed="0.006166"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:01.786829" 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-04-17T03:19:01.786461" elapsed="0.000444">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-04-17T03:19:01.787025" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:01.785951" elapsed="0.001104"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:19:01.787352" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-04-17T03:19:01.787157" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:01.787122" elapsed="0.000328"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:01.787615" 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-04-17T03:19:01.787846" elapsed="0.000024"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:19:01.787919" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:19:01.790381" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:19:01.785420" elapsed="0.004992"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:01.792276" 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-04-17T03:19:01.791861" elapsed="0.000481"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:01.792883" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:01.792553" elapsed="0.000414"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:19:01.799614" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:02.001348" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:02.403723" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:02.406022" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:19:01.796438" elapsed="0.614805">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:19:01.793052" elapsed="0.618470">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:02.412334" elapsed="0.000071"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:02.411679" elapsed="0.000889"/>
</branch>
<status status="FAIL" start="2026-04-17T03:19:01.793031" elapsed="0.619629">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:02.413478" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:02.413639" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:19:02.413594" elapsed="0.000093"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:02.413572" elapsed="0.000138"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:02.413909" elapsed="0.000048"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:19:02.414012" elapsed="0.000017"/>
</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-04-17T03:19:01.790802" elapsed="0.623338">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:02.414221" 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-04-17T03:19:01.675011" elapsed="0.739315">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:02.414620" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:02.414427" elapsed="0.000268"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:02.414408" elapsed="0.000313"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:02.414754" elapsed="0.000015"/>
</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="FAIL" start="2026-04-17T03:19:01.665662" elapsed="0.749197">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:19:01.656428" elapsed="0.758554">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:19:03.486996" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:03.486415" elapsed="0.000620"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:03.488160" 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-04-17T03:19:03.487692" elapsed="0.000556">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-04-17T03:19:03.488350" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:03.487229" elapsed="0.001146"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:03.488973" 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-04-17T03:19:03.488550" elapsed="0.000452"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:19:03.489319" 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-04-17T03:19:03.489503" 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-04-17T03:19:03.489169" elapsed="0.000363"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:03.489976" 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-04-17T03:19:03.489697" elapsed="0.000327"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:03.491488" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:03.490955" elapsed="0.000618"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:19:03.492195" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:19:03.491749" elapsed="0.000480"/>
</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-04-17T03:19:03.492693" elapsed="0.000047"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:03.493770" elapsed="0.000054"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:19:03.494217" elapsed="0.000050"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:19:03.492498" elapsed="0.001892"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:19:03.492305" elapsed="0.002156"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:19:03.494517" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:19:03.494710" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:19:03.490492" elapsed="0.004245"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:03.490109" elapsed="0.004662"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:03.494978" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:03.494801" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:03.490082" elapsed="0.004976"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:19:03.495757" 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-04-17T03:19:03.495239" elapsed="0.000546"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:19:03.495835" 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-04-17T03:19:03.485530" elapsed="0.010455"/>
</kw>
<msg time="2026-04-17T03:19:03.496045" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:19:03.467833" elapsed="0.028276"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:19:03.510024" 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//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-04-17T03:19:03.523839" elapsed="0.000069"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:19:03.537139" elapsed="0.000070"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:03.537473" 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-04-17T03:19:03.537666" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:03.538126" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:03.537967" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:03.537948" 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-04-17T03:19:03.538357" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:03.538528" 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-04-17T03:19:03.538695" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:19:03.537895" elapsed="0.000854"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:19:03.537756" elapsed="0.001019"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:03.538963" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:03.539045" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:19:03.539216" 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-04-17T03:19:03.463090" elapsed="0.076155"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:03.540779" 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-04-17T03:19:03.540414" elapsed="0.000448">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-04-17T03:19:03.540977" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:03.540009" 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-04-17T03:19:03.541347" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:03.541077" elapsed="0.000328"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:19:03.541908" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:03.541611" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:03.541429" elapsed="0.000633"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:03.541058" elapsed="0.001031"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:03.544552" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:19:03.542247" elapsed="0.002333"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:19:03.544637" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:19:03.544803" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:19:03.539626" elapsed="0.005203"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:03.546144" 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-04-17T03:19:03.545873" elapsed="0.000340">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-04-17T03:19:03.546310" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:03.545525" elapsed="0.000810"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:19:03.546548" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:19:03.546408" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:03.546389" elapsed="0.000246"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:03.546785" 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-04-17T03:19:03.547051" elapsed="0.000027"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:19:03.547138" elapsed="0.000026"/>
</return>
<msg time="2026-04-17T03:19:03.550154" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:19:03.545184" elapsed="0.005010"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:03.552402" 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-04-17T03:19:03.551998" elapsed="0.000475"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:03.553088" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:03.552702" 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-04-17T03:19:03.560048" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:03.762201" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:04.165007" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:04.167396" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:19:03.556462" elapsed="0.615122">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:19:03.553260" elapsed="0.618486">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:04.172147" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:04.171809" elapsed="0.000443"/>
</branch>
<status status="FAIL" start="2026-04-17T03:19:03.553230" elapsed="0.619057">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:04.173004" elapsed="0.000123"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:04.173335" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:19:04.173273" elapsed="0.000132"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:04.173238" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:04.173667" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:19:04.173774" elapsed="0.000025"/>
</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-04-17T03:19:03.550678" elapsed="0.623348">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:04.174193" elapsed="0.000035"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:19:03.436704" elapsed="0.737702">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:04.175068" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:04.174645" elapsed="0.000582"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:04.174603" elapsed="0.000675"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:04.175349" elapsed="0.000030"/>
</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="FAIL" start="2026-04-17T03:19:03.423686" elapsed="0.751881">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:19:03.415489" elapsed="0.760303">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:19:05.242301" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:05.241659" elapsed="0.000691"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:05.243647" 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-04-17T03:19:05.243104" elapsed="0.000651">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-04-17T03:19:05.243967" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:05.242611" elapsed="0.001398"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:05.244662" 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-04-17T03:19:05.244228" elapsed="0.000464"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:19:05.245044" 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-04-17T03:19:05.245230" 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-04-17T03:19:05.244864" elapsed="0.000464"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:05.245823" 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-04-17T03:19:05.245503" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:05.247396" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:05.246884" elapsed="0.000611"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:19:05.248255" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:19:05.247722" elapsed="0.000569"/>
</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-04-17T03:19:05.248890" elapsed="0.000114"/>
</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-04-17T03:19:05.249849" elapsed="0.000058"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:19:05.250238" elapsed="0.000052"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:19:05.248613" elapsed="0.001838"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:19:05.248371" elapsed="0.002154"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:19:05.250583" elapsed="0.000048"/>
</return>
<msg time="2026-04-17T03:19:05.250788" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:19:05.246397" elapsed="0.004418"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:05.245988" elapsed="0.004864"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:05.251065" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:05.250883" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:05.245958" elapsed="0.005189"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:19:05.252020" 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-04-17T03:19:05.251303" elapsed="0.000750"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:19:05.252107" 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-04-17T03:19:05.240532" elapsed="0.011714"/>
</kw>
<msg time="2026-04-17T03:19:05.252309" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:19:05.224262" elapsed="0.028108"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:19:05.269296" elapsed="0.000078"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:19:05.282530" elapsed="0.000067"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:19:05.295164" elapsed="0.000042"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:05.295434" elapsed="0.000127"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:05.295735" elapsed="0.000059"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:05.296237" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:05.296074" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:05.296056" 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-04-17T03:19:05.296467" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:05.296642" 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-04-17T03:19:05.296812" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:19:05.296015" elapsed="0.000851"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:19:05.295864" elapsed="0.001030"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:05.297058" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:05.297141" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:19:05.297302" 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-04-17T03:19:05.218532" elapsed="0.078798"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:05.298771" 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-04-17T03:19:05.298480" elapsed="0.000366">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-04-17T03:19:05.298958" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:05.298081" elapsed="0.000904"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:05.299327" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:05.299058" elapsed="0.000327"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:19:05.299914" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:05.299614" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:05.299411" elapsed="0.000584"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:05.299040" elapsed="0.000976"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:05.302566" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:19:05.300171" elapsed="0.002423"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:19:05.302648" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:19:05.302809" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:19:05.297695" elapsed="0.005139"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:05.304214" 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-04-17T03:19:05.303950" elapsed="0.000335">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-04-17T03:19:05.304383" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:05.303583" elapsed="0.000825"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:19:05.304625" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-17T03:19:05.304482" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:05.304463" 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-04-17T03:19:05.304861" 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-04-17T03:19:05.305134" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:19:05.305202" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:19:05.307380" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:19:05.303172" elapsed="0.004236"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:05.308912" 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-04-17T03:19:05.308641" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:05.309396" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:05.309143" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:19:05.314658" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:05.516356" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:05.918750" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:05.921035" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:19:05.311676" elapsed="0.613135">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:19:05.309510" elapsed="0.615558">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:05.925531" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:05.925145" elapsed="0.000510"/>
</branch>
<status status="FAIL" start="2026-04-17T03:19:05.309492" elapsed="0.616206">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:05.926516" elapsed="0.000047"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:05.926775" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:19:05.926702" elapsed="0.000153"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:05.926665" elapsed="0.000230"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:05.927206" elapsed="0.000040"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:19:05.927333" 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-04-17T03:19:05.307765" elapsed="0.619789">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:05.927697" elapsed="0.000029"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:19:05.193800" elapsed="0.734081">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:05.928636" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:05.928248" elapsed="0.000524"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:05.928214" elapsed="0.000603"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:05.928878" 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="FAIL" start="2026-04-17T03:19:05.186710" elapsed="0.742393">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:19:05.176401" elapsed="0.752849">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:19:07.007117" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:07.006378" elapsed="0.000790"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:07.008205" 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-04-17T03:19:07.007752" elapsed="0.000547">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-04-17T03:19:07.008405" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:07.007387" elapsed="0.001045"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:07.009040" 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-04-17T03:19:07.008609" elapsed="0.000459"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:19:07.009400" 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-04-17T03:19:07.009571" 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-04-17T03:19:07.009237" elapsed="0.000363"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:07.010048" 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-04-17T03:19:07.009767" elapsed="0.000329"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:07.011477" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:07.010992" elapsed="0.000551"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:19:07.012104" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:19:07.011712" elapsed="0.000419"/>
</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-04-17T03:19:07.012568" elapsed="0.000048"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:07.013332" elapsed="0.000061"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:19:07.013692" elapsed="0.000048"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:19:07.012368" elapsed="0.001498"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:19:07.012188" elapsed="0.001774"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:19:07.014018" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:19:07.014203" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:19:07.010576" elapsed="0.003655"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:07.010182" elapsed="0.004146"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:07.014525" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:07.014364" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:07.010155" elapsed="0.004451"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:19:07.015286" 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-04-17T03:19:07.014756" elapsed="0.000560"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:19:07.015372" elapsed="0.000033"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:19:07.005166" elapsed="0.010344"/>
</kw>
<msg time="2026-04-17T03:19:07.015567" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:19:06.989989" elapsed="0.025633"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:19:07.029492" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:19:07.042299" 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-04-17T03:19:07.055322" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:07.055569" 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-04-17T03:19:07.055760" 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-04-17T03:19:07.056294" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:07.056132" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:07.056106" 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-04-17T03:19:07.056526" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:07.056696" 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-04-17T03:19:07.056867" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:19:07.055995" elapsed="0.000927"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:19:07.055848" elapsed="0.001132"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:07.057139" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:07.057222" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:19:07.057393" 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-04-17T03:19:06.985218" elapsed="0.072312"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:07.059104" 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-04-17T03:19:07.058770" elapsed="0.000417">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-04-17T03:19:07.059292" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:07.058333" 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-04-17T03:19:07.059666" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:07.059391" elapsed="0.000336"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:19:07.060290" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:07.059958" elapsed="0.000361"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:07.059753" elapsed="0.000604"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:07.059372" elapsed="0.001007"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:07.062834" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:19:07.060538" elapsed="0.002323"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:19:07.062916" elapsed="0.000054"/>
</return>
<msg time="2026-04-17T03:19:07.063105" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:19:07.057901" elapsed="0.005230"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:07.064406" 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-04-17T03:19:07.064153" elapsed="0.000319">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-04-17T03:19:07.064569" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:07.063792" elapsed="0.000802"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:19:07.064805" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:19:07.064666" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:07.064648" elapsed="0.000244"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:07.065059" 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-04-17T03:19:07.065233" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:19:07.065300" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:19:07.067467" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:19:07.063457" elapsed="0.004038"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:07.069007" 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-04-17T03:19:07.068728" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:07.069466" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:07.069214" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:19:07.074590" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:07.275996" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:07.678482" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:07.681200" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:19:07.071734" elapsed="0.613065">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:19:07.069579" elapsed="0.615393">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:07.685354" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:07.685037" elapsed="0.000414"/>
</branch>
<status status="FAIL" start="2026-04-17T03:19:07.069560" elapsed="0.615934">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:07.686179" elapsed="0.000040"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:07.686392" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:19:07.686335" elapsed="0.000123"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:07.686305" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:07.686712" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:19:07.686812" elapsed="0.000024"/>
</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-04-17T03:19:07.067819" elapsed="0.619185">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:07.687119" elapsed="0.000040"/>
</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-04-17T03:19:06.960760" elapsed="0.726590">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:07.687901" elapsed="0.000089"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:07.687535" elapsed="0.000579"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:07.687498" elapsed="0.000665"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:07.688228" elapsed="0.000030"/>
</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="FAIL" start="2026-04-17T03:19:06.952728" elapsed="0.735705">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:19:06.941126" elapsed="0.747517">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:19:08.765889" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:08.765350" elapsed="0.000596"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:08.766983" 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-04-17T03:19:08.766520" elapsed="0.000546">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-04-17T03:19:08.767170" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:08.766137" elapsed="0.001059"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:08.767864" 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-04-17T03:19:08.767369" elapsed="0.000524"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:19:08.768387" 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-04-17T03:19:08.768574" 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-04-17T03:19:08.768228" elapsed="0.000381"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:08.769101" 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-04-17T03:19:08.768780" 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-04-17T03:19:08.770578" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:08.770110" elapsed="0.000533"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:19:08.771268" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:19:08.770812" elapsed="0.000488"/>
</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-04-17T03:19:08.771730" elapsed="0.000047"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:08.772566" elapsed="0.000054"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:19:08.773009" elapsed="0.000056"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:19:08.771533" elapsed="0.001657"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:19:08.771358" elapsed="0.001902"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:19:08.773316" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:19:08.773518" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:19:08.769683" elapsed="0.003861"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:08.769242" elapsed="0.004335"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:08.773764" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:08.773606" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:08.769210" elapsed="0.004634"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:19:08.774552" 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-04-17T03:19:08.774026" elapsed="0.000555"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:19:08.774632" 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-04-17T03:19:08.763368" elapsed="0.011397"/>
</kw>
<msg time="2026-04-17T03:19:08.774825" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:19:08.749690" elapsed="0.025195"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:19:08.788302" elapsed="0.000069"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:19:08.801655" 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-04-17T03:19:08.817123" elapsed="0.000086"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:08.817593" elapsed="0.000036"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:08.817899" elapsed="0.000052"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:08.818620" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:08.818367" elapsed="0.000339"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:08.818340" elapsed="0.000405"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:08.819000" 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-04-17T03:19:08.819272" 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-04-17T03:19:08.819521" elapsed="0.000029"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:19:08.818281" elapsed="0.001324"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:19:08.818061" elapsed="0.001589"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:08.820005" elapsed="0.000041"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:08.820142" elapsed="0.000026"/>
</return>
<msg time="2026-04-17T03:19:08.820347" 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-04-17T03:19:08.744778" elapsed="0.075599"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:08.821909" 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-04-17T03:19:08.821586" elapsed="0.000422">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-04-17T03:19:08.822103" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:08.821158" elapsed="0.000969"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:08.822470" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:08.822198" elapsed="0.000329"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:19:08.823054" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:08.822732" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:08.822551" elapsed="0.000630"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:08.822180" elapsed="0.001025"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:08.825627" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:19:08.823360" elapsed="0.002294"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:19:08.825708" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:19:08.825869" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:19:08.820765" elapsed="0.005129"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:08.827261" 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-04-17T03:19:08.827000" elapsed="0.000333">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-04-17T03:19:08.827431" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:08.826583" elapsed="0.000875"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:19:08.827673" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:19:08.827531" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:08.827511" elapsed="0.000251"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:08.827978" elapsed="0.000024"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:08.828159" elapsed="0.000026"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:19:08.828248" elapsed="0.000022"/>
</return>
<msg time="2026-04-17T03:19:08.830472" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:19:08.826240" elapsed="0.004271"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:08.832553" 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-04-17T03:19:08.832177" elapsed="0.000440"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:08.833207" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:08.832821" 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-04-17T03:19:08.839480" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:09.041020" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:09.443187" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:09.445605" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:19:08.836259" elapsed="0.613468">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:19:08.833361" elapsed="0.616545">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:09.450335" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:09.449998" elapsed="0.000442"/>
</branch>
<status status="FAIL" start="2026-04-17T03:19:08.833335" elapsed="0.617139">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:09.451127" elapsed="0.000122"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:09.451428" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:19:09.451372" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:09.451343" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:09.451761" elapsed="0.000043"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:19:09.451902" 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-04-17T03:19:08.830957" elapsed="0.621197">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:09.452308" elapsed="0.000032"/>
</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-04-17T03:19:08.709671" elapsed="0.742836">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:09.453053" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:09.452683" elapsed="0.000499"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:09.452653" elapsed="0.000574"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:09.453285" 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="FAIL" start="2026-04-17T03:19:08.699363" elapsed="0.754105">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:19:08.689546" elapsed="0.764076">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:19:10.515483" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:10.515019" elapsed="0.000503"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:10.516525" 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-04-17T03:19:10.516074" elapsed="0.000531">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-04-17T03:19:10.516703" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:10.515706" elapsed="0.001022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:10.517549" 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-04-17T03:19:10.516898" elapsed="0.000681"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:19:10.517900" 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-04-17T03:19:10.518092" 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-04-17T03:19:10.517749" elapsed="0.000473"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:10.518668" 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-04-17T03:19:10.518391" elapsed="0.000355"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:10.520157" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:10.519627" elapsed="0.000595"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:19:10.520814" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:19:10.520393" elapsed="0.000448"/>
</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-04-17T03:19:10.521396" elapsed="0.000065"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:10.522228" elapsed="0.000057"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:19:10.522582" elapsed="0.000047"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:19:10.521128" elapsed="0.001624"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:19:10.520899" elapsed="0.001972"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:19:10.522947" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:19:10.523162" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:19:10.519260" elapsed="0.003931"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:10.518882" elapsed="0.004344"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:10.523440" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:10.523252" elapsed="0.000259"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:10.518854" elapsed="0.004684"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:19:10.524208" 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-04-17T03:19:10.523712" elapsed="0.000524"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:19:10.524287" 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-04-17T03:19:10.514104" elapsed="0.010313"/>
</kw>
<msg time="2026-04-17T03:19:10.524474" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:19:10.500594" elapsed="0.023932"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:19:10.538317" 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/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-04-17T03:19:10.551966" 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-04-17T03:19:10.564787" elapsed="0.000037"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:10.565054" elapsed="0.000108"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:10.565370" 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-04-17T03:19:10.565882" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:10.565680" elapsed="0.000293"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:10.565658" 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-04-17T03:19:10.566168" 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-04-17T03:19:10.566358" 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-04-17T03:19:10.566529" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:19:10.565606" elapsed="0.000977"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:19:10.565464" elapsed="0.001147"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:10.566797" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:10.566881" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:19:10.567069" 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-04-17T03:19:10.494979" elapsed="0.072120"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:10.568739" 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-04-17T03:19:10.568362" elapsed="0.000480">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-04-17T03:19:10.568984" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:10.567841" elapsed="0.001178"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:10.569487" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:10.569133" elapsed="0.000432"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:19:10.570291" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:10.569843" elapsed="0.000485"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:10.569600" elapsed="0.000776"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:10.569107" elapsed="0.001299"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:10.573551" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:19:10.570618" elapsed="0.002961"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:19:10.573634" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:19:10.573799" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:19:10.567472" elapsed="0.006357"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:10.575326" 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-04-17T03:19:10.575046" elapsed="0.000352">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-04-17T03:19:10.575494" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:10.574640" elapsed="0.000878"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:19:10.575728" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-17T03:19:10.575589" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:10.575571" elapsed="0.000244"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:10.575980" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:10.576240" elapsed="0.000023"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:19:10.576309" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:19:10.578386" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:19:10.574260" elapsed="0.004152"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:10.579962" 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-04-17T03:19:10.579682" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:10.580464" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:10.580165" elapsed="0.000345"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:19:10.585710" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:10.787217" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:11.189606" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:11.191885" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:19:10.582730" elapsed="0.612735">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:19:10.580579" elapsed="0.615051">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:11.196087" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:11.195694" elapsed="0.000510"/>
</branch>
<status status="FAIL" start="2026-04-17T03:19:10.580560" elapsed="0.615681">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:11.197529" elapsed="0.000067"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:11.197862" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:19:11.197772" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:11.197730" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:11.198365" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:19:11.198471" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:19:10.578818" elapsed="0.619831">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:11.198768" 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-04-17T03:19:10.472041" elapsed="0.726878">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:11.199532" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:11.199186" elapsed="0.000460"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:11.199159" elapsed="0.000523"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:11.199754" elapsed="0.000037"/>
</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="FAIL" start="2026-04-17T03:19:10.462772" elapsed="0.737194">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:19:10.454322" elapsed="0.745834">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:19:12.267070" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:12.266511" elapsed="0.000604"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:12.268653" 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-04-17T03:19:12.267695" elapsed="0.001162">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-04-17T03:19:12.269148" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:12.267318" elapsed="0.001861"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:12.270288" 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-04-17T03:19:12.269569" elapsed="0.000748"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:19:12.270694" 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-04-17T03:19:12.270885" 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-04-17T03:19:12.270500" elapsed="0.000412"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:12.271433" 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-04-17T03:19:12.271159" 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-04-17T03:19:12.273142" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:12.272627" elapsed="0.000581"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:19:12.273802" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:19:12.273379" elapsed="0.000459"/>
</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-04-17T03:19:12.274463" elapsed="0.000050"/>
</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-04-17T03:19:12.275327" elapsed="0.000055"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:19:12.275690" elapsed="0.000048"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:19:12.274228" elapsed="0.001638"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:19:12.273918" elapsed="0.002039"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:19:12.276021" elapsed="0.000049"/>
</return>
<msg time="2026-04-17T03:19:12.276223" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:19:12.272121" elapsed="0.004128"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:12.271589" elapsed="0.004767"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:12.276549" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:12.276388" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:12.271549" elapsed="0.005078"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:19:12.277325" 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-04-17T03:19:12.276783" elapsed="0.000572"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:19:12.277406" 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-04-17T03:19:12.265597" elapsed="0.011946"/>
</kw>
<msg time="2026-04-17T03:19:12.277605" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:19:12.252207" elapsed="0.025460"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:19:12.291337" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:19:12.303873" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:19:12.316280" elapsed="0.000032"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:12.316509" 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-04-17T03:19:12.316693" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:12.317134" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:12.316980" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:12.316961" 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-04-17T03:19:12.317363" 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-04-17T03:19:12.317529" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:12.317691" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:19:12.316906" elapsed="0.000839"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:19:12.316782" elapsed="0.000990"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:12.317918" elapsed="0.000036"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:12.318014" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:19:12.318175" 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-04-17T03:19:12.247384" elapsed="0.070878"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:12.319773" 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-04-17T03:19:12.319464" elapsed="0.000395">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-04-17T03:19:12.319973" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:12.319038" elapsed="0.000961"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:12.320335" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:12.320073" elapsed="0.000324"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:19:12.320908" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:12.320610" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:12.320421" elapsed="0.000565"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:12.320054" elapsed="0.000953"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:12.323397" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:19:12.321159" elapsed="0.002265"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:19:12.323476" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:19:12.323637" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:19:12.318610" elapsed="0.005052"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:12.324984" 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-04-17T03:19:12.324728" elapsed="0.000321">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-04-17T03:19:12.325145" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:12.324384" elapsed="0.000785"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:19:12.325376" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:19:12.325239" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:12.325222" 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-04-17T03:19:12.325608" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:12.325781" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:19:12.325847" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:19:12.328012" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:19:12.323993" elapsed="0.004046"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:12.329493" 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-04-17T03:19:12.329229" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:12.330026" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:12.329740" elapsed="0.000333"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:19:12.335519" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:12.537123" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:12.939577" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:12.942020" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:19:12.332349" elapsed="0.613158">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:19:12.330143" elapsed="0.615523">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:12.946144" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:12.945790" elapsed="0.000458"/>
</branch>
<status status="FAIL" start="2026-04-17T03:19:12.330125" elapsed="0.616162">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:12.946984" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:12.947198" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:19:12.947137" elapsed="0.000134"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:12.947107" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:12.947531" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:19:12.947638" elapsed="0.000025"/>
</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-04-17T03:19:12.328365" elapsed="0.619447">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:12.947965" elapsed="0.000029"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:19:12.222879" elapsed="0.725249">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:12.948564" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:12.948274" elapsed="0.000398"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:12.948246" elapsed="0.000463"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:12.948760" elapsed="0.000022"/>
</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="FAIL" start="2026-04-17T03:19:12.214310" elapsed="0.734601">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:19:12.201198" elapsed="0.747900">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:19:14.026741" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:14.026181" elapsed="0.000604"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:14.028058" 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-04-17T03:19:14.027486" elapsed="0.000671">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-04-17T03:19:14.028285" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:14.027038" elapsed="0.001277"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:14.029058" 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-04-17T03:19:14.028535" elapsed="0.000559"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:19:14.029491" 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-04-17T03:19:14.029711" 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-04-17T03:19:14.029308" elapsed="0.000437"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:14.030291" 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-04-17T03:19:14.029974" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:14.032129" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:14.031446" elapsed="0.000771"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:19:14.032897" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:19:14.032446" elapsed="0.000503"/>
</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-04-17T03:19:14.033482" 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-04-17T03:19:14.034423" elapsed="0.000060"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:19:14.034851" elapsed="0.000058"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:19:14.033238" elapsed="0.001850"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:19:14.033025" elapsed="0.002152"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:19:14.035250" elapsed="0.000058"/>
</return>
<msg time="2026-04-17T03:19:14.035503" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:19:14.030920" elapsed="0.004619"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:14.030452" elapsed="0.005132"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:14.035835" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:14.035625" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:14.030420" elapsed="0.005538"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:19:14.036856" 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-04-17T03:19:14.036183" elapsed="0.000710"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:19:14.037017" 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/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-04-17T03:19:14.025156" elapsed="0.012034"/>
</kw>
<msg time="2026-04-17T03:19:14.037268" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:19:14.008164" elapsed="0.029178"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:19:14.054410" elapsed="0.000074"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:19:14.070274" 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/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-04-17T03:19:14.087309" elapsed="0.000074"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:14.087705" 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-04-17T03:19:14.088043" 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-04-17T03:19:14.088633" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:14.088419" elapsed="0.000288"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:14.088394" 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-04-17T03:19:14.088963" elapsed="0.000030"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:14.089201" elapsed="0.000048"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:14.089450" elapsed="0.000028"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:19:14.088340" elapsed="0.001183"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:19:14.088161" elapsed="0.001399"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:14.089765" elapsed="0.000028"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:14.089872" elapsed="0.000025"/>
</return>
<msg time="2026-04-17T03:19:14.090111" 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-04-17T03:19:14.002209" elapsed="0.087940"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:14.092486" 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-04-17T03:19:14.092146" elapsed="0.000423">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-04-17T03:19:14.092691" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:14.091355" elapsed="0.001369"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:14.093188" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:14.092820" elapsed="0.000448"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:19:14.093984" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:14.093563" elapsed="0.000458"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:14.093303" elapsed="0.000978"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:14.092794" elapsed="0.001527"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:14.097692" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:19:14.094544" elapsed="0.003188"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:19:14.097810" elapsed="0.000053"/>
</return>
<msg time="2026-04-17T03:19:14.098066" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:19:14.090845" elapsed="0.007257"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:14.099978" 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-04-17T03:19:14.099573" elapsed="0.000505">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-04-17T03:19:14.100202" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:14.099086" elapsed="0.001150"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:19:14.100530" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-17T03:19:14.100334" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:14.100307" elapsed="0.000335"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:14.100837" 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-04-17T03:19:14.101088" elapsed="0.000027"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:19:14.101175" elapsed="0.000024"/>
</return>
<msg time="2026-04-17T03:19:14.104347" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:19:14.098584" elapsed="0.005806"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:14.106521" 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-04-17T03:19:14.106125" elapsed="0.000466"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:14.107153" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:14.106803" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:19:14.114180" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:14.315991" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:14.718605" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:14.721074" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:19:14.110393" elapsed="0.614415">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:19:14.107317" elapsed="0.617700">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:14.725434" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:14.725107" elapsed="0.000436"/>
</branch>
<status status="FAIL" start="2026-04-17T03:19:14.107286" elapsed="0.618291">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:14.726359" elapsed="0.000126"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:14.726709" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:19:14.726639" elapsed="0.000151"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:14.726606" elapsed="0.000217"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:14.727151" elapsed="0.000047"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:19:14.727284" elapsed="0.000024"/>
</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-04-17T03:19:14.104957" elapsed="0.622514">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:14.727602" elapsed="0.000027"/>
</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-04-17T03:19:13.971550" elapsed="0.756213">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:14.728213" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:14.727903" elapsed="0.000420"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:14.727878" elapsed="0.000481"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:14.728406" elapsed="0.000020"/>
</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="FAIL" start="2026-04-17T03:19:13.960971" elapsed="0.767581">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:19:13.949830" elapsed="0.778872">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:19:15.795648" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:15.795206" elapsed="0.000479"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:15.796701" 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-04-17T03:19:15.796279" elapsed="0.000501">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-04-17T03:19:15.796880" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:15.795866" elapsed="0.001041"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:15.797580" 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-04-17T03:19:15.797163" elapsed="0.000445"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:19:15.797984" 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-04-17T03:19:15.798171" 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-04-17T03:19:15.797775" elapsed="0.000618"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:15.798886" 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-04-17T03:19:15.798599" elapsed="0.000360"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:15.800316" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:15.799811" elapsed="0.000573"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:19:15.800974" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:19:15.800569" 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-04-17T03:19:15.801452" elapsed="0.000049"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:15.802329" elapsed="0.000056"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:19:15.802895" elapsed="0.000065"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:19:15.801241" elapsed="0.001850"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:19:15.801065" elapsed="0.002098"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:19:15.803218" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:19:15.803407" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:19:15.799418" elapsed="0.004016"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:15.799047" elapsed="0.004422"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:15.803668" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:15.803497" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:15.799021" elapsed="0.004729"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:19:15.804518" 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-04-17T03:19:15.803914" elapsed="0.000635"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:19:15.804601" elapsed="0.000033"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:19:15.794475" elapsed="0.010261"/>
</kw>
<msg time="2026-04-17T03:19:15.804796" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:19:15.780518" elapsed="0.024336"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:19:15.819665" elapsed="0.000083"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:19:15.834645" elapsed="0.000059"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:19:15.848635" elapsed="0.000059"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:15.848970" elapsed="0.000129"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:15.849313" 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-04-17T03:19:15.849868" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:15.849677" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:15.849655" 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-04-17T03:19:15.850194" 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-04-17T03:19:15.850429" elapsed="0.000036"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:15.850636" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:19:15.849603" elapsed="0.001089"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:19:15.849430" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:15.850873" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:15.850973" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:19:15.851150" 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-04-17T03:19:15.775909" elapsed="0.075270"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:15.853012" 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-04-17T03:19:15.852597" elapsed="0.000498">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-04-17T03:19:15.853197" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:15.852074" elapsed="0.001148"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:15.853570" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:15.853295" elapsed="0.000333"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:19:15.854193" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:15.853867" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:15.853654" elapsed="0.000601"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:15.853276" elapsed="0.001001"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:15.856694" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:19:15.854429" elapsed="0.002293"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:19:15.856776" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:19:15.856954" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:19:15.851650" elapsed="0.005330"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:15.858422" 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-04-17T03:19:15.858150" elapsed="0.000346">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-04-17T03:19:15.858595" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:15.857692" elapsed="0.000928"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:19:15.858831" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:19:15.858692" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:15.858673" elapsed="0.000244"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:15.859089" 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-04-17T03:19:15.859337" elapsed="0.000034"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:19:15.859432" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:19:15.861655" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:19:15.857313" elapsed="0.004370"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:15.863188" 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-04-17T03:19:15.862898" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:15.863754" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:15.863439" elapsed="0.000362"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:19:15.869117" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:16.070385" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:16.473447" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:16.475650" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:19:15.866279" elapsed="0.613830">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:19:15.863872" elapsed="0.616476">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:16.481045" elapsed="0.000068"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:16.480447" elapsed="0.000854"/>
</branch>
<status status="FAIL" start="2026-04-17T03:19:15.863853" elapsed="0.617541">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:16.482188" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:16.482397" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:19:16.482340" elapsed="0.000122"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:16.482312" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:16.482753" elapsed="0.000036"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:19:16.482858" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:19:15.862057" elapsed="0.620992">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:16.483162" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:19:15.748161" elapsed="0.735143">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:16.483833" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:16.483512" elapsed="0.000481"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:16.483486" elapsed="0.000544"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:16.484079" elapsed="0.000023"/>
</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="FAIL" start="2026-04-17T03:19:15.738576" elapsed="0.745656">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:19:15.729431" elapsed="0.754952">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:19:17.547117" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:17.546513" elapsed="0.000653"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:17.548341" 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-04-17T03:19:17.547813" elapsed="0.000649">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-04-17T03:19:17.548586" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:17.547407" elapsed="0.001215"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:17.549383" 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-04-17T03:19:17.548828" elapsed="0.000592"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:19:17.549834" 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-04-17T03:19:17.550074" 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-04-17T03:19:17.549649" elapsed="0.000460"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:17.550586" 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-04-17T03:19:17.550306" elapsed="0.000327"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:17.552238" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:17.551637" elapsed="0.000691"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:19:17.553139" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:19:17.552600" elapsed="0.000576"/>
</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-04-17T03:19:17.553766" 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-04-17T03:19:17.554676" elapsed="0.000065"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:19:17.555120" elapsed="0.000057"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:19:17.553499" elapsed="0.001828"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:19:17.553254" elapsed="0.002154"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:19:17.555474" elapsed="0.000050"/>
</return>
<msg time="2026-04-17T03:19:17.555694" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:19:17.551230" elapsed="0.004496"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:17.550721" elapsed="0.005146"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:17.556115" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:17.555902" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:17.550692" elapsed="0.005524"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:19:17.557087" 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-04-17T03:19:17.556456" elapsed="0.000668"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:19:17.557188" 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-04-17T03:19:17.545566" elapsed="0.011789"/>
</kw>
<msg time="2026-04-17T03:19:17.557425" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:19:17.531225" elapsed="0.026269"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:19:17.572465" elapsed="0.000059"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:19:17.585002" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:19:17.597345" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:17.597584" 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-04-17T03:19:17.597770" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:17.598228" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:17.598060" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:17.598040" 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-04-17T03:19:17.598457" 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-04-17T03:19:17.598622" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:17.598789" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:19:17.597996" elapsed="0.000847"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:19:17.597859" elapsed="0.001012"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:17.599034" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:17.599116" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:19:17.599290" 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-04-17T03:19:17.526289" elapsed="0.073099"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:17.600916" 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-04-17T03:19:17.600581" elapsed="0.000436">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-04-17T03:19:17.601116" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:17.600135" 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-04-17T03:19:17.601517" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:17.601214" elapsed="0.000371"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:19:17.602113" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:17.601795" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:17.601609" elapsed="0.000566"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:17.601196" elapsed="0.001000"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:17.604599" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:19:17.602348" elapsed="0.002278"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:19:17.604677" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:19:17.604837" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:19:17.599729" elapsed="0.005132"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:17.606121" 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-04-17T03:19:17.605864" elapsed="0.000322">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-04-17T03:19:17.606282" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:17.605522" elapsed="0.000784"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:19:17.606514" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:19:17.606377" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:17.606358" elapsed="0.000245"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:17.606751" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:17.606938" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:19:17.607007" elapsed="0.000014"/>
</return>
<msg time="2026-04-17T03:19:17.609122" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:19:17.605196" elapsed="0.003953"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:17.610655" 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-04-17T03:19:17.610386" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:17.611123" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:17.610856" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:19:17.616559" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:17.818105" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:18.220885" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:18.224265" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:19:17.613348" elapsed="0.616438">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:19:17.611232" elapsed="0.618824">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:18.230516" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:18.230136" elapsed="0.000492"/>
</branch>
<status status="FAIL" start="2026-04-17T03:19:17.611214" elapsed="0.619450">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:18.231537" elapsed="0.000050"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:18.231782" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:19:18.231719" elapsed="0.000135"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:18.231683" elapsed="0.000203"/>
</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-04-17T03:19:18.232192" elapsed="0.000036"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:19:18.232304" elapsed="0.000026"/>
</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-04-17T03:19:17.609505" elapsed="0.622993">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:18.232619" 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-04-17T03:19:17.500762" elapsed="0.732009">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:18.233239" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:18.232948" elapsed="0.000400"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:18.232890" elapsed="0.000494"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:18.233432" elapsed="0.000022"/>
</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="FAIL" start="2026-04-17T03:19:17.493782" elapsed="0.739804">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:19:17.485264" elapsed="0.748478">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:19:19.297201" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:19.296690" elapsed="0.000547"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:19.298303" 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-04-17T03:19:19.297843" elapsed="0.000541">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-04-17T03:19:19.298485" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:19.297453" elapsed="0.001057"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:19.299110" 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-04-17T03:19:19.298681" elapsed="0.000457"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:19:19.299480" 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-04-17T03:19:19.299668" 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-04-17T03:19:19.299304" elapsed="0.000403"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:19.300190" 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-04-17T03:19:19.299888" elapsed="0.000349"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:19.301673" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:19.301134" elapsed="0.000613"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:19:19.302390" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:19:19.301953" elapsed="0.000465"/>
</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-04-17T03:19:19.302844" elapsed="0.000047"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:19.303639" 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-04-17T03:19:19.304035" elapsed="0.000049"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:19:19.302649" elapsed="0.001559"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:19:19.302476" elapsed="0.001801"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:19:19.304348" elapsed="0.000054"/>
</return>
<msg time="2026-04-17T03:19:19.304551" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:19:19.300707" elapsed="0.003870"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:19.300322" elapsed="0.004288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:19.304791" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:19.304636" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:19.300296" elapsed="0.004573"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:19:19.305562" 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-04-17T03:19:19.305035" elapsed="0.000557"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:19:19.305641" 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//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-04-17T03:19:19.295955" elapsed="0.009821"/>
</kw>
<msg time="2026-04-17T03:19:19.305833" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:19:19.282956" elapsed="0.022933"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:19:19.320441" elapsed="0.000075"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:19:19.336210" elapsed="0.000065"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:19:19.353447" elapsed="0.000079"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:19.353868" 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-04-17T03:19:19.354149" 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-04-17T03:19:19.354735" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:19.354520" elapsed="0.000292"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:19.354495" elapsed="0.000353"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:19.355079" 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-04-17T03:19:19.355329" 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-04-17T03:19:19.355636" elapsed="0.000028"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:19:19.354442" elapsed="0.001268"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:19:19.354264" elapsed="0.001484"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:19.355970" elapsed="0.000029"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:19.356080" elapsed="0.000025"/>
</return>
<msg time="2026-04-17T03:19:19.356312" 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-04-17T03:19:19.278548" elapsed="0.077807"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:19.358563" 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-04-17T03:19:19.358099" elapsed="0.000578">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-04-17T03:19:19.359042" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:19.357477" elapsed="0.001597"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:19.359570" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:19.359173" elapsed="0.000481"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:19:19.360523" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:19.360122" elapsed="0.000438"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:19.359689" elapsed="0.001038"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:19.359146" elapsed="0.001617"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:19.364322" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:19:19.361002" elapsed="0.003370"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:19:19.364463" elapsed="0.000058"/>
</return>
<msg time="2026-04-17T03:19:19.364713" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:19:19.356907" elapsed="0.007841"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:19.366779" 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-04-17T03:19:19.366375" elapsed="0.000511">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-04-17T03:19:19.367017" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:19.365797" elapsed="0.001246"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:19:19.367333" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-04-17T03:19:19.367131" elapsed="0.000351"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:19.367105" elapsed="0.000420"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:19.367760" 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-04-17T03:19:19.368053" elapsed="0.000034"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:19:19.368209" elapsed="0.000025"/>
</return>
<msg time="2026-04-17T03:19:19.371443" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:19:19.365264" elapsed="0.006224"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:19.373714" 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-04-17T03:19:19.373329" elapsed="0.000461"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:19.374405" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:19.374047" elapsed="0.000420"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:19:19.381496" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:19.583354" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:19.985642" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:19.988429" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:19:19.377706" elapsed="0.616351">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:19:19.374561" elapsed="0.619723">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:19.994908" elapsed="0.000131"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:19.994376" elapsed="0.000875"/>
</branch>
<status status="FAIL" start="2026-04-17T03:19:19.374533" elapsed="0.620806">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:19.996179" elapsed="0.000123"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:19.996469" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:19:19.996413" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:19.996385" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:19.996767" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:19:19.996861" 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-04-17T03:19:19.372037" elapsed="0.625004">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:19.997149" 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-04-17T03:19:19.254987" elapsed="0.742302">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:19.997699" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:19.997419" elapsed="0.000389"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:19.997396" elapsed="0.000446"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:19.997887" elapsed="0.000020"/>
</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="FAIL" start="2026-04-17T03:19:19.248424" elapsed="0.749629">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:19:19.234445" elapsed="0.763762">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:19:21.060376" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:21.059901" elapsed="0.000513"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:21.061403" 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-04-17T03:19:21.060975" elapsed="0.000512">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-04-17T03:19:21.061589" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:21.060598" elapsed="0.001017"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:21.062284" 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-04-17T03:19:21.061787" elapsed="0.000547"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:19:21.062741" 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-04-17T03:19:21.063014" 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-04-17T03:19:21.062554" elapsed="0.000558"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:21.063573" 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-04-17T03:19:21.063300" elapsed="0.000322"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:21.065457" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:21.064766" elapsed="0.000780"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:19:21.066338" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:19:21.065780" elapsed="0.000599"/>
</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-04-17T03:19:21.067113" elapsed="0.000072"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:21.068043" 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-04-17T03:19:21.068384" elapsed="0.000046"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:19:21.066691" elapsed="0.001860"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:19:21.066459" elapsed="0.002159"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:19:21.068671" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:19:21.068852" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:19:21.064237" elapsed="0.004641"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:21.063714" elapsed="0.005196"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:21.069105" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:21.068953" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:21.063682" elapsed="0.005500"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:19:21.069793" 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-04-17T03:19:21.069326" elapsed="0.000495"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:19:21.069870" 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-04-17T03:19:21.059182" elapsed="0.010833"/>
</kw>
<msg time="2026-04-17T03:19:21.070072" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:19:21.045621" elapsed="0.024508"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:19:21.087090" elapsed="0.000070"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:21.099894" elapsed="0.000046"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:19:21.113318" elapsed="0.000067"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:21.113637" elapsed="0.000117"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:21.113951" 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-04-17T03:19:21.114413" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:21.114243" elapsed="0.000243"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:21.114225" elapsed="0.000289"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:21.114662" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:21.114832" elapsed="0.000071"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:21.115077" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:19:21.114184" elapsed="0.000948"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:19:21.114046" elapsed="0.001114"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:21.115309" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:21.115390" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:19:21.115561" 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-04-17T03:19:21.040686" elapsed="0.074903"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:21.117106" 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-04-17T03:19:21.116796" elapsed="0.000387">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-04-17T03:19:21.117281" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:21.116385" elapsed="0.000921"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:21.117655" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:21.117379" elapsed="0.000339"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:19:21.118269" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:21.117940" elapsed="0.000356"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:21.117743" elapsed="0.000589"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:21.117360" elapsed="0.000994"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:21.121070" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:19:21.118516" elapsed="0.002581"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:19:21.121150" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:19:21.121314" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:19:21.115991" elapsed="0.005348"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:21.122637" 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-04-17T03:19:21.122364" elapsed="0.000351">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-04-17T03:19:21.122813" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:21.122014" elapsed="0.000871"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:19:21.123144" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:19:21.122988" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:21.122964" 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-04-17T03:19:21.123402" 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-04-17T03:19:21.123671" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:19:21.123739" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:19:21.126085" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:19:21.121658" elapsed="0.004455"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:21.127621" 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-04-17T03:19:21.127352" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:21.128125" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:21.127858" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:19:21.133904" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:21.335437" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:21.737867" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:21.740494" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:19:21.130568" elapsed="0.615021">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:19:21.128239" elapsed="0.617561">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:21.746335" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:21.745889" elapsed="0.000597"/>
</branch>
<status status="FAIL" start="2026-04-17T03:19:21.128220" elapsed="0.618319">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:21.747757" elapsed="0.000043"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:21.747997" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:19:21.747915" elapsed="0.000149"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:21.747886" elapsed="0.000210"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:21.748326" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:19:21.748429" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:19:21.126440" elapsed="0.622159">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:21.748715" 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-04-17T03:19:21.016516" elapsed="0.732348">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:21.749379" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:21.749099" elapsed="0.000389"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:21.749071" elapsed="0.000453"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:21.749573" elapsed="0.000022"/>
</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="FAIL" start="2026-04-17T03:19:21.007686" elapsed="0.742041">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:19:20.998747" elapsed="0.751135">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:19:22.817077" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:22.816552" elapsed="0.000567"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:22.818264" 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-04-17T03:19:22.817764" elapsed="0.000590">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-04-17T03:19:22.818470" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:22.817336" elapsed="0.001163"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:22.819188" 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-04-17T03:19:22.818715" elapsed="0.000507"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:19:22.819568" 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-04-17T03:19:22.819805" 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-04-17T03:19:22.819402" elapsed="0.000450"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:22.820600" 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-04-17T03:19:22.820161" elapsed="0.000522"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:22.822754" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:22.821958" elapsed="0.000911"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:19:22.823771" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:19:22.823141" 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-04-17T03:19:22.824470" elapsed="0.000104"/>
</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-04-17T03:19:22.825795" elapsed="0.000079"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:19:22.826332" elapsed="0.000069"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:19:22.824185" elapsed="0.002423"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:19:22.823894" elapsed="0.002834"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:19:22.826809" elapsed="0.000057"/>
</return>
<msg time="2026-04-17T03:19:22.827145" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:19:22.821369" elapsed="0.005817"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:22.820816" elapsed="0.006508"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:22.827612" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:22.827377" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:22.820779" elapsed="0.006965"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:19:22.828743" 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-04-17T03:19:22.827988" elapsed="0.000797"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:19:22.828859" 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/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-04-17T03:19:22.815608" elapsed="0.013499"/>
</kw>
<msg time="2026-04-17T03:19:22.829192" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:19:22.801496" elapsed="0.027778"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:19:22.844942" 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//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-04-17T03:19:22.860003" 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/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-04-17T03:19:22.872711" elapsed="0.000042"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:22.872984" 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-04-17T03:19:22.873172" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:22.873598" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:22.873445" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:22.873426" 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-04-17T03:19:22.873841" 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-04-17T03:19:22.874057" 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-04-17T03:19:22.874230" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:19:22.873385" elapsed="0.000899"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:19:22.873257" elapsed="0.001055"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:22.874474" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:22.874557" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:19:22.874776" 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-04-17T03:19:22.796400" elapsed="0.078487"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:22.876700" 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-04-17T03:19:22.876387" elapsed="0.000392">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-04-17T03:19:22.876879" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:22.875687" elapsed="0.001223"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:22.877285" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:22.877004" elapsed="0.000343"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:19:22.877883" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:22.877566" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:22.877380" elapsed="0.000583"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:22.876985" elapsed="0.001001"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:22.880651" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:19:22.878153" elapsed="0.002530"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:19:22.880736" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:19:22.880900" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:19:22.875291" elapsed="0.005649"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:22.882266" 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-04-17T03:19:22.882000" elapsed="0.000344">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-04-17T03:19:22.882443" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:22.881633" elapsed="0.000834"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:19:22.882716" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:19:22.882547" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:22.882526" elapsed="0.000276"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:22.882985" 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-04-17T03:19:22.883219" elapsed="0.000032"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:19:22.883305" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:19:22.885460" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:19:22.881276" elapsed="0.004211"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:22.887006" 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-04-17T03:19:22.886717" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:22.887464" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:22.887212" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:19:22.892972" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:23.094502" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:23.496996" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:23.499995" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:19:22.889794" elapsed="0.616694">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:19:22.887576" elapsed="0.619274">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:23.507658" elapsed="0.000068"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:23.507012" elapsed="0.000792"/>
</branch>
<status status="FAIL" start="2026-04-17T03:19:22.887557" elapsed="0.620285">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:23.508623" elapsed="0.000044"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:23.508843" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:19:23.508784" elapsed="0.000174"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:23.508754" elapsed="0.000255"/>
</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-04-17T03:19:23.509289" elapsed="0.000040"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:19:23.509422" 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-04-17T03:19:22.885823" elapsed="0.623783">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:23.509729" 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-04-17T03:19:22.770794" elapsed="0.739085">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:23.510536" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:23.510243" elapsed="0.000457"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:23.510216" elapsed="0.000545"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:23.510833" elapsed="0.000031"/>
</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="FAIL" start="2026-04-17T03:19:22.760760" elapsed="0.750288">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:19:22.750554" elapsed="0.760657">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:19:24.578661" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:24.578041" elapsed="0.000669"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:24.580062" 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-04-17T03:19:24.579498" elapsed="0.000666">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-04-17T03:19:24.580302" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:24.578989" elapsed="0.001349"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:24.581215" 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-04-17T03:19:24.580631" elapsed="0.000622"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:19:24.581694" 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-04-17T03:19:24.581915" 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-04-17T03:19:24.581488" elapsed="0.000482"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:24.582555" 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-04-17T03:19:24.582206" elapsed="0.000416"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:24.584429" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:24.583771" elapsed="0.000748"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:19:24.585361" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:19:24.584808" elapsed="0.000590"/>
</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-04-17T03:19:24.586002" 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-04-17T03:19:24.587032" elapsed="0.000070"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:24.587513" elapsed="0.000065"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:19:24.585705" elapsed="0.002042"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:19:24.585478" elapsed="0.002365"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:19:24.587917" elapsed="0.000081"/>
</return>
<msg time="2026-04-17T03:19:24.588194" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:19:24.583259" elapsed="0.004972"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:24.582737" elapsed="0.005539"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:24.588530" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:24.588315" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:24.582703" elapsed="0.005938"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:19:24.589555" 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-04-17T03:19:24.588877" elapsed="0.000716"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:19:24.589658" 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//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-04-17T03:19:24.576861" elapsed="0.012978"/>
</kw>
<msg time="2026-04-17T03:19:24.589921" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:19:24.558528" elapsed="0.031520"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:19:24.607664" elapsed="0.000071"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:19:24.625242" elapsed="0.000077"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:19:24.642982" elapsed="0.000089"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:24.643435" elapsed="0.000037"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:24.643711" 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-04-17T03:19:24.644382" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:24.644154" elapsed="0.000306"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:24.644127" elapsed="0.000367"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:24.644701" 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-04-17T03:19:24.644977" 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-04-17T03:19:24.645220" elapsed="0.000030"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:19:24.644067" elapsed="0.001231"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:19:24.643837" elapsed="0.001501"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:24.645551" elapsed="0.000032"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:24.645667" elapsed="0.000027"/>
</return>
<msg time="2026-04-17T03:19:24.645927" 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-04-17T03:19:24.552183" elapsed="0.093804"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:24.647794" 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-04-17T03:19:24.647465" elapsed="0.000422">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-04-17T03:19:24.648028" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:24.647014" elapsed="0.001045"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:24.648489" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:24.648149" elapsed="0.000413"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:19:24.649298" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:24.648854" elapsed="0.000480"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:24.648598" elapsed="0.000858"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:24.648126" elapsed="0.001364"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:24.652979" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:19:24.649714" elapsed="0.003307"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:19:24.653101" elapsed="0.000053"/>
</return>
<msg time="2026-04-17T03:19:24.653342" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:19:24.646512" elapsed="0.006866"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:24.654986" 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-04-17T03:19:24.654685" elapsed="0.000373">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-04-17T03:19:24.655155" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:24.654329" elapsed="0.000850"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:19:24.655398" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:19:24.655253" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:24.655234" elapsed="0.000248"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:24.655632" 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-04-17T03:19:24.655805" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:19:24.655870" elapsed="0.000014"/>
</return>
<msg time="2026-04-17T03:19:24.658025" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:19:24.653857" elapsed="0.004196"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:24.659855" 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-04-17T03:19:24.659537" elapsed="0.000370"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:24.660430" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:24.660141" elapsed="0.000335"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:19:24.665896" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:24.867404" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:25.270285" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:25.272697" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:19:24.662921" elapsed="0.614435">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:19:24.660550" elapsed="0.616960">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:25.277886" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:25.277572" elapsed="0.000445"/>
</branch>
<status status="FAIL" start="2026-04-17T03:19:24.660528" elapsed="0.617527">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:25.278696" elapsed="0.000114"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:25.279037" elapsed="0.000068"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:19:25.278937" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:25.278902" elapsed="0.000282"/>
</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-04-17T03:19:25.279408" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:19:25.279514" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:19:24.658499" elapsed="0.621186">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:25.279802" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:19:24.528020" elapsed="0.751975">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:25.280424" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:25.280143" elapsed="0.000391"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:25.280118" elapsed="0.000453"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:25.280619" elapsed="0.000021"/>
</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="FAIL" start="2026-04-17T03:19:24.519802" elapsed="0.760968">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:19:24.512002" elapsed="0.768923">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:19:26.345788" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:26.345330" elapsed="0.000493"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:26.346867" 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-04-17T03:19:26.346401" elapsed="0.000573">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-04-17T03:19:26.347077" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:26.346023" elapsed="0.001079"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:26.347758" 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-04-17T03:19:26.347336" elapsed="0.000451"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:19:26.348139" 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-04-17T03:19:26.348321" 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-04-17T03:19:26.347990" elapsed="0.000431"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:26.348877" 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-04-17T03:19:26.348611" elapsed="0.000318"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:26.350377" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:26.349832" elapsed="0.000612"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:19:26.351091" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:19:26.350659" elapsed="0.000474"/>
</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-04-17T03:19:26.351647" elapsed="0.000059"/>
</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-04-17T03:19:26.352490" elapsed="0.000056"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:19:26.352841" elapsed="0.000046"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:19:26.351427" elapsed="0.001612"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:19:26.351193" elapsed="0.001921"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:19:26.353180" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:19:26.353368" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:19:26.349436" elapsed="0.003958"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:26.349031" elapsed="0.004396"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:26.353627" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:26.353454" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:26.349005" elapsed="0.004704"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:19:26.354375" 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-04-17T03:19:26.353858" elapsed="0.000546"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:19:26.354455" 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-04-17T03:19:26.344503" elapsed="0.010099"/>
</kw>
<msg time="2026-04-17T03:19:26.354660" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:19:26.330623" elapsed="0.024093"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:19:26.375194" 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-04-17T03:19:26.388753" 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-04-17T03:19:26.402455" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:26.402699" elapsed="0.000106"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:26.403054" 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-04-17T03:19:26.403535" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:26.403344" elapsed="0.000260"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:26.403323" 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-04-17T03:19:26.403780" 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-04-17T03:19:26.404002" elapsed="0.000036"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:26.404230" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:19:26.403283" elapsed="0.001005"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:19:26.403159" elapsed="0.001157"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:26.404468" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:26.404548" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:19:26.404705" 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-04-17T03:19:26.325311" elapsed="0.079423"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:26.406277" 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-04-17T03:19:26.405974" elapsed="0.000379">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-04-17T03:19:26.406449" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:26.405524" elapsed="0.000951"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:26.406817" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:26.406547" elapsed="0.000330"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:19:26.407417" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:26.407108" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:26.406903" elapsed="0.000577"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:26.406529" elapsed="0.000974"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:26.410037" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:19:26.407659" elapsed="0.002407"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:19:26.410125" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:19:26.410310" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:19:26.405155" elapsed="0.005181"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:26.411670" 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-04-17T03:19:26.411429" elapsed="0.000306">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-04-17T03:19:26.411832" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:26.411069" elapsed="0.000787"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:19:26.412086" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-17T03:19:26.411932" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:26.411910" elapsed="0.000275"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:26.412385" 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-04-17T03:19:26.412624" elapsed="0.000036"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:19:26.412718" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:19:26.414843" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:19:26.410676" elapsed="0.004195"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:26.416535" 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-04-17T03:19:26.416105" elapsed="0.000488"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:26.417124" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:26.416768" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:19:26.422669" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:26.624601" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:27.027218" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:27.029499" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:19:26.419506" elapsed="0.612558">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:19:26.417240" elapsed="0.614957">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:27.032547" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:27.032261" elapsed="0.000364"/>
</branch>
<status status="FAIL" start="2026-04-17T03:19:26.417222" elapsed="0.615428">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:27.033154" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:27.033313" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:19:27.033264" elapsed="0.000099"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:27.033243" elapsed="0.000142"/>
</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-04-17T03:19:27.033536" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:19:27.033606" 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-04-17T03:19:26.415214" elapsed="0.618515">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:27.033810" 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-04-17T03:19:26.300093" elapsed="0.733821">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:27.034285" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:27.034092" elapsed="0.000284"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:27.034073" elapsed="0.000328"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:27.034436" elapsed="0.000016"/>
</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="FAIL" start="2026-04-17T03:19:26.293193" elapsed="0.741352">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:19:26.281815" elapsed="0.752884">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:19:28.096221" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:28.095753" elapsed="0.000502"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:28.097295" 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-04-17T03:19:28.096811" elapsed="0.000564">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-04-17T03:19:28.097477" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:28.096438" elapsed="0.001065"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:28.098098" 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-04-17T03:19:28.097674" elapsed="0.000452"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:19:28.098440" 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-04-17T03:19:28.098659" 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-04-17T03:19:28.098293" elapsed="0.000396"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:28.099181" 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-04-17T03:19:28.098857" 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-04-17T03:19:28.100595" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:28.100107" elapsed="0.000554"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:19:28.101432" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:19:28.100838" elapsed="0.000621"/>
</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-04-17T03:19:28.101880" elapsed="0.000051"/>
</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-04-17T03:19:28.102852" 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-04-17T03:19:28.103219" elapsed="0.000048"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:19:28.101685" elapsed="0.001708"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:19:28.101516" elapsed="0.001948"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:19:28.103518" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:19:28.103695" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:19:28.099708" elapsed="0.004013"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:28.099329" elapsed="0.004491"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:28.104018" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:28.103847" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:28.099302" elapsed="0.004796"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:19:28.104708" 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-04-17T03:19:28.104245" elapsed="0.000493"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:19:28.104787" 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-04-17T03:19:28.094962" elapsed="0.009957"/>
</kw>
<msg time="2026-04-17T03:19:28.104999" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:19:28.081356" elapsed="0.023714"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:19:28.119466" elapsed="0.000061"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:28.132158" 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//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-04-17T03:19:28.144563" elapsed="0.000046"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:28.144834" 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-04-17T03:19:28.145042" 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-04-17T03:19:28.145472" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:28.145320" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:28.145301" 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-04-17T03:19:28.145697" 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-04-17T03:19:28.145863" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:28.146045" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:19:28.145261" elapsed="0.000838"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:19:28.145131" elapsed="0.000997"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:28.146274" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:28.146355" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:19:28.146513" 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-04-17T03:19:28.076250" elapsed="0.070367"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:28.148136" 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-04-17T03:19:28.147821" elapsed="0.000391">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-04-17T03:19:28.148308" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:28.147415" elapsed="0.000918"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:28.148672" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:28.148406" elapsed="0.000323"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:19:28.149254" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:28.148951" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:28.148753" elapsed="0.000564"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:28.148387" elapsed="0.000951"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:28.151864" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:19:28.149491" elapsed="0.002401"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:19:28.151965" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:19:28.152135" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:19:28.146995" elapsed="0.005165"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:28.153429" 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-04-17T03:19:28.153180" elapsed="0.000315">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/empty_topology/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-17T03:19:28.153590" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:28.152822" elapsed="0.000793"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:19:28.153823" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:19:28.153686" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:28.153667" elapsed="0.000246"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:28.154080" 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-04-17T03:19:28.154290" elapsed="0.000027"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:19:28.154378" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:19:28.156625" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:19:28.152484" elapsed="0.004168"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:28.158135" 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-04-17T03:19:28.157849" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:28.158600" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:28.158339" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:19:28.163883" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:28.366166" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:28.769730" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:28.773460" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:19:28.160861" elapsed="0.617885">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:19:28.158712" elapsed="0.620336">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:28.779684" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:28.779154" elapsed="0.000751"/>
</branch>
<status status="FAIL" start="2026-04-17T03:19:28.158694" elapsed="0.621311">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:28.781018" elapsed="0.000032"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:28.781385" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:19:28.781336" elapsed="0.000103"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:28.781119" elapsed="0.000341"/>
</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-04-17T03:19:28.781619" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:19:28.781689" elapsed="0.000017"/>
</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-04-17T03:19:28.156995" elapsed="0.624831">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:28.781912" 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-04-17T03:19:28.052067" elapsed="0.729973">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:28.782357" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:28.782149" elapsed="0.000283"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:28.782128" elapsed="0.000329"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:28.782490" elapsed="0.000015"/>
</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="FAIL" start="2026-04-17T03:19:28.042892" elapsed="0.739703">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:19:28.035459" elapsed="0.747247">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:19:29.848341" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:29.847744" elapsed="0.000639"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:29.849550" 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-04-17T03:19:29.849062" elapsed="0.000599">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-04-17T03:19:29.849783" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:29.848582" elapsed="0.001227"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:29.850494" 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-04-17T03:19:29.850027" elapsed="0.000506"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:19:29.850913" 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-04-17T03:19:29.851118" 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-04-17T03:19:29.850742" elapsed="0.000404"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:29.851652" 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-04-17T03:19:29.851365" elapsed="0.000356"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:29.853308" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:29.852807" elapsed="0.000580"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:19:29.854001" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:19:29.853561" elapsed="0.000468"/>
</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-04-17T03:19:29.854499" elapsed="0.000062"/>
</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-04-17T03:19:29.855422" elapsed="0.000055"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:19:29.855788" elapsed="0.000050"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:19:29.854278" elapsed="0.001717"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:19:29.854091" elapsed="0.001975"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:19:29.856124" elapsed="0.000045"/>
</return>
<msg time="2026-04-17T03:19:29.856325" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:19:29.852318" elapsed="0.004040"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:29.851834" elapsed="0.004568"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:29.856647" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:29.856441" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:29.851798" elapsed="0.004936"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:19:29.857460" 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-04-17T03:19:29.856947" elapsed="0.000543"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:19:29.857542" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:19:29.846575" elapsed="0.011103"/>
</kw>
<msg time="2026-04-17T03:19:29.857739" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:19:29.830034" elapsed="0.027766"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:19:29.875039" elapsed="0.000095"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:19:29.890721" 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/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-04-17T03:19:29.904111" elapsed="0.000046"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:29.904410" 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-04-17T03:19:29.904623" 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-04-17T03:19:29.905105" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:29.904922" elapsed="0.000243"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:29.904903" elapsed="0.000290"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:29.905383" 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-04-17T03:19:29.905566" 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-04-17T03:19:29.905734" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:19:29.904858" elapsed="0.000931"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:19:29.904718" elapsed="0.001100"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:29.905992" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:29.906078" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:19:29.906261" 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-04-17T03:19:29.825402" elapsed="0.080889"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:29.907886" 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-04-17T03:19:29.907517" elapsed="0.000477">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-04-17T03:19:29.908098" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:29.907073" elapsed="0.001050"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:29.908476" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:29.908197" elapsed="0.000354"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:19:29.909127" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:29.908797" elapsed="0.000358"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:29.908584" elapsed="0.000674"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:29.908177" elapsed="0.001106"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:29.911779" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:19:29.909495" elapsed="0.002312"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:19:29.911861" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:19:29.912048" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:19:29.906670" elapsed="0.005404"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:29.913372" 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-04-17T03:19:29.913128" elapsed="0.000390">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-04-17T03:19:29.913627" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:29.912757" elapsed="0.000902"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:19:29.913900" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:19:29.913733" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:29.913713" elapsed="0.000294"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:29.914161" 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-04-17T03:19:29.914335" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:19:29.914401" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:19:29.916552" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:19:29.912402" elapsed="0.004178"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:29.918205" 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-04-17T03:19:29.917913" elapsed="0.000342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:29.918669" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:29.918414" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:19:29.924326" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:30.127101" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:30.530805" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:30.533857" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:19:29.920992" elapsed="0.615515">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:19:29.918781" elapsed="0.617850">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:30.536989" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:30.536681" elapsed="0.000383"/>
</branch>
<status status="FAIL" start="2026-04-17T03:19:29.918763" elapsed="0.618327">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:30.537657" elapsed="0.000103"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:30.537890" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:19:30.537846" elapsed="0.000110"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:30.537825" elapsed="0.000159"/>
</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-04-17T03:19:30.538140" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:19:30.538214" 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-04-17T03:19:29.916983" elapsed="0.621355">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:30.538421" 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-04-17T03:19:29.801706" elapsed="0.736819">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:30.538819" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:30.538622" elapsed="0.000270"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:30.538605" elapsed="0.000311"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:30.538968" elapsed="0.000015"/>
</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="FAIL" start="2026-04-17T03:19:29.793956" elapsed="0.745119">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:19:29.783807" elapsed="0.755375">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:19:31.609327" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:31.608798" elapsed="0.000575"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:31.610389" 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-04-17T03:19:31.609921" 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-04-17T03:19:31.610576" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:31.609559" elapsed="0.001076"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:31.611418" 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-04-17T03:19:31.610870" elapsed="0.000587"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:19:31.611878" 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-04-17T03:19:31.612105" 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-04-17T03:19:31.611688" elapsed="0.000534"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:31.612726" 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-04-17T03:19:31.612442" elapsed="0.000333"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:31.614150" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:31.613660" elapsed="0.000557"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:19:31.614886" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:19:31.614410" 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-04-17T03:19:31.615384" elapsed="0.000055"/>
</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-04-17T03:19:31.616250" elapsed="0.000053"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:19:31.616658" elapsed="0.000050"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:19:31.615161" elapsed="0.001675"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:19:31.614990" elapsed="0.001964"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:19:31.617033" elapsed="0.000051"/>
</return>
<msg time="2026-04-17T03:19:31.617285" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:19:31.613267" elapsed="0.004056"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:31.612859" elapsed="0.004514"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:31.617665" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:31.617436" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:31.612834" elapsed="0.004946"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:19:31.618588" 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-04-17T03:19:31.617998" elapsed="0.000626"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:19:31.618721" 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-04-17T03:19:31.608040" elapsed="0.010852"/>
</kw>
<msg time="2026-04-17T03:19:31.618991" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:19:31.592992" elapsed="0.026083"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:19:31.636698" elapsed="0.000083"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:19:31.653951" elapsed="0.000070"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:19:31.667786" elapsed="0.000054"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:31.668148" elapsed="0.000129"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:31.668506" 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-04-17T03:19:31.669113" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:31.668864" elapsed="0.000329"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:31.668840" elapsed="0.000389"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:31.669433" 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-04-17T03:19:31.669667" elapsed="0.000029"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:31.669882" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:19:31.668788" elapsed="0.001171"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:19:31.668615" elapsed="0.001374"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:31.670141" elapsed="0.000213"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:31.670433" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:19:31.670638" 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-04-17T03:19:31.585539" elapsed="0.085129"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:31.672347" 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-04-17T03:19:31.672035" elapsed="0.000394">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-04-17T03:19:31.672543" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:31.671582" 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-04-17T03:19:31.672970" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:31.672673" elapsed="0.000361"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:19:31.673565" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:31.673248" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:31.673061" elapsed="0.000572"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:31.672649" elapsed="0.001011"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:31.676166" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:19:31.673820" elapsed="0.002375"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:19:31.676446" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:19:31.676623" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:19:31.671084" elapsed="0.005564"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:31.678074" 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-04-17T03:19:31.677772" elapsed="0.000377">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-04-17T03:19:31.678248" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:31.677374" elapsed="0.000899"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:19:31.678500" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:19:31.678355" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:31.678334" elapsed="0.000255"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:31.678739" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:31.679007" elapsed="0.000025"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:19:31.679082" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:19:31.681751" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:19:31.677002" elapsed="0.004776"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:31.683338" 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-04-17T03:19:31.683044" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:31.683811" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:31.683549" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:19:31.689157" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:31.892241" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:32.295477" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:32.298349" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:19:31.686244" elapsed="0.618625">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:19:31.683926" elapsed="0.621229">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:32.305497" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:32.305232" elapsed="0.000353"/>
</branch>
<status status="FAIL" start="2026-04-17T03:19:31.683908" elapsed="0.621705">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:32.306251" elapsed="0.000033"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:32.306410" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:19:32.306368" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:32.306347" elapsed="0.000132"/>
</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-04-17T03:19:32.306630" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:19:32.306701" elapsed="0.000017"/>
</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-04-17T03:19:31.682133" elapsed="0.624692">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:32.306906" 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-04-17T03:19:31.557135" elapsed="0.749896">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:32.307380" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:32.307189" elapsed="0.000265"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:32.307171" elapsed="0.000308"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:32.307513" elapsed="0.000015"/>
</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="FAIL" start="2026-04-17T03:19:31.550627" elapsed="0.756992">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:19:31.539920" elapsed="0.767807">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:19:33.372086" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:33.371636" elapsed="0.000487"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:33.373174" 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-04-17T03:19:33.372653" elapsed="0.000605">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-04-17T03:19:33.373357" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:33.372305" elapsed="0.001076"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:33.373964" 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-04-17T03:19:33.373550" elapsed="0.000443"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:19:33.374309" 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-04-17T03:19:33.374476" 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-04-17T03:19:33.374164" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:33.374912" 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-04-17T03:19:33.374662" 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-04-17T03:19:33.376258" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:33.375775" elapsed="0.000544"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:19:33.376890" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:19:33.376485" elapsed="0.000437"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:33.377386" elapsed="0.000047"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:33.378143" 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-04-17T03:19:33.378483" elapsed="0.000046"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:19:33.377193" elapsed="0.001459"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:19:33.377019" elapsed="0.001703"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:19:33.378776" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:19:33.378973" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:19:33.375402" elapsed="0.003597"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:33.375061" elapsed="0.004031"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:33.379271" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:33.379120" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:33.375033" elapsed="0.004315"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:19:33.379995" 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-04-17T03:19:33.379495" elapsed="0.000529"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:19:33.380075" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:19:33.370947" elapsed="0.009256"/>
</kw>
<msg time="2026-04-17T03:19:33.380258" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:19:33.358004" elapsed="0.022304"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:19:33.393248" 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//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-04-17T03:19:33.406247" elapsed="0.000078"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:19:33.419521" elapsed="0.000070"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:33.419857" 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-04-17T03:19:33.420070" 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-04-17T03:19:33.420537" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:33.420380" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:33.420356" 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-04-17T03:19:33.420767" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:33.420960" 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-04-17T03:19:33.421138" elapsed="0.000069"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:19:33.420307" elapsed="0.000943"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:19:33.420166" elapsed="0.001116"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:33.421464" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:33.421550" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:19:33.421738" 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-04-17T03:19:33.353238" elapsed="0.068631"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:33.423411" 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-04-17T03:19:33.423096" elapsed="0.000392">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-04-17T03:19:33.423586" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:33.422663" elapsed="0.000947"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:33.423975" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:33.423683" elapsed="0.000352"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:19:33.424551" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:33.424247" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:33.424060" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:33.423664" elapsed="0.000970"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:33.427103" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:19:33.424786" elapsed="0.002344"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:19:33.427184" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:19:33.427355" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:19:33.422291" elapsed="0.005096"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:33.428875" 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-04-17T03:19:33.428613" elapsed="0.000358">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-04-17T03:19:33.429070" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:33.428079" elapsed="0.001017"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:19:33.429387" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-04-17T03:19:33.429170" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:33.429152" elapsed="0.000328"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:33.429632" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:33.429804" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:19:33.429870" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:19:33.432045" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:19:33.427716" elapsed="0.004357"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:33.433628" 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-04-17T03:19:33.433330" elapsed="0.000357"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:33.434147" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:33.433847" elapsed="0.000355"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:19:33.439524" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:33.641167" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:34.044303" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:34.046562" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:19:33.436443" elapsed="0.613613">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:19:33.434272" elapsed="0.615944">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:34.050614" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:34.050278" elapsed="0.000469"/>
</branch>
<status status="FAIL" start="2026-04-17T03:19:33.434254" elapsed="0.616542">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:34.051478" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:34.051685" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:19:34.051627" elapsed="0.000122"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:34.051600" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:34.052016" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:19:34.052119" elapsed="0.000024"/>
</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-04-17T03:19:33.432425" elapsed="0.619863">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:34.052398" 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-04-17T03:19:33.329573" elapsed="0.722971">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:34.053022" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:34.052698" elapsed="0.000436"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:34.052665" elapsed="0.000504"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:34.053215" elapsed="0.000021"/>
</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="FAIL" start="2026-04-17T03:19:33.321591" elapsed="0.731769">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:19:33.308748" elapsed="0.744948">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:19:35.112834" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:35.112209" elapsed="0.000664"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:35.114189" 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-04-17T03:19:35.113656" elapsed="0.000619">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-04-17T03:19:35.114396" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:35.113123" elapsed="0.001306"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:35.115165" 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-04-17T03:19:35.114639" elapsed="0.000563"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:19:35.115607" 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-04-17T03:19:35.115802" 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-04-17T03:19:35.115414" elapsed="0.000420"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:35.116386" 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-04-17T03:19:35.116079" elapsed="0.000363"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:35.118037" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:35.117432" elapsed="0.000686"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:19:35.118723" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:19:35.118315" elapsed="0.000436"/>
</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-04-17T03:19:35.119259" elapsed="0.000048"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:35.120086" elapsed="0.000073"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:19:35.120534" elapsed="0.000050"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:19:35.119061" elapsed="0.001683"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:19:35.118819" elapsed="0.002003"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:19:35.120894" elapsed="0.000073"/>
</return>
<msg time="2026-04-17T03:19:35.121123" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:19:35.117024" elapsed="0.004126"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:35.116543" elapsed="0.004640"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:35.121421" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:35.121213" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:35.116514" elapsed="0.005030"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:19:35.122462" 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-04-17T03:19:35.121740" elapsed="0.000761"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:19:35.122571" 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/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-04-17T03:19:35.111173" elapsed="0.011567"/>
</kw>
<msg time="2026-04-17T03:19:35.122819" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:19:35.097324" elapsed="0.025573"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:19:35.137047" elapsed="0.000064"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:19:35.154516" elapsed="0.000081"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:19:35.169578" elapsed="0.000080"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:35.169958" 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-04-17T03:19:35.170185" 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-04-17T03:19:35.170684" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:35.170522" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:35.170501" 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-04-17T03:19:35.170923" elapsed="0.000046"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:35.171138" 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-04-17T03:19:35.171353" elapsed="0.000184"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:19:35.170453" elapsed="0.001134"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:19:35.170301" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:35.171829" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:35.171951" elapsed="0.000024"/>
</return>
<msg time="2026-04-17T03:19:35.172156" 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-04-17T03:19:35.092303" elapsed="0.079888"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:35.174148" 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-04-17T03:19:35.173809" elapsed="0.000461">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-04-17T03:19:35.174400" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:35.173266" elapsed="0.001167"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:35.174912" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:35.174535" elapsed="0.000477"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:19:35.175695" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:35.175300" elapsed="0.000430"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:35.175046" elapsed="0.000833"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:35.174508" elapsed="0.001410"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:35.178672" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:19:35.176144" elapsed="0.002560"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:19:35.178764" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:19:35.178964" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:19:35.172740" elapsed="0.006252"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:35.180413" 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-04-17T03:19:35.180119" elapsed="0.000366">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-04-17T03:19:35.180643" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:35.179696" elapsed="0.000974"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:19:35.180898" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-17T03:19:35.180749" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:35.180729" elapsed="0.000278"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:35.181167" 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-04-17T03:19:35.181344" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:19:35.181411" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:19:35.183653" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:19:35.179339" elapsed="0.004343"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:35.185378" 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-04-17T03:19:35.185058" elapsed="0.000379"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:35.185958" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:35.185639" 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-04-17T03:19:35.191494" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:35.394021" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:35.796850" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:35.798896" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:19:35.188518" elapsed="0.612905">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:19:35.186104" elapsed="0.615471">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:35.801976" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:35.801640" elapsed="0.000436"/>
</branch>
<status status="FAIL" start="2026-04-17T03:19:35.186079" elapsed="0.616030">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:35.802785" elapsed="0.000122"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:35.803116" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:19:35.803056" elapsed="0.000124"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:35.803027" elapsed="0.000183"/>
</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-04-17T03:19:35.803424" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:19:35.803555" elapsed="0.000030"/>
</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-04-17T03:19:35.184037" elapsed="0.619707">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:35.803892" elapsed="0.000026"/>
</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-04-17T03:19:35.069010" elapsed="0.735086">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:35.804510" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:35.804236" elapsed="0.000377"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:35.804212" elapsed="0.000435"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:35.804693" elapsed="0.000021"/>
</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="FAIL" start="2026-04-17T03:19:35.061507" elapsed="0.743331">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:19:35.054388" elapsed="0.750620">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:19:36.864675" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:36.864270" elapsed="0.000441"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:36.865671" 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-04-17T03:19:36.865250" elapsed="0.000504">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-04-17T03:19:36.865850" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:36.864888" elapsed="0.000987"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:36.866499" 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-04-17T03:19:36.866091" elapsed="0.000438"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:19:36.866877" 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-04-17T03:19:36.867096" 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-04-17T03:19:36.866721" elapsed="0.000461"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:36.867623" 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-04-17T03:19:36.867355" elapsed="0.000318"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:36.869152" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:36.868661" elapsed="0.000556"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:19:36.869808" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:19:36.869385" elapsed="0.000452"/>
</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-04-17T03:19:36.870291" elapsed="0.000047"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:36.871071" 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-04-17T03:19:36.871640" elapsed="0.000047"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:19:36.870094" elapsed="0.001719"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:19:36.869894" elapsed="0.001990"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:19:36.871955" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:19:36.872136" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:19:36.868098" elapsed="0.004064"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:36.867753" elapsed="0.004442"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:36.872371" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:36.872219" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:36.867729" elapsed="0.004721"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:19:36.873073" 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-04-17T03:19:36.872597" elapsed="0.000506"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:19:36.873153" 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-04-17T03:19:36.863625" elapsed="0.009660"/>
</kw>
<msg time="2026-04-17T03:19:36.873343" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:19:36.850827" elapsed="0.022574"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:19:36.891964" 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//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-04-17T03:19:36.904288" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:36.916692" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:36.916941" elapsed="0.000095"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:36.917205" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:36.917604" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:36.917452" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:36.917435" 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-04-17T03:19:36.917889" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:36.918076" 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-04-17T03:19:36.918251" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:19:36.917400" elapsed="0.000905"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:19:36.917287" elapsed="0.001044"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:36.918478" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:36.918555" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:19:36.918696" 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-04-17T03:19:36.846294" elapsed="0.072430"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:36.920127" 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-04-17T03:19:36.919818" elapsed="0.000384">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-04-17T03:19:36.920297" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:36.919434" elapsed="0.000888"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:36.920654" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:36.920393" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:19:36.921241" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:36.920917" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:36.920737" elapsed="0.000566"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:36.920375" elapsed="0.000949"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:36.923710" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:19:36.921476" elapsed="0.002261"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:19:36.923788" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:19:36.923961" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:19:36.919083" elapsed="0.004904"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:36.925218" 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-04-17T03:19:36.924983" elapsed="0.000300">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-04-17T03:19:36.925377" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:36.924624" elapsed="0.000778"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:19:36.925607" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:19:36.925471" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:36.925453" 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-04-17T03:19:36.925871" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:36.926097" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:19:36.926164" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:19:36.928241" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:19:36.924297" elapsed="0.003971"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:36.929702" 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-04-17T03:19:36.929444" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:36.930240" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:36.929978" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:19:36.935275" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:37.136716" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:37.539477" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:37.542380" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:19:36.932441" elapsed="0.615799">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:19:36.930376" elapsed="0.618406">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:37.549603" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:37.548921" elapsed="0.000790"/>
</branch>
<status status="FAIL" start="2026-04-17T03:19:36.930355" elapsed="0.619395">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:37.550527" elapsed="0.000044"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:37.550749" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:19:37.550688" elapsed="0.000127"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:37.550658" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:37.551098" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:19:37.551205" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:19:36.928585" elapsed="0.622796">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:37.551498" 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-04-17T03:19:36.823648" elapsed="0.728001">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:37.552306" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:37.552005" elapsed="0.000451"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:37.551975" elapsed="0.000532"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:37.552584" elapsed="0.000120"/>
</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="FAIL" start="2026-04-17T03:19:36.815378" elapsed="0.737519">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:19:36.805690" elapsed="0.747408">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:19:38.609692" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:38.609282" elapsed="0.000446"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:38.610660" 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-04-17T03:19:38.610265" elapsed="0.000473">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-04-17T03:19:38.610834" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:38.609901" elapsed="0.000958"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:38.611440" 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-04-17T03:19:38.611049" elapsed="0.000418"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:19:38.611773" 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-04-17T03:19:38.611955" 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-04-17T03:19:38.611629" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:38.612397" 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-04-17T03:19:38.612141" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:38.613740" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:38.613277" elapsed="0.000526"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:19:38.614346" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:19:38.613983" elapsed="0.000389"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:38.614782" elapsed="0.000047"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:38.615539" 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-04-17T03:19:38.615884" elapsed="0.000070"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:19:38.614591" elapsed="0.001487"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:19:38.614427" elapsed="0.001720"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:19:38.616199" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:19:38.616373" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:19:38.612844" elapsed="0.003555"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:38.612521" elapsed="0.003971"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:38.616671" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:38.616519" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:38.612496" elapsed="0.004252"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:19:38.617722" 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-04-17T03:19:38.616893" elapsed="0.000863"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:19:38.617816" 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-04-17T03:19:38.608566" elapsed="0.009397"/>
</kw>
<msg time="2026-04-17T03:19:38.618024" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:19:38.595628" elapsed="0.022449"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:19:38.631145" 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/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-04-17T03:19:38.643484" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:38.657711" elapsed="0.000057"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:38.658084" 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-04-17T03:19:38.658343" 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-04-17T03:19:38.658926" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:38.658716" elapsed="0.000310"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:38.658691" elapsed="0.000371"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:38.659264" 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-04-17T03:19:38.659497" 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-04-17T03:19:38.659727" elapsed="0.000027"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:19:38.658638" elapsed="0.001162"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:19:38.658459" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:38.660059" elapsed="0.000030"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:38.660171" elapsed="0.000023"/>
</return>
<msg time="2026-04-17T03:19:38.660379" 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-04-17T03:19:38.591206" elapsed="0.069345"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:38.662515" 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-04-17T03:19:38.662190" elapsed="0.000401">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-04-17T03:19:38.662687" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:38.661630" 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-04-17T03:19:38.663078" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:38.662784" elapsed="0.000354"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:19:38.663645" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:38.663348" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:38.663163" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:38.662766" elapsed="0.000961"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:38.666123" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:19:38.663878" elapsed="0.002272"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:19:38.666203" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:19:38.666368" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:19:38.661079" elapsed="0.005314"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:38.667630" 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-04-17T03:19:38.667391" elapsed="0.000303">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-04-17T03:19:38.667788" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:38.667052" elapsed="0.000760"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:19:38.668037" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:19:38.667883" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:38.667864" elapsed="0.000257"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:38.668274" 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-04-17T03:19:38.668444" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:19:38.668508" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:19:38.670617" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:19:38.666709" elapsed="0.003935"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:38.672072" 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-04-17T03:19:38.671798" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:38.672513" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:38.672272" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:19:38.677590" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:38.879068" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:39.281753" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:39.284469" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:19:38.674738" elapsed="0.613489">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:19:38.672619" elapsed="0.615803">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:39.288926" elapsed="0.000068"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:39.288527" elapsed="0.000536"/>
</branch>
<status status="FAIL" start="2026-04-17T03:19:38.672602" elapsed="0.616498">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:39.289844" elapsed="0.000045"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:39.290120" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:19:39.290060" elapsed="0.000128"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:39.290027" elapsed="0.000194"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:39.290490" elapsed="0.000055"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:19:39.290625" elapsed="0.000024"/>
</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-04-17T03:19:38.670978" elapsed="0.619824">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:39.290919" elapsed="0.000049"/>
</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-04-17T03:19:38.568273" elapsed="0.722826">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:39.291648" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:39.291243" elapsed="0.000526"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:39.291217" elapsed="0.000588"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:39.291854" elapsed="0.000031"/>
</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="FAIL" start="2026-04-17T03:19:38.560625" elapsed="0.731420">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:19:38.553691" elapsed="0.738536">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:19:40.354375" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:40.353716" elapsed="0.000708"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:40.355763" 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-04-17T03:19:40.355316" elapsed="0.000530">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-04-17T03:19:40.355985" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:40.354689" elapsed="0.001324"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:40.356624" 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-04-17T03:19:40.356188" elapsed="0.000466"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:19:40.356993" 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-04-17T03:19:40.357202" 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-04-17T03:19:40.356822" elapsed="0.000412"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:40.357682" 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-04-17T03:19:40.357414" 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-04-17T03:19:40.359146" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:40.358600" elapsed="0.000639"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:19:40.359794" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:19:40.359414" elapsed="0.000408"/>
</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-04-17T03:19:40.360257" 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-04-17T03:19:40.361037" 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-04-17T03:19:40.361386" elapsed="0.000048"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:19:40.360063" elapsed="0.001497"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:19:40.359877" elapsed="0.001753"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:19:40.361684" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:19:40.361862" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:19:40.358214" elapsed="0.003675"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:40.357814" elapsed="0.004108"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:40.362122" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:40.361967" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:40.357788" elapsed="0.004412"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:19:40.362810" 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-04-17T03:19:40.362344" elapsed="0.000494"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:19:40.362887" 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-04-17T03:19:40.352545" elapsed="0.010491"/>
</kw>
<msg time="2026-04-17T03:19:40.363094" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:19:40.338830" elapsed="0.024378"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:19:40.379529" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:19:40.392282" elapsed="0.000046"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:19:40.404965" elapsed="0.000073"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:40.405303" 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-04-17T03:19:40.405492" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:40.406072" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:40.405785" elapsed="0.000347"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:40.405766" elapsed="0.000391"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:40.406304" 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-04-17T03:19:40.406469" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:40.406634" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:19:40.405727" elapsed="0.000960"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:19:40.405582" elapsed="0.001132"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:40.406858" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:40.406963" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:19:40.407173" 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-04-17T03:19:40.333823" elapsed="0.073379"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:40.408716" 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-04-17T03:19:40.408414" elapsed="0.000380">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-04-17T03:19:40.408892" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:40.408006" elapsed="0.000911"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:40.409322" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:40.409039" elapsed="0.000343"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:19:40.409916" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:40.409602" elapsed="0.000365"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:40.409409" elapsed="0.000677"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:40.409016" elapsed="0.001096"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:40.412652" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:19:40.410276" elapsed="0.002405"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:19:40.412742" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:19:40.412943" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:19:40.407615" elapsed="0.005358"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:40.414470" 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-04-17T03:19:40.414143" elapsed="0.000406">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-04-17T03:19:40.414651" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:40.413711" elapsed="0.000965"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:19:40.414907" elapsed="0.000052"/>
</return>
<status status="PASS" start="2026-04-17T03:19:40.414755" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:40.414735" elapsed="0.000289"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:40.415180" 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-04-17T03:19:40.415417" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:19:40.415488" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:19:40.417851" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:19:40.413342" elapsed="0.004540"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:40.419624" 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-04-17T03:19:40.419242" elapsed="0.000447"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:40.420229" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:40.419885" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:19:40.426071" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:40.627796" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:41.030689" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:41.033473" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:19:40.422883" elapsed="0.616178">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:19:40.420384" elapsed="0.618905">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:41.039830" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:41.039383" elapsed="0.000634"/>
</branch>
<status status="FAIL" start="2026-04-17T03:19:40.420357" elapsed="0.619715">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:41.041038" elapsed="0.000248"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:41.041588" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:19:41.041497" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:41.041446" elapsed="0.000297"/>
</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-04-17T03:19:41.042124" elapsed="0.000054"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:19:41.042306" elapsed="0.000039"/>
</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-04-17T03:19:40.418279" elapsed="0.624181">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:41.042544" 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-04-17T03:19:40.310074" elapsed="0.732575">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:41.042962" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:41.042747" elapsed="0.000292"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:41.042728" elapsed="0.000336"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:41.043098" elapsed="0.000014"/>
</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="FAIL" start="2026-04-17T03:19:40.302834" elapsed="0.740371">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:19:40.293001" elapsed="0.750319">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:19:42.108300" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:42.107811" elapsed="0.000530"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:42.109328" 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-04-17T03:19:42.108893" elapsed="0.000516">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-04-17T03:19:42.109539" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:42.108539" elapsed="0.001027"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:42.110229" 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-04-17T03:19:42.109739" elapsed="0.000519"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:19:42.110580" 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-04-17T03:19:42.110866" 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-04-17T03:19:42.110431" elapsed="0.000550"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:42.111413" 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-04-17T03:19:42.111152" 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-04-17T03:19:42.113172" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:42.112514" elapsed="0.000744"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:19:42.114022" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:19:42.113493" elapsed="0.000560"/>
</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-04-17T03:19:42.114513" 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-04-17T03:19:42.115359" elapsed="0.000063"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:19:42.115723" elapsed="0.000048"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:19:42.114291" elapsed="0.001607"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:19:42.114113" elapsed="0.001872"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:19:42.116041" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:19:42.116280" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:19:42.111992" elapsed="0.004315"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:42.111542" elapsed="0.004800"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:42.116540" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:42.116371" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:42.111517" elapsed="0.005110"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:19:42.117312" 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-04-17T03:19:42.116778" elapsed="0.000562"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:19:42.117389" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:19:42.107084" elapsed="0.010437"/>
</kw>
<msg time="2026-04-17T03:19:42.117579" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:19:42.093693" elapsed="0.023943"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:19:42.131652" elapsed="0.000064"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:19:42.144822" 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-04-17T03:19:42.158993" elapsed="0.000076"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:42.159331" elapsed="0.000121"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:42.159627" 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-04-17T03:19:42.160084" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:42.159909" elapsed="0.000233"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:42.159891" elapsed="0.000276"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:42.160343" 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-04-17T03:19:42.160524" 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-04-17T03:19:42.160698" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:19:42.159853" elapsed="0.000901"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:19:42.159717" elapsed="0.001065"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:42.160948" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:42.161032" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:19:42.161198" 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-04-17T03:19:42.088916" elapsed="0.072310"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:42.162702" 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-04-17T03:19:42.162402" elapsed="0.000379">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-04-17T03:19:42.162877" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:42.161989" elapsed="0.000913"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:42.163263" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:42.162993" elapsed="0.000330"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:19:42.163906" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:42.163563" elapsed="0.000394"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:42.163347" elapsed="0.000649"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:42.162974" elapsed="0.001044"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:42.166460" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:19:42.164175" elapsed="0.002314"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:19:42.166545" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:19:42.166711" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:19:42.161601" elapsed="0.005135"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:42.168063" 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-04-17T03:19:42.167778" elapsed="0.000356">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-04-17T03:19:42.168230" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:42.167430" elapsed="0.000825"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:19:42.168504" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:19:42.168352" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:42.168328" 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-04-17T03:19:42.168780" 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-04-17T03:19:42.169048" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:19:42.169118" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:19:42.171287" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:19:42.167080" elapsed="0.004235"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:42.172919" 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-04-17T03:19:42.172642" elapsed="0.000346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:42.173400" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:42.173146" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:19:42.178989" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:42.380625" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:42.784368" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:42.787008" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:19:42.175854" elapsed="0.616203">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:19:42.173514" elapsed="0.618697">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:42.792581" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:42.792274" elapsed="0.000408"/>
</branch>
<status status="FAIL" start="2026-04-17T03:19:42.173495" elapsed="0.619223">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:42.793380" elapsed="0.000043"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:42.793596" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:19:42.793535" elapsed="0.000126"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:42.793508" elapsed="0.000185"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:42.793959" elapsed="0.000035"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:19:42.794067" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:19:42.171672" elapsed="0.622565">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:42.794353" 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-04-17T03:19:42.061686" elapsed="0.732817">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:42.795009" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:42.794710" elapsed="0.000410"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:42.794684" elapsed="0.000472"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:42.795205" elapsed="0.000022"/>
</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="FAIL" start="2026-04-17T03:19:42.053199" elapsed="0.742158">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:19:42.044199" elapsed="0.751312">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:19:43.855113" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:43.854666" elapsed="0.000484"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:43.856149" 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-04-17T03:19:43.855720" elapsed="0.000509">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-04-17T03:19:43.856328" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:43.855359" elapsed="0.000995"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:43.856992" 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-04-17T03:19:43.856564" elapsed="0.000457"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:19:43.857333" 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-04-17T03:19:43.857510" 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-04-17T03:19:43.857185" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:43.858015" 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-04-17T03:19:43.857724" elapsed="0.000339"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:43.859313" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:43.858829" elapsed="0.000549"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:19:43.859916" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:19:43.859545" elapsed="0.000413"/>
</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-04-17T03:19:43.860402" elapsed="0.000060"/>
</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-04-17T03:19:43.861172" 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-04-17T03:19:43.861515" elapsed="0.000047"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:19:43.860178" elapsed="0.001509"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:19:43.860013" elapsed="0.001755"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:19:43.861822" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:19:43.862029" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:19:43.858470" elapsed="0.003585"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:43.858143" elapsed="0.004015"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:43.862337" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:43.862185" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:43.858119" elapsed="0.004296"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:19:43.863114" 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-04-17T03:19:43.862564" elapsed="0.000587"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:19:43.863212" 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-04-17T03:19:43.853856" elapsed="0.009522"/>
</kw>
<msg time="2026-04-17T03:19:43.863448" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:19:43.840518" elapsed="0.022994"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:19:43.876528" 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//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-04-17T03:19:43.889257" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:19:43.901853" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:43.902086" 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-04-17T03:19:43.902272" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:43.902663" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:43.902514" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:43.902497" 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-04-17T03:19:43.902884" 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-04-17T03:19:43.903069" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:43.903233" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:19:43.902461" elapsed="0.000824"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:19:43.902351" elapsed="0.000961"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:43.903456" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:43.903538" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:19:43.903677" 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-04-17T03:19:43.836087" elapsed="0.067670"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:43.905179" 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-04-17T03:19:43.904884" elapsed="0.000371">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-04-17T03:19:43.905350" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:43.904494" elapsed="0.000881"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:43.905703" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:43.905445" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:19:43.906277" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:43.905981" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:43.905784" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:43.905428" elapsed="0.000930"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:43.908713" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:19:43.906508" elapsed="0.002231"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:19:43.908791" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:19:43.908964" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:19:43.904111" elapsed="0.004879"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:43.910227" 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-04-17T03:19:43.909992" elapsed="0.000299">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-04-17T03:19:43.910385" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:43.909637" elapsed="0.000773"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:19:43.910642" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-17T03:19:43.910480" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:43.910462" elapsed="0.000271"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:43.910891" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:43.911083" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:19:43.911156" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:19:43.913292" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:19:43.909303" elapsed="0.004016"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:43.914732" 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-04-17T03:19:43.914476" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:43.915187" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:43.914943" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:19:43.920307" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:44.122103" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:44.524910" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:44.527280" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:19:43.917414" elapsed="0.615063">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:19:43.915295" elapsed="0.617421">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:44.533379" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:44.532861" elapsed="0.000676"/>
</branch>
<status status="FAIL" start="2026-04-17T03:19:43.915278" elapsed="0.618314">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:44.534583" elapsed="0.000032"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:44.534737" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:19:44.534696" elapsed="0.000090"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:44.534676" elapsed="0.000132"/>
</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-04-17T03:19:44.534974" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:19:44.535061" elapsed="0.000026"/>
</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-04-17T03:19:43.913639" elapsed="0.621562">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:44.535282" 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-04-17T03:19:43.812810" elapsed="0.722575">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:44.535677" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:44.535487" elapsed="0.000264"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:44.535469" elapsed="0.000306"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:44.535810" elapsed="0.000014"/>
</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="FAIL" start="2026-04-17T03:19:43.806159" elapsed="0.729755">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:19:43.796194" elapsed="0.739861">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:19:45.593182" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:45.592733" elapsed="0.000484"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:45.594182" 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-04-17T03:19:45.593753" elapsed="0.000507">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-04-17T03:19:45.594360" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:45.593400" elapsed="0.000985"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:45.595000" 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-04-17T03:19:45.594563" elapsed="0.000465"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:19:45.595347" 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-04-17T03:19:45.595539" 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-04-17T03:19:45.595199" elapsed="0.000376"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:45.596185" 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-04-17T03:19:45.595783" elapsed="0.000450"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:45.597528" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:45.597066" elapsed="0.000524"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:19:45.598240" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:19:45.597780" 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-04-17T03:19:45.598679" elapsed="0.000050"/>
</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-04-17T03:19:45.599481" elapsed="0.000053"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:19:45.599871" elapsed="0.000123"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:19:45.598488" elapsed="0.001643"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:19:45.598321" elapsed="0.001880"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:19:45.600254" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:19:45.600462" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:19:45.596663" elapsed="0.003836"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:45.596315" elapsed="0.004227"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:45.600735" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:45.600569" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:45.596291" elapsed="0.004534"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:19:45.601482" 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-04-17T03:19:45.601015" elapsed="0.000495"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:19:45.601561" 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-04-17T03:19:45.592054" elapsed="0.009640"/>
</kw>
<msg time="2026-04-17T03:19:45.601749" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:19:45.578948" elapsed="0.022851"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:19:45.615627" elapsed="0.000041"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:19:45.628669" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:19:45.641504" elapsed="0.000032"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:45.641766" 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-04-17T03:19:45.642008" 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-04-17T03:19:45.642422" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:45.642266" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:45.642249" 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-04-17T03:19:45.642651" 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-04-17T03:19:45.642818" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:45.643001" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:19:45.642210" elapsed="0.000847"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:19:45.642095" elapsed="0.000990"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:45.643234" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:45.643313" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:19:45.643467" 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-04-17T03:19:45.574662" elapsed="0.068833"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:45.645007" 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-04-17T03:19:45.644688" elapsed="0.000420">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-04-17T03:19:45.645212" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:45.644275" elapsed="0.000968"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:45.645655" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:45.645331" elapsed="0.000385"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:19:45.646242" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:45.645937" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:45.645740" elapsed="0.000617"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:45.645307" elapsed="0.001073"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:45.648977" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:19:45.646533" elapsed="0.002480"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:19:45.649078" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:19:45.649278" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:19:45.643829" elapsed="0.005487"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:45.650632" 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-04-17T03:19:45.650391" elapsed="0.000305">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-04-17T03:19:45.650791" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:45.650047" elapsed="0.000788"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:19:45.651097" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-17T03:19:45.650923" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:45.650904" elapsed="0.000281"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:45.651333" 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-04-17T03:19:45.651504" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:19:45.651569" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:19:45.653943" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:19:45.649655" elapsed="0.004316"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:45.655566" 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-04-17T03:19:45.655307" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:45.656049" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:45.655766" elapsed="0.000332"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:19:45.662040" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:45.863544" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:46.266154" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:46.268758" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:19:45.658479" elapsed="0.614423">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:19:45.656169" elapsed="0.616937">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:46.273468" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:46.273167" elapsed="0.000391"/>
</branch>
<status status="FAIL" start="2026-04-17T03:19:45.656150" elapsed="0.617443">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:46.274225" elapsed="0.000101"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:46.274477" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:19:46.274425" elapsed="0.000113"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:46.274401" elapsed="0.000165"/>
</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-04-17T03:19:46.274762" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:19:46.274851" 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-04-17T03:19:45.654324" elapsed="0.620704">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:46.275132" 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-04-17T03:19:45.552230" elapsed="0.723029">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:46.275618" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:46.275379" elapsed="0.000331"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:46.275359" elapsed="0.000382"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:46.275784" elapsed="0.000018"/>
</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="FAIL" start="2026-04-17T03:19:45.545710" elapsed="0.730205">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:19:45.536737" elapsed="0.739343">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:19:47.340101" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:47.339575" elapsed="0.000563"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:47.341136" 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-04-17T03:19:47.340695" elapsed="0.000521">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-04-17T03:19:47.341314" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:47.340324" elapsed="0.001015"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:47.341968" 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-04-17T03:19:47.341520" elapsed="0.000478"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:19:47.342346" 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-04-17T03:19:47.342565" 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-04-17T03:19:47.342164" elapsed="0.000510"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:47.343207" 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-04-17T03:19:47.342917" elapsed="0.000338"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:47.344629" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:47.344146" elapsed="0.000547"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:19:47.345254" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:19:47.344861" elapsed="0.000420"/>
</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-04-17T03:19:47.345701" elapsed="0.000048"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:47.346495" elapsed="0.000053"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:19:47.347181" elapsed="0.000053"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:19:47.345508" elapsed="0.001852"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:19:47.345337" elapsed="0.002095"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:19:47.347487" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:19:47.347666" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:19:47.343725" elapsed="0.003966"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:47.343342" elapsed="0.004383"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:47.347903" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:47.347751" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:47.343315" elapsed="0.004683"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:19:47.348726" 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-04-17T03:19:47.348184" elapsed="0.000572"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:19:47.348815" 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-04-17T03:19:47.338702" elapsed="0.010260"/>
</kw>
<msg time="2026-04-17T03:19:47.349019" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:19:47.324544" elapsed="0.024529"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:19:47.363643" elapsed="0.000041"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:19:47.377061" 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-04-17T03:19:47.389553" elapsed="0.000032"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:47.389792" elapsed="0.000096"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:47.390074" 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-04-17T03:19:47.390500" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:47.390341" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:47.390323" 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-04-17T03:19:47.390732" 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-04-17T03:19:47.390900" elapsed="0.000084"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:47.391140" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:19:47.390284" elapsed="0.000910"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:19:47.390160" elapsed="0.001062"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:47.391370" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:47.391449" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:19:47.391607" 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-04-17T03:19:47.319676" elapsed="0.071959"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:47.393340" 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-04-17T03:19:47.393049" 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-04-17T03:19:47.393514" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:47.392418" elapsed="0.001121"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:47.393874" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:47.393609" elapsed="0.000340"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:19:47.394462" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:47.394163" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:47.393976" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:47.393591" elapsed="0.000953"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:47.397553" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:19:47.394698" elapsed="0.002893"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:19:47.397665" elapsed="0.000045"/>
</return>
<msg time="2026-04-17T03:19:47.397886" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:19:47.392001" elapsed="0.005920"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:47.399730" 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-04-17T03:19:47.399454" elapsed="0.000341">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-04-17T03:19:47.399890" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:47.398859" elapsed="0.001055"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:19:47.400139" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:19:47.400002" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:47.399983" elapsed="0.000241"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:47.400391" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:47.400615" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:19:47.400682" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:19:47.402888" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:19:47.398380" elapsed="0.004541"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:47.404758" 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-04-17T03:19:47.404461" elapsed="0.000374"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:47.405289" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:47.405036" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:19:47.411120" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:47.612872" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:48.015546" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:48.018017" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:19:47.407812" elapsed="0.614794">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:19:47.405411" elapsed="0.617417">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:48.023372" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:48.022914" elapsed="0.000605"/>
</branch>
<status status="FAIL" start="2026-04-17T03:19:47.405387" elapsed="0.618181">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:48.024516" elapsed="0.000055"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:48.024812" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:19:48.024731" elapsed="0.000173"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:48.024691" elapsed="0.000301"/>
</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-04-17T03:19:48.025317" elapsed="0.000046"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:19:48.025460" elapsed="0.000030"/>
</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-04-17T03:19:47.403349" elapsed="0.622341">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:48.025844" elapsed="0.000032"/>
</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-04-17T03:19:47.295177" elapsed="0.730898">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:48.026912" elapsed="0.000088"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:48.026496" elapsed="0.000606"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:48.026456" elapsed="0.000696"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:48.027221" 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="FAIL" start="2026-04-17T03:19:47.288591" elapsed="0.738841">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:19:47.276922" elapsed="0.750724">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:19:49.088161" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:49.087722" elapsed="0.000475"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:49.089147" 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-04-17T03:19:49.088727" elapsed="0.000498">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-04-17T03:19:49.089325" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:49.088377" elapsed="0.000973"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:49.089977" 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-04-17T03:19:49.089560" elapsed="0.000445"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:19:49.090324" 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-04-17T03:19:49.090479" 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-04-17T03:19:49.090171" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:49.090918" 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-04-17T03:19:49.090667" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:49.092238" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:49.091767" elapsed="0.000533"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:19:49.092823" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:19:49.092463" elapsed="0.000387"/>
</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-04-17T03:19:49.093279" 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-04-17T03:19:49.094342" elapsed="0.000082"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:19:49.094831" elapsed="0.000063"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:19:49.093087" elapsed="0.001997"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:19:49.092904" elapsed="0.002272"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:19:49.095246" elapsed="0.000051"/>
</return>
<msg time="2026-04-17T03:19:49.095490" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:19:49.091410" elapsed="0.004116"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:49.091065" elapsed="0.004583"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:49.095899" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:49.095685" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:49.091038" elapsed="0.004991"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:19:49.096877" 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-04-17T03:19:49.096234" elapsed="0.000681"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:19:49.097008" 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//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-04-17T03:19:49.087050" elapsed="0.010138"/>
</kw>
<msg time="2026-04-17T03:19:49.097265" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:19:49.073710" elapsed="0.023628"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:19:49.111997" 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/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-04-17T03:19:49.124837" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:49.137694" elapsed="0.000051"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:49.138170" 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-04-17T03:19:49.138357" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:49.138777" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:49.138624" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:49.138606" 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-04-17T03:19:49.139018" 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-04-17T03:19:49.139246" 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-04-17T03:19:49.139418" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:19:49.138568" elapsed="0.000903"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:19:49.138441" elapsed="0.001058"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:49.139652" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:49.139731" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:19:49.139888" 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-04-17T03:19:49.069160" elapsed="0.070846"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:49.141435" 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-04-17T03:19:49.141143" elapsed="0.000418">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-04-17T03:19:49.141668" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:49.140727" elapsed="0.000967"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:49.142051" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:49.141768" elapsed="0.000344"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:19:49.142699" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:49.142365" elapsed="0.000370"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:49.142158" elapsed="0.000627"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:49.141750" elapsed="0.001064"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:49.146507" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:19:49.143046" elapsed="0.003498"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:19:49.146619" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:19:49.147041" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:19:49.140367" elapsed="0.006709"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:49.148798" 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-04-17T03:19:49.148462" elapsed="0.000425">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-04-17T03:19:49.149041" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:49.147992" elapsed="0.001084"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:19:49.149365" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-17T03:19:49.149174" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:49.149149" elapsed="0.000396"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:49.149802" elapsed="0.000188"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:49.150203" elapsed="0.000029"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:19:49.150295" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:19:49.152483" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:19:49.147514" elapsed="0.004996"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:49.154053" 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-04-17T03:19:49.153725" elapsed="0.000377"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:49.154501" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:49.154256" 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-04-17T03:19:49.159828" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:49.361332" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:49.763671" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:49.765946" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:19:49.156702" elapsed="0.613763">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:19:49.154613" elapsed="0.616167">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:49.771405" elapsed="0.000076"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:49.770877" elapsed="0.000715"/>
</branch>
<status status="FAIL" start="2026-04-17T03:19:49.154593" elapsed="0.617054">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:49.772665" elapsed="0.000060"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:49.773232" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:19:49.773141" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:49.773082" elapsed="0.000295"/>
</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-04-17T03:19:49.773770" elapsed="0.000076"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:19:49.774022" elapsed="0.000039"/>
</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-04-17T03:19:49.152838" elapsed="0.621446">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:49.774629" 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-04-17T03:19:49.045107" elapsed="0.729650">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:49.775260" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:49.775040" elapsed="0.000296"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:49.775021" elapsed="0.000340"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:49.775394" elapsed="0.000014"/>
</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="FAIL" start="2026-04-17T03:19:49.037051" elapsed="0.738447">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:19:49.028486" elapsed="0.747117">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:19:50.833841" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:50.833434" elapsed="0.000441"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:50.834811" 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-04-17T03:19:50.834419" elapsed="0.000470">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-04-17T03:19:50.835012" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:50.834074" elapsed="0.000964"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:50.835725" 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-04-17T03:19:50.835255" elapsed="0.000499"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:19:50.836099" 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-04-17T03:19:50.836263" 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-04-17T03:19:50.835922" elapsed="0.000368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:50.836710" 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-04-17T03:19:50.836456" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:50.838014" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:50.837518" elapsed="0.000571"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:19:50.838624" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:19:50.838258" elapsed="0.000392"/>
</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-04-17T03:19:50.839079" elapsed="0.000049"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:50.839865" 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-04-17T03:19:50.840242" elapsed="0.000049"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:19:50.838868" elapsed="0.001545"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:19:50.838703" elapsed="0.001777"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:19:50.840533" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:19:50.840707" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:19:50.837168" elapsed="0.003564"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:50.836833" elapsed="0.003930"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:50.840962" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:50.840788" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:50.836809" elapsed="0.004231"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:19:50.841639" 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-04-17T03:19:50.841186" elapsed="0.000481"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:19:50.841717" 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-04-17T03:19:50.832787" elapsed="0.009054"/>
</kw>
<msg time="2026-04-17T03:19:50.841895" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:19:50.819979" elapsed="0.021983"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:19:50.855994" 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-04-17T03:19:50.868616" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:19:50.880968" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:50.881193" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:50.881375" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:50.881783" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:50.881631" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:50.881613" 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-04-17T03:19:50.882026" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:50.882196" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:50.882360" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:19:50.881575" elapsed="0.000837"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:19:50.881458" elapsed="0.000982"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:50.882587" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:50.882665" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:19:50.882825" 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-04-17T03:19:50.815677" elapsed="0.067176"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:50.884298" 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-04-17T03:19:50.884003" elapsed="0.000370">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-04-17T03:19:50.884467" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:50.883566" elapsed="0.000925"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:50.884826" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:50.884560" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:19:50.885404" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:50.885105" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:50.884906" elapsed="0.000607"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:50.884543" elapsed="0.000993"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:50.887896" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:19:50.885690" elapsed="0.002234"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:19:50.887991" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:19:50.888154" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:19:50.883201" elapsed="0.004978"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:50.889425" 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-04-17T03:19:50.889182" elapsed="0.000306">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-04-17T03:19:50.889582" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:50.888822" elapsed="0.000784"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:19:50.889811" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:19:50.889675" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:50.889658" 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-04-17T03:19:50.890059" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:50.890232" elapsed="0.000031"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:19:50.890308" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:19:50.892423" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:19:50.888491" elapsed="0.003959"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:50.893871" 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-04-17T03:19:50.893612" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:50.894328" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:50.894086" 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-04-17T03:19:50.899779" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:51.101511" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:51.504149" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:51.506650" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:19:50.896621" elapsed="0.613193">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:19:50.894435" elapsed="0.615554">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:51.510358" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:51.510052" elapsed="0.000400"/>
</branch>
<status status="FAIL" start="2026-04-17T03:19:50.894418" elapsed="0.616070">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:51.511141" elapsed="0.000105"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:51.511404" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:19:51.511349" elapsed="0.000115"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:51.511323" elapsed="0.000170"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:51.511704" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:19:51.511801" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:19:50.892771" elapsed="0.619208">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:51.512089" 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-04-17T03:19:50.793077" elapsed="0.719157">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:51.512632" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:51.512364" elapsed="0.000368"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:51.512341" elapsed="0.000425"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:51.512812" elapsed="0.000020"/>
</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="FAIL" start="2026-04-17T03:19:50.784374" elapsed="0.728600">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:19:50.776345" elapsed="0.736780">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:19:52.571782" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:52.571377" elapsed="0.000439"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:52.572724" 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-04-17T03:19:52.572343" elapsed="0.000457">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-04-17T03:19:52.572895" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:52.572006" elapsed="0.000914"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:52.573502" 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-04-17T03:19:52.573113" elapsed="0.000417"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:19:52.573943" 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-04-17T03:19:52.574107" 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-04-17T03:19:52.573775" elapsed="0.000414"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:52.574610" 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-04-17T03:19:52.574354" 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-04-17T03:19:52.575905" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:52.575428" elapsed="0.000554"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:19:52.576503" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:19:52.576146" elapsed="0.000383"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:52.576982" elapsed="0.000050"/>
</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-04-17T03:19:52.577752" 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-04-17T03:19:52.578120" elapsed="0.000044"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:19:52.576746" elapsed="0.001539"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:19:52.576582" elapsed="0.001770"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:19:52.578403" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:19:52.578575" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:19:52.575076" elapsed="0.003525"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:52.574733" elapsed="0.003900"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:52.578806" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:52.578658" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:52.574710" elapsed="0.004174"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:19:52.579495" 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-04-17T03:19:52.579047" elapsed="0.000476"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:19:52.579571" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:19:52.570725" elapsed="0.008970"/>
</kw>
<msg time="2026-04-17T03:19:52.579749" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:19:52.558003" elapsed="0.021796"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:19:52.592466" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:52.604860" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:52.617099" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:52.617296" elapsed="0.000065"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:52.617522" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:52.618103" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:52.617785" elapsed="0.000375"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:52.617770" elapsed="0.000414"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:52.618324" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:52.618491" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:52.618656" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:19:52.617739" elapsed="0.000970"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:19:52.617633" elapsed="0.001101"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:52.618878" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:52.618969" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:19:52.619092" 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-04-17T03:19:52.553708" elapsed="0.065410"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:52.620396" 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-04-17T03:19:52.620137" elapsed="0.000330">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-04-17T03:19:52.620560" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:52.619775" elapsed="0.000809"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:52.620903" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:52.620653" elapsed="0.000324"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:19:52.621477" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:52.621181" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:52.621001" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:52.620636" elapsed="0.000924"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:52.623937" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:19:52.621730" elapsed="0.002235"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:19:52.624018" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:19:52.624179" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:19:52.619443" elapsed="0.004761"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:52.625435" 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-04-17T03:19:52.625197" elapsed="0.000302">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-04-17T03:19:52.625614" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:52.624842" elapsed="0.000798"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:19:52.625847" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:19:52.625710" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:52.625693" elapsed="0.000252"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:52.626094" 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-04-17T03:19:52.626306" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:19:52.626373" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:19:52.628432" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:19:52.624516" elapsed="0.003942"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:52.629914" 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-04-17T03:19:52.629631" elapsed="0.000348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:52.630378" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:52.630134" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:19:52.635698" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:52.837251" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:53.239872" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:53.242584" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:19:52.632532" elapsed="0.615845">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:19:52.630486" elapsed="0.618167">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:53.249225" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:53.248764" elapsed="0.000617"/>
</branch>
<status status="FAIL" start="2026-04-17T03:19:52.630469" elapsed="0.618965">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:53.250735" elapsed="0.000047"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:53.250905" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:19:53.250863" elapsed="0.000103"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:53.250844" elapsed="0.000144"/>
</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-04-17T03:19:53.251136" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:19:53.251209" 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-04-17T03:19:52.628771" elapsed="0.622567">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:53.251418" 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-04-17T03:19:52.531055" elapsed="0.720462">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:53.252136" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:53.251704" elapsed="0.000514"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:53.251680" elapsed="0.000562"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:53.252276" elapsed="0.000015"/>
</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="FAIL" start="2026-04-17T03:19:52.523848" elapsed="0.728549">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:19:52.513805" elapsed="0.738701">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:19:54.311848" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:54.311452" elapsed="0.000432"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:54.312833" 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-04-17T03:19:54.312407" elapsed="0.000501">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-04-17T03:19:54.313030" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:54.312074" elapsed="0.000981"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:54.313605" 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-04-17T03:19:54.313222" elapsed="0.000409"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:19:54.313948" 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-04-17T03:19:54.314128" 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-04-17T03:19:54.313792" elapsed="0.000361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:54.314553" 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-04-17T03:19:54.314309" 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-04-17T03:19:54.315826" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:54.315370" elapsed="0.000519"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:19:54.316425" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:19:54.316067" 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-04-17T03:19:54.316851" elapsed="0.000047"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:54.317611" 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-04-17T03:19:54.317989" elapsed="0.000046"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:19:54.316662" elapsed="0.001496"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:19:54.316502" elapsed="0.001726"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:19:54.318277" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:19:54.318447" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:19:54.314994" elapsed="0.003477"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:54.314672" elapsed="0.003980"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:54.318832" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:54.318680" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:54.314648" elapsed="0.004262"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:19:54.319539" 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-04-17T03:19:54.319074" elapsed="0.000493"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:19:54.319617" 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-04-17T03:19:54.310801" elapsed="0.008940"/>
</kw>
<msg time="2026-04-17T03:19:54.319795" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:19:54.298009" elapsed="0.021835"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:19:54.332582" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:19:54.345055" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:19:54.359041" elapsed="0.000037"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:54.359362" 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-04-17T03:19:54.359561" 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-04-17T03:19:54.359989" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:54.359822" elapsed="0.000226"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:54.359804" 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-04-17T03:19:54.360249" 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-04-17T03:19:54.360432" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:54.360596" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:19:54.359767" elapsed="0.000882"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:19:54.359645" elapsed="0.001030"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:54.360820" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:54.360898" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:19:54.361068" 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-04-17T03:19:54.293708" elapsed="0.067474"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:54.362687" 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-04-17T03:19:54.362380" elapsed="0.000384">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-04-17T03:19:54.362862" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:54.361960" elapsed="0.000928"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:54.363281" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:54.362979" elapsed="0.000393"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:19:54.363987" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:54.363624" elapsed="0.000404"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:54.363402" elapsed="0.000680"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:54.362960" elapsed="0.001149"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:54.366513" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:19:54.364290" elapsed="0.002250"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:19:54.366592" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:19:54.366750" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:19:54.361572" elapsed="0.005203"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:54.368218" 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-04-17T03:19:54.367972" elapsed="0.000312">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-04-17T03:19:54.368378" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:54.367516" elapsed="0.000886"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:19:54.368607" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:19:54.368472" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:54.368455" elapsed="0.000237"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:54.368844" 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-04-17T03:19:54.369029" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:19:54.369095" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:19:54.371173" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:19:54.367101" elapsed="0.004098"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:54.372678" 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-04-17T03:19:54.372405" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:54.373155" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:54.372889" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:19:54.378171" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:54.579748" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:54.982053" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:54.983831" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:19:54.375367" elapsed="0.613056">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:19:54.373266" elapsed="0.615387">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:54.989076" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:54.988747" elapsed="0.000427"/>
</branch>
<status status="FAIL" start="2026-04-17T03:19:54.373248" elapsed="0.615959">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:54.989799" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:54.990017" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:19:54.989961" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:54.989916" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:54.990312" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:19:54.990410" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:19:54.371563" elapsed="0.619005">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:54.990676" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:19:54.271250" elapsed="0.719565">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:54.991247" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:54.990969" elapsed="0.000409"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:54.990922" elapsed="0.000490"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:54.991459" elapsed="0.000022"/>
</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="FAIL" start="2026-04-17T03:19:54.264040" elapsed="0.727566">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:19:54.253192" elapsed="0.738581">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:19:56.058547" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:56.058081" elapsed="0.000503"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:56.059683" 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-04-17T03:19:56.059157" elapsed="0.000616">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-04-17T03:19:56.059876" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:56.058769" elapsed="0.001132"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:56.060622" 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-04-17T03:19:56.060129" elapsed="0.000522"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:19:56.061036" 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-04-17T03:19:56.061206" 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-04-17T03:19:56.060862" elapsed="0.000370"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:56.061658" 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-04-17T03:19:56.061399" 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-04-17T03:19:56.063149" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:56.062661" elapsed="0.000552"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:19:56.063749" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:19:56.063379" elapsed="0.000396"/>
</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-04-17T03:19:56.064250" elapsed="0.000049"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:56.065057" 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-04-17T03:19:56.065402" elapsed="0.000061"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:19:56.064045" elapsed="0.001559"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:19:56.063830" elapsed="0.001843"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:19:56.065728" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:19:56.065911" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:19:56.062232" elapsed="0.003722"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:56.061791" elapsed="0.004197"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:56.066165" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:56.066014" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:56.061764" elapsed="0.004485"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:19:56.066855" 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-04-17T03:19:56.066396" elapsed="0.000486"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:19:56.066949" 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-04-17T03:19:56.057077" elapsed="0.010003"/>
</kw>
<msg time="2026-04-17T03:19:56.067136" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:19:56.042344" elapsed="0.024846"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:19:56.080679" 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-04-17T03:19:56.093733" elapsed="0.000033"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:56.106956" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:56.107173" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:56.107414" 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-04-17T03:19:56.107893" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:56.107735" elapsed="0.000234"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:56.107717" 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-04-17T03:19:56.108143" 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-04-17T03:19:56.108313" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:56.108478" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:19:56.107679" elapsed="0.000853"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:19:56.107530" elapsed="0.001029"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:56.108705" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:56.108782" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:19:56.109043" 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-04-17T03:19:56.037413" elapsed="0.071662"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:56.110484" 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-04-17T03:19:56.110197" elapsed="0.000366">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-04-17T03:19:56.110658" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:56.109792" 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-04-17T03:19:56.111029" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:56.110753" elapsed="0.000336"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:19:56.111599" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:56.111295" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:56.111113" elapsed="0.000593"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:56.110735" elapsed="0.000995"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:56.114119" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:19:56.111884" elapsed="0.002262"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:19:56.114198" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:19:56.114355" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:19:56.109434" elapsed="0.004945"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:56.115616" 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-04-17T03:19:56.115380" elapsed="0.000299">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-04-17T03:19:56.115773" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:56.115039" elapsed="0.000758"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:19:56.116018" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:19:56.115866" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:56.115849" elapsed="0.000254"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:56.116250" 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-04-17T03:19:56.116422" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:19:56.116486" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:19:56.118657" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:19:56.114691" elapsed="0.003993"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:56.120307" 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-04-17T03:19:56.120039" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:56.120766" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:56.120514" 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="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:19:56.125853" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:56.327476" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:56.730231" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:56.733379" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:19:56.123013" elapsed="0.616981">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:19:56.120900" elapsed="0.619214">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:56.740398" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:56.740161" elapsed="0.000310"/>
</branch>
<status status="FAIL" start="2026-04-17T03:19:56.120879" elapsed="0.619616">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:56.740989" elapsed="0.000095"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:56.741207" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:19:56.741165" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:56.741145" elapsed="0.000130"/>
</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-04-17T03:19:56.741424" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:19:56.741495" 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-04-17T03:19:56.119077" elapsed="0.622534">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:56.741690" 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-04-17T03:19:56.012041" elapsed="0.729751">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:56.742101" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:56.741893" elapsed="0.000282"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:56.741874" elapsed="0.000326"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:56.742233" elapsed="0.000014"/>
</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="FAIL" start="2026-04-17T03:19:56.003135" elapsed="0.739201">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:19:55.992490" elapsed="0.749951">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:19:57.802623" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:57.802184" elapsed="0.000475"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:57.803667" 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-04-17T03:19:57.803268" elapsed="0.000477">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-04-17T03:19:57.803845" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:57.802847" elapsed="0.001023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:57.804467" 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-04-17T03:19:57.804066" elapsed="0.000430"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:19:57.804874" 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-04-17T03:19:57.805132" 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-04-17T03:19:57.804712" elapsed="0.000579"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:57.805862" 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-04-17T03:19:57.805518" elapsed="0.000416"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:57.807406" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:57.806848" elapsed="0.000622"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:19:57.808029" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:19:57.807636" elapsed="0.000419"/>
</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-04-17T03:19:57.808469" elapsed="0.000049"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:57.809327" elapsed="0.000054"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:19:57.809676" elapsed="0.000046"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:19:57.808275" elapsed="0.001568"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:19:57.808110" elapsed="0.001802"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:19:57.809993" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:19:57.810174" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:19:57.806444" elapsed="0.003755"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:57.806068" elapsed="0.004164"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:57.810406" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:57.810257" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:57.806036" elapsed="0.004447"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:19:57.811362" 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-04-17T03:19:57.810638" elapsed="0.000754"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:19:57.811442" 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-04-17T03:19:57.801258" elapsed="0.010314"/>
</kw>
<msg time="2026-04-17T03:19:57.811628" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:19:57.787428" elapsed="0.024254"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:19:57.825575" elapsed="0.000062"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:19:57.839194" elapsed="0.000043"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:19:57.855547" elapsed="0.000058"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:57.855857" elapsed="0.000128"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:57.856162" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:57.856688" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:57.856451" elapsed="0.000313"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:57.856432" elapsed="0.000366"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:57.857015" 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-04-17T03:19:57.857432" 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-04-17T03:19:57.857648" elapsed="0.000035"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:19:57.856392" elapsed="0.001331"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:19:57.856249" elapsed="0.001503"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:57.857943" elapsed="0.000045"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:57.858068" elapsed="0.000025"/>
</return>
<msg time="2026-04-17T03:19:57.858272" 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-04-17T03:19:57.782940" elapsed="0.075362"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:57.860040" 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-04-17T03:19:57.859720" elapsed="0.000587">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-04-17T03:19:57.860404" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:57.859234" elapsed="0.001194"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:57.860860" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:57.860502" elapsed="0.000432"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:19:57.861505" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:57.861171" elapsed="0.000365"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:57.860976" elapsed="0.000596"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:57.860483" elapsed="0.001110"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:57.864245" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:19:57.861750" elapsed="0.002526"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:19:57.864337" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:19:57.864517" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:19:57.858768" elapsed="0.005775"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:57.866142" 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-04-17T03:19:57.865808" elapsed="0.000412">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-04-17T03:19:57.866320" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:57.865386" elapsed="0.000965"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:19:57.866643" elapsed="0.000088"/>
</return>
<status status="PASS" start="2026-04-17T03:19:57.866442" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:57.866415" elapsed="0.000383"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:57.866993" 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-04-17T03:19:57.867295" elapsed="0.000029"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:19:57.867376" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:19:57.869723" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:19:57.864965" elapsed="0.004789"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:57.871669" 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-04-17T03:19:57.871332" elapsed="0.000391"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:57.872192" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:57.871881" elapsed="0.000358"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:19:57.877512" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:58.083033" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:58.485776" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:58.488916" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:19:57.874590" elapsed="0.618607">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:19:57.872316" elapsed="0.621037">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:58.493719" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:58.493415" elapsed="0.000404"/>
</branch>
<status status="FAIL" start="2026-04-17T03:19:57.872293" elapsed="0.621561">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:58.494554" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:58.494764" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:19:58.494705" elapsed="0.000169"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:58.494678" elapsed="0.000242"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:58.495199" elapsed="0.000036"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:19:58.495309" elapsed="0.000024"/>
</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-04-17T03:19:57.870238" elapsed="0.625246">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:58.495601" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:19:57.757014" elapsed="0.738738">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:19:58.496358" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:58.496073" elapsed="0.000396"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:58.496040" elapsed="0.000466"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:58.496555" elapsed="0.000022"/>
</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="FAIL" start="2026-04-17T03:19:57.749850" elapsed="0.746859">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:19:57.743198" elapsed="0.753666">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:19:59.559788" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:59.559340" elapsed="0.000484"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:59.560885" 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-04-17T03:19:59.560433" elapsed="0.000564">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-04-17T03:19:59.561099" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:59.560027" elapsed="0.001096"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:59.561688" 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-04-17T03:19:59.561295" elapsed="0.000420"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:19:59.562082" 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-04-17T03:19:59.562256" 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-04-17T03:19:59.561879" elapsed="0.000402"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:59.562696" 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-04-17T03:19:59.562442" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:59.564095" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:59.563556" elapsed="0.000603"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:19:59.564730" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:19:59.564324" elapsed="0.000434"/>
</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-04-17T03:19:59.565230" elapsed="0.000048"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:59.566105" elapsed="0.000088"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:19:59.566523" elapsed="0.000051"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:19:59.565033" elapsed="0.001664"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:19:59.564811" elapsed="0.001991"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:19:59.566874" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:19:59.567117" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:19:59.563200" elapsed="0.003951"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:59.562825" elapsed="0.004466"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:59.567522" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:59.567328" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:59.562799" elapsed="0.004804"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:19:59.568238" 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-04-17T03:19:59.567752" elapsed="0.000515"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:19:59.568317" 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-04-17T03:19:59.558543" elapsed="0.009902"/>
</kw>
<msg time="2026-04-17T03:19:59.568501" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:19:59.543252" elapsed="0.025300"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:19:59.581470" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:19:59.594176" 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/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-04-17T03:19:59.606705" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:59.606935" 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-04-17T03:19:59.607179" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:59.607586" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:59.607433" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:19:59.607415" 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-04-17T03:19:59.607809" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:59.608000" 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-04-17T03:19:59.608168" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:19:59.607377" elapsed="0.000846"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:19:59.607263" elapsed="0.000987"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:59.608432" elapsed="0.000032"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:19:59.608544" elapsed="0.000024"/>
</return>
<msg time="2026-04-17T03:19:59.608740" 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-04-17T03:19:59.538526" elapsed="0.070321"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:59.610321" 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-04-17T03:19:59.610018" elapsed="0.000381">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-04-17T03:19:59.610494" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:59.609595" elapsed="0.000924"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:59.610855" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:19:59.610590" elapsed="0.000323"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:19:59.611481" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:19:59.611179" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-17T03:19:59.610943" elapsed="0.000600"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:59.610571" elapsed="0.000993"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:19:59.613961" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:19:59.611721" elapsed="0.002269"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:19:59.614043" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:19:59.614239" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:19:59.609238" elapsed="0.005036"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:19:59.615677" 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-04-17T03:19:59.615382" elapsed="0.000359">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-04-17T03:19:59.615836" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:19:59.614985" elapsed="0.000876"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:19:59.616093" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-17T03:19:59.615952" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-17T03:19:59.615914" elapsed="0.000265"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:19:59.616365" 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-04-17T03:19:59.616585" elapsed="0.000033"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:19:59.616671" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:19:59.618740" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:19:59.614599" elapsed="0.004168"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:59.620434" 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-04-17T03:19:59.620158" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:19:59.620877" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:19:59.620634" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:19:59.626205" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:59.829097" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:00.239344" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:00.242105" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:19:59.623303" elapsed="0.622876">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:19:59.621012" elapsed="0.625315">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:00.246694" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:00.246387" elapsed="0.000403"/>
</branch>
<status status="FAIL" start="2026-04-17T03:19:59.620994" elapsed="0.625830">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:00.247487" elapsed="0.000044"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:00.247752" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:00.247696" elapsed="0.000125"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:00.247667" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:00.248078" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:20:00.248352" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:19:59.619106" elapsed="0.629407">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:00.248620" 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-04-17T03:19:59.514414" elapsed="0.734343">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:00.249179" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:00.248887" elapsed="0.000394"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:00.248864" elapsed="0.000451"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:00.249361" elapsed="0.000020"/>
</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="FAIL" start="2026-04-17T03:19:59.506196" elapsed="0.743306">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:19:59.497714" elapsed="0.751930">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:20:01.310376" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:01.309960" elapsed="0.000451"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:01.311382" 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-04-17T03:20:01.311013" elapsed="0.000446">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-04-17T03:20:01.311556" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:01.310648" elapsed="0.000934"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:01.312166" 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-04-17T03:20:01.311749" elapsed="0.000445"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:20:01.312501" 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-04-17T03:20:01.312646" 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-04-17T03:20:01.312358" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:01.313104" 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-04-17T03:20:01.312831" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:01.314376" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:01.313903" elapsed="0.000536"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:20:01.315004" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:20:01.314622" elapsed="0.000409"/>
</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-04-17T03:20:01.315434" 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-04-17T03:20:01.316168" 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-04-17T03:20:01.316503" elapsed="0.000045"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:20:01.315247" elapsed="0.001420"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:20:01.315084" elapsed="0.001648"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:20:01.316783" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:20:01.316982" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:20:01.313553" elapsed="0.003456"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:01.313228" elapsed="0.003813"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:01.317214" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:01.317066" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:01.313205" elapsed="0.004083"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:20:01.317881" 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-04-17T03:20:01.317430" elapsed="0.000479"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:20:01.317977" 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-04-17T03:20:01.309282" elapsed="0.008826"/>
</kw>
<msg time="2026-04-17T03:20:01.318163" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:20:01.296148" elapsed="0.022065"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:20:01.331623" 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//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-04-17T03:20:01.344428" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:01.357131" elapsed="0.000032"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:01.357343" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:01.357522" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:01.357909" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:01.357761" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:01.357744" 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-04-17T03:20:01.358156" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:01.358327" 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-04-17T03:20:01.358495" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:20:01.357711" elapsed="0.000846"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:20:01.357602" elapsed="0.000982"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:01.358732" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:01.358811" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:20:01.358966" 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-04-17T03:20:01.291048" elapsed="0.067947"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:01.360438" 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-04-17T03:20:01.360142" elapsed="0.000370">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-04-17T03:20:01.360609" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:01.359746" elapsed="0.000889"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:01.360989" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:01.360707" elapsed="0.000342"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:20:01.361570" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:01.361264" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:01.361078" elapsed="0.000609"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:01.360689" elapsed="0.001029"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:01.364226" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:20:01.361878" elapsed="0.002377"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:20:01.364307" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:20:01.364465" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:20:01.359338" elapsed="0.005153"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:01.365757" 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-04-17T03:20:01.365495" elapsed="0.000326">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-04-17T03:20:01.365917" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:01.365155" elapsed="0.000804"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:20:01.366196" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:20:01.366032" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:01.366014" 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-04-17T03:20:01.366432" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:01.366605" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:20:01.366679" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:20:01.368815" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:20:01.364805" elapsed="0.004038"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:01.370376" 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-04-17T03:20:01.370114" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:01.370834" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:01.370582" 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="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:20:01.376084" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:01.582718" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:01.999112" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:02.001405" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:20:01.373236" elapsed="0.633728">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:20:01.370969" elapsed="0.636144">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:02.007471" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:02.007176" elapsed="0.000391"/>
</branch>
<status status="FAIL" start="2026-04-17T03:20:01.370931" elapsed="0.636669">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:02.008222" elapsed="0.000119"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:02.008570" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:02.008490" elapsed="0.000169"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:02.008453" elapsed="0.000242"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:02.008905" elapsed="0.000059"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:20:02.009037" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:20:01.369185" elapsed="0.640012">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:02.009309" 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-04-17T03:20:01.267713" elapsed="0.741737">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:02.009873" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:02.009583" elapsed="0.000415"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:02.009559" elapsed="0.000475"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:02.010081" elapsed="0.000024"/>
</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="FAIL" start="2026-04-17T03:20:01.260836" elapsed="0.749396">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:20:01.250430" elapsed="0.759945">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:20:03.073426" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:03.072968" elapsed="0.000494"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:03.074455" 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-04-17T03:20:03.074038" elapsed="0.000514">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-04-17T03:20:03.074670" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:03.073647" elapsed="0.001050"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:03.075414" 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-04-17T03:20:03.074873" elapsed="0.000572"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:20:03.075765" 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-04-17T03:20:03.075955" 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-04-17T03:20:03.075614" elapsed="0.000437"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:03.076535" 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-04-17T03:20:03.076220" 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-04-17T03:20:03.078013" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:03.077456" elapsed="0.000642"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:20:03.078664" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:20:03.078268" elapsed="0.000424"/>
</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-04-17T03:20:03.079181" elapsed="0.000053"/>
</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-04-17T03:20:03.079998" elapsed="0.000055"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:20:03.080442" elapsed="0.000065"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:20:03.078921" elapsed="0.001751"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:20:03.078747" elapsed="0.002023"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:20:03.080842" elapsed="0.000050"/>
</return>
<msg time="2026-04-17T03:20:03.081168" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:20:03.077083" elapsed="0.004122"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:03.076669" elapsed="0.004582"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:03.081486" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:03.081288" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:03.076645" elapsed="0.004935"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:20:03.082248" 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-04-17T03:20:03.081735" elapsed="0.000544"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:20:03.082340" 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//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-04-17T03:20:03.072130" elapsed="0.010390"/>
</kw>
<msg time="2026-04-17T03:20:03.082583" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:20:03.058666" elapsed="0.023991"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:20:03.099629" elapsed="0.000073"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:20:03.112646" elapsed="0.000042"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:20:03.125190" elapsed="0.000039"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:03.125438" elapsed="0.000102"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:03.125769" 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-04-17T03:20:03.126218" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:03.126062" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:03.126045" 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-04-17T03:20:03.126446" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:03.126618" 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-04-17T03:20:03.126788" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:20:03.126004" elapsed="0.000839"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:20:03.125857" elapsed="0.001014"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:03.127042" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:03.127123" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:20:03.127284" 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-04-17T03:20:03.054035" elapsed="0.073278"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:03.128752" 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-04-17T03:20:03.128452" elapsed="0.000387">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-04-17T03:20:03.128958" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:03.128042" elapsed="0.000946"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:03.129341" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:03.129064" elapsed="0.000337"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:20:03.130003" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:03.129621" elapsed="0.000410"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:03.129428" elapsed="0.000641"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:03.129045" elapsed="0.001047"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:03.132517" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:20:03.130250" elapsed="0.002296"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:20:03.132602" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:20:03.132779" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:20:03.127665" elapsed="0.005140"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:03.134199" 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-04-17T03:20:03.133905" elapsed="0.000368">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-04-17T03:20:03.134373" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:03.133525" elapsed="0.000875"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:20:03.134623" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-17T03:20:03.134476" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:03.134456" elapsed="0.000267"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:03.134876" 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-04-17T03:20:03.135152" elapsed="0.000023"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:20:03.135225" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:20:03.137378" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:20:03.133175" elapsed="0.004232"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:03.139010" 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-04-17T03:20:03.138709" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:03.139470" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:03.139217" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:20:03.172285" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:03.374085" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:03.776783" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:03.779697" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:20:03.141675" elapsed="0.642855">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:20:03.139585" elapsed="0.645090">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:03.785060" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:03.784736" elapsed="0.000425"/>
</branch>
<status status="FAIL" start="2026-04-17T03:20:03.139565" elapsed="0.645631">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:03.785819" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:03.786048" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:03.785990" elapsed="0.000166"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:03.785959" elapsed="0.000248"/>
</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-04-17T03:20:03.786435" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:20:03.786538" elapsed="0.000024"/>
</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-04-17T03:20:03.137811" elapsed="0.648897">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:03.786824" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:20:03.028787" elapsed="0.758216">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:03.787500" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:03.787217" elapsed="0.000392"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:03.787191" elapsed="0.000455"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:03.787696" elapsed="0.000022"/>
</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="FAIL" start="2026-04-17T03:20:03.022245" elapsed="0.765604">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:20:03.011202" elapsed="0.776825">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:20:04.847027" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:04.846524" elapsed="0.000541"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:04.848099" 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-04-17T03:20:04.847656" elapsed="0.000525">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-04-17T03:20:04.848284" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:04.847269" elapsed="0.001042"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:04.848924" 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-04-17T03:20:04.848504" elapsed="0.000469"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:20:04.849322" 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-04-17T03:20:04.849492" 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-04-17T03:20:04.849162" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:04.849996" 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-04-17T03:20:04.849701" elapsed="0.000346"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:04.851455" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:04.850919" elapsed="0.000603"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:20:04.852077" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:20:04.851690" elapsed="0.000414"/>
</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-04-17T03:20:04.852514" 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-04-17T03:20:04.853271" 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-04-17T03:20:04.853613" elapsed="0.000046"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:20:04.852323" elapsed="0.001459"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:20:04.852161" elapsed="0.001689"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:20:04.853900" elapsed="0.000056"/>
</return>
<msg time="2026-04-17T03:20:04.854097" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:20:04.850548" elapsed="0.003575"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:04.850134" elapsed="0.004085"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:04.854513" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:04.854349" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:04.850107" elapsed="0.004486"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:20:04.855256" 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-04-17T03:20:04.854740" elapsed="0.000545"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:20:04.855335" 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-04-17T03:20:04.845635" elapsed="0.009827"/>
</kw>
<msg time="2026-04-17T03:20:04.855518" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:20:04.832760" elapsed="0.022810"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:20:04.868448" elapsed="0.000039"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:20:04.881062" 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-04-17T03:20:04.893555" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:04.893795" 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-04-17T03:20:04.893994" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:04.894400" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:04.894250" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:04.894232" 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-04-17T03:20:04.894632" elapsed="0.000042"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:04.894823" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:04.895006" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:20:04.894194" elapsed="0.000866"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:20:04.894076" elapsed="0.001011"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:04.895233" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:04.895312" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:20:04.895464" 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-04-17T03:20:04.828249" elapsed="0.067307"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:04.897073" 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-04-17T03:20:04.896772" elapsed="0.000376">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-04-17T03:20:04.897244" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:04.896381" elapsed="0.000888"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:04.897606" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:04.897341" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:20:04.898186" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:04.897869" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:04.897687" elapsed="0.000561"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:04.897322" elapsed="0.000946"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:04.900676" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:20:04.898418" elapsed="0.002285"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:20:04.900754" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:20:04.900914" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:20:04.895905" elapsed="0.005049"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:04.902196" 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-04-17T03:20:04.901956" elapsed="0.000305">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-04-17T03:20:04.902355" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:04.901601" elapsed="0.000779"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:20:04.902587" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:20:04.902451" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:04.902433" elapsed="0.000239"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:04.902836" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:04.903024" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:20:04.903091" elapsed="0.000014"/>
</return>
<msg time="2026-04-17T03:20:04.905188" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:20:04.901271" elapsed="0.003944"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:04.906639" 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-04-17T03:20:04.906380" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:04.907136" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:04.906872" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:20:04.912097" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:05.113693" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:05.516165" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:05.518610" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:20:04.909325" elapsed="0.612071">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:20:04.907247" elapsed="0.614270">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:05.521832" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:05.521567" elapsed="0.000343"/>
</branch>
<status status="FAIL" start="2026-04-17T03:20:04.907229" elapsed="0.614731">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:05.522477" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:05.522636" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:05.522590" elapsed="0.000105"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:05.522569" elapsed="0.000151"/>
</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-04-17T03:20:05.522893" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:20:05.522992" elapsed="0.000017"/>
</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-04-17T03:20:04.905535" elapsed="0.617587">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:05.523209" 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-04-17T03:20:04.805225" elapsed="0.718098">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:05.523645" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:05.523430" elapsed="0.000302"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:05.523411" elapsed="0.000349"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:05.523797" elapsed="0.000016"/>
</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="FAIL" start="2026-04-17T03:20:04.798773" elapsed="0.725140">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:20:04.788777" elapsed="0.735276">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:20:06.584021" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:06.583504" elapsed="0.000553"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:06.585087" 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-04-17T03:20:06.584593" elapsed="0.000581">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-04-17T03:20:06.585280" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:06.584241" elapsed="0.001065"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:06.585878" 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-04-17T03:20:06.585476" elapsed="0.000430"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:20:06.586241" 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-04-17T03:20:06.586544" 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-04-17T03:20:06.586094" elapsed="0.000478"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:06.587081" 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-04-17T03:20:06.586799" elapsed="0.000329"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:06.588566" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:06.587904" elapsed="0.000726"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:20:06.589189" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:20:06.588797" elapsed="0.000419"/>
</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-04-17T03:20:06.589622" elapsed="0.000050"/>
</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-04-17T03:20:06.590455" elapsed="0.000053"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:20:06.590851" elapsed="0.000050"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:20:06.589431" elapsed="0.001619"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:20:06.589268" elapsed="0.001852"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:20:06.591173" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:20:06.591350" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:20:06.587550" elapsed="0.003825"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:06.587207" elapsed="0.004200"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:06.591584" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:06.591434" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:06.587183" elapsed="0.004479"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:20:06.592293" 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-04-17T03:20:06.591805" elapsed="0.000663"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:20:06.592518" 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-04-17T03:20:06.582757" elapsed="0.009886"/>
</kw>
<msg time="2026-04-17T03:20:06.592699" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:20:06.569202" elapsed="0.023549"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:20:06.606234" 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-04-17T03:20:06.619369" elapsed="0.000033"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:06.631824" elapsed="0.000032"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:06.632072" 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-04-17T03:20:06.632259" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:06.632672" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:06.632521" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:06.632503" 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-04-17T03:20:06.632899" 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-04-17T03:20:06.633086" 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-04-17T03:20:06.633252" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:20:06.632465" elapsed="0.000839"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:20:06.632344" elapsed="0.000988"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:06.633478" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:06.633558" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:20:06.633712" 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-04-17T03:20:06.564539" elapsed="0.069200"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:06.635236" 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-04-17T03:20:06.634866" elapsed="0.000450">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-04-17T03:20:06.635414" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:06.634466" elapsed="0.000972"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:06.635776" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:06.635510" elapsed="0.000325"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:20:06.636372" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:06.636070" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:06.635859" elapsed="0.000631"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:06.635492" elapsed="0.001023"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:06.638972" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:20:06.636669" elapsed="0.002332"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:20:06.639054" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:20:06.639242" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:20:06.634096" elapsed="0.005174"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:06.640598" 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-04-17T03:20:06.640342" elapsed="0.000322">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-04-17T03:20:06.640759" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:06.639999" elapsed="0.000784"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:20:06.641034" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-17T03:20:06.640854" elapsed="0.000259"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:06.640835" elapsed="0.000309"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:06.641341" elapsed="0.000030"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:06.641577" elapsed="0.000029"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:20:06.641668" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:20:06.644506" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:20:06.639637" elapsed="0.004906"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:06.646519" 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-04-17T03:20:06.646151" elapsed="0.000437"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:06.647198" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:06.646816" elapsed="0.000475"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:20:06.653020" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:06.854444" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:07.259089" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:07.262029" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:20:06.650041" elapsed="0.616452">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:20:06.647387" elapsed="0.619248">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:07.267010" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:07.266693" elapsed="0.000416"/>
</branch>
<status status="FAIL" start="2026-04-17T03:20:06.647361" elapsed="0.619781">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:07.267767" elapsed="0.000099"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:07.268111" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:07.268035" elapsed="0.000145"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:07.267993" elapsed="0.000218"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:07.268474" elapsed="0.000038"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:20:07.268585" 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-04-17T03:20:06.645006" elapsed="0.623737">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:07.268851" 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-04-17T03:20:06.540731" elapsed="0.728296">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:07.269452" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:07.269163" elapsed="0.000394"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:07.269139" elapsed="0.000451"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:07.269635" elapsed="0.000020"/>
</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="FAIL" start="2026-04-17T03:20:06.532315" elapsed="0.737465">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:20:06.524643" elapsed="0.745364">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:20:08.335561" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:08.335102" elapsed="0.000496"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:08.336746" 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-04-17T03:20:08.336250" elapsed="0.000580">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-04-17T03:20:08.336960" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:08.335781" elapsed="0.001225"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:08.337631" 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-04-17T03:20:08.337188" elapsed="0.000475"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:20:08.338008" 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-04-17T03:20:08.338213" 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-04-17T03:20:08.337831" elapsed="0.000474"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:08.338801" 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-04-17T03:20:08.338498" 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-04-17T03:20:08.340262" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:08.339682" elapsed="0.000666"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:20:08.340883" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:20:08.340518" 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-04-17T03:20:08.341344" 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-04-17T03:20:08.342132" elapsed="0.000053"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:20:08.342474" elapsed="0.000052"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:20:08.341155" elapsed="0.001498"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:20:08.340990" elapsed="0.001730"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:20:08.342770" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:20:08.342963" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:20:08.339320" elapsed="0.003670"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:08.338955" elapsed="0.004083"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:08.343226" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:08.343072" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:08.338909" elapsed="0.004395"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:20:08.343905" 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-04-17T03:20:08.343447" elapsed="0.000503"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:20:08.344000" 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-04-17T03:20:08.334361" elapsed="0.009777"/>
</kw>
<msg time="2026-04-17T03:20:08.344254" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:20:08.321035" elapsed="0.023290"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:20:08.358180" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:20:08.378858" elapsed="0.000103"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:20:08.393038" elapsed="0.000047"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:08.393318" elapsed="0.000079"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:08.393572" 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-04-17T03:20:08.394113" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:08.393892" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:08.393869" elapsed="0.000355"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:08.394401" 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-04-17T03:20:08.394580" 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-04-17T03:20:08.394753" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:20:08.393819" elapsed="0.000990"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:20:08.393666" elapsed="0.001172"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:08.395008" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:08.395091" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:20:08.395254" 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-04-17T03:20:08.314595" elapsed="0.080689"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:08.396843" 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-04-17T03:20:08.396499" elapsed="0.000454">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-04-17T03:20:08.397088" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:08.396040" elapsed="0.001081"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:08.397555" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:08.397213" elapsed="0.000411"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:20:08.398216" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:08.397851" elapsed="0.000392"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:08.397656" elapsed="0.000624"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:08.397190" elapsed="0.001111"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:08.400694" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:20:08.398454" elapsed="0.002268"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:20:08.400775" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:20:08.400951" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:20:08.395641" elapsed="0.005337"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:08.402273" 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-04-17T03:20:08.402015" elapsed="0.000325">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-04-17T03:20:08.402437" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:08.401645" elapsed="0.000817"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:20:08.402673" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:20:08.402533" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:08.402516" elapsed="0.000242"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:08.402907" elapsed="0.000047"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:08.403150" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:20:08.403219" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:20:08.405442" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:20:08.401295" elapsed="0.004176"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:08.406982" 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-04-17T03:20:08.406701" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:08.407436" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:08.407188" 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-04-17T03:20:08.412609" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:08.614408" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:09.017088" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:09.019270" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:20:08.409842" elapsed="0.613333">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:20:08.407547" elapsed="0.615825">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:09.023821" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:09.023445" elapsed="0.000524"/>
</branch>
<status status="FAIL" start="2026-04-17T03:20:08.407530" elapsed="0.616483">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:09.024750" elapsed="0.000069"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:09.025051" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:09.024981" elapsed="0.000146"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:09.024917" elapsed="0.000246"/>
</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-04-17T03:20:09.025382" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:20:09.025465" 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-04-17T03:20:08.405819" elapsed="0.619788">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:09.025702" 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-04-17T03:20:08.289188" elapsed="0.736636">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:09.026272" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:09.026037" elapsed="0.000323"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:09.026015" elapsed="0.000373"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:09.026427" elapsed="0.000018"/>
</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="FAIL" start="2026-04-17T03:20:08.279986" elapsed="0.746567">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:20:08.270607" elapsed="0.756074">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:20:10.089077" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:10.088635" elapsed="0.000479"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:10.090294" 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-04-17T03:20:10.089839" elapsed="0.000536">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-04-17T03:20:10.090475" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:10.089296" elapsed="0.001204"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:10.091187" 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-04-17T03:20:10.090711" elapsed="0.000507"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:20:10.091550" 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-04-17T03:20:10.091716" 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-04-17T03:20:10.091402" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:10.092187" 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-04-17T03:20:10.091905" 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-04-17T03:20:10.093766" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:10.093084" elapsed="0.000746"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:20:10.094421" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:20:10.094040" 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-04-17T03:20:10.094946" 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-04-17T03:20:10.095905" elapsed="0.000078"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:10.096353" elapsed="0.000064"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:20:10.094709" elapsed="0.001871"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:20:10.094502" elapsed="0.002150"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:20:10.096705" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:20:10.096887" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:20:10.092708" elapsed="0.004204"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:10.092348" elapsed="0.004696"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:10.097224" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:10.097070" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:10.092318" elapsed="0.004982"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:20:10.097913" 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-04-17T03:20:10.097446" elapsed="0.000512"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:20:10.098009" 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-04-17T03:20:10.087908" elapsed="0.010229"/>
</kw>
<msg time="2026-04-17T03:20:10.098193" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:20:10.073825" elapsed="0.024420"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:20:10.112621" elapsed="0.000043"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:20:10.126304" 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-04-17T03:20:10.140107" elapsed="0.000062"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:10.140421" 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-04-17T03:20:10.140610" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:10.141145" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:10.140955" elapsed="0.000254"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:10.140917" 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-04-17T03:20:10.141387" 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-04-17T03:20:10.141554" 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-04-17T03:20:10.141724" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:20:10.140870" elapsed="0.000909"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:20:10.140698" elapsed="0.001109"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:10.141974" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:10.142057" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:20:10.142222" 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-04-17T03:20:10.069271" elapsed="0.073060"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:10.143984" 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-04-17T03:20:10.143663" elapsed="0.000398">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-04-17T03:20:10.144190" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:10.143150" elapsed="0.001069"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:10.144661" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:10.144294" elapsed="0.000446"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:20:10.145353" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:10.145020" elapsed="0.000359"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:10.144766" elapsed="0.000650"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:10.144274" elapsed="0.001164"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:10.147960" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:20:10.145592" elapsed="0.002397"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:20:10.148047" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:20:10.148220" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:20:10.142757" elapsed="0.005488"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:10.149754" 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-04-17T03:20:10.149463" elapsed="0.000368">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-04-17T03:20:10.149946" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:10.149035" elapsed="0.000938"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:20:10.150214" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-17T03:20:10.150050" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:10.150030" elapsed="0.000301"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:10.150500" 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-04-17T03:20:10.150720" elapsed="0.000024"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:20:10.150792" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:20:10.153131" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:20:10.148615" elapsed="0.004546"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:10.154798" 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-04-17T03:20:10.154482" elapsed="0.000369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:10.155277" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:10.155027" 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-04-17T03:20:10.160417" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:10.362391" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:10.765188" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:10.767375" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:20:10.157648" elapsed="0.614084">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:20:10.155394" elapsed="0.616511">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:10.772313" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:10.771998" elapsed="0.000416"/>
</branch>
<status status="FAIL" start="2026-04-17T03:20:10.155373" elapsed="0.617080">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:10.773252" elapsed="0.000043"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:10.773647" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:10.773410" elapsed="0.000363"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:10.773381" elapsed="0.000435"/>
</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-04-17T03:20:10.774071" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:20:10.774192" elapsed="0.000034"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:20:10.153560" elapsed="0.620827">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:10.774504" 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-04-17T03:20:10.044089" elapsed="0.730603">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:10.775214" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:10.774901" elapsed="0.000424"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:10.774872" elapsed="0.000488"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:10.775409" elapsed="0.000022"/>
</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="FAIL" start="2026-04-17T03:20:10.036058" elapsed="0.739505">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:20:10.027383" elapsed="0.748530">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:20:11.840449" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:11.839761" elapsed="0.000738"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:11.841845" 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-04-17T03:20:11.841279" elapsed="0.000717">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-04-17T03:20:11.842140" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:11.840739" elapsed="0.001436"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:11.842955" 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-04-17T03:20:11.842406" elapsed="0.000586"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:20:11.843402" 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-04-17T03:20:11.843605" 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-04-17T03:20:11.843213" elapsed="0.000426"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:11.844269" 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-04-17T03:20:11.843849" elapsed="0.000478"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:11.846024" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:11.845437" elapsed="0.000667"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:20:11.846780" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:20:11.846323" elapsed="0.000498"/>
</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-04-17T03:20:11.847423" elapsed="0.000056"/>
</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-04-17T03:20:11.848384" 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-04-17T03:20:11.848761" elapsed="0.000046"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:20:11.847169" elapsed="0.001812"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:20:11.846892" elapsed="0.002161"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:20:11.849110" elapsed="0.000047"/>
</return>
<msg time="2026-04-17T03:20:11.849311" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:20:11.844905" elapsed="0.004433"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:11.844434" elapsed="0.004938"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:11.849628" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:11.849403" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:11.844403" elapsed="0.005311"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:20:11.850416" 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-04-17T03:20:11.849867" elapsed="0.000578"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:20:11.850525" 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/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-04-17T03:20:11.838640" elapsed="0.012063"/>
</kw>
<msg time="2026-04-17T03:20:11.850788" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:20:11.823743" elapsed="0.027117"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:20:11.865460" elapsed="0.000056"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:20:11.879682" elapsed="0.000064"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:20:11.893276" elapsed="0.000059"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:11.893585" 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-04-17T03:20:11.893776" 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-04-17T03:20:11.894242" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:11.894087" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:11.894068" 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-04-17T03:20:11.894479" 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-04-17T03:20:11.894650" 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-04-17T03:20:11.894822" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:20:11.894025" elapsed="0.000851"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:20:11.893864" elapsed="0.001041"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:11.895074" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:11.895155" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:20:11.895320" 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-04-17T03:20:11.818681" elapsed="0.076668"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:11.896926" 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-04-17T03:20:11.896599" elapsed="0.000435">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-04-17T03:20:11.897135" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:11.896137" 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-04-17T03:20:11.897506" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:11.897232" elapsed="0.000331"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:20:11.898214" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:11.897835" elapsed="0.000417"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:11.897590" elapsed="0.000782"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:11.897213" elapsed="0.001195"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:11.901342" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:20:11.898623" elapsed="0.002748"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:20:11.901429" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:20:11.901643" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:20:11.895728" elapsed="0.005946"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:11.903309" 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-04-17T03:20:11.902982" elapsed="0.000402">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-04-17T03:20:11.903488" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:11.902471" elapsed="0.001042"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:20:11.903728" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:20:11.903585" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:11.903566" 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-04-17T03:20:11.903981" 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-04-17T03:20:11.904156" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:20:11.904222" elapsed="0.000149"/>
</return>
<msg time="2026-04-17T03:20:11.906688" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:20:11.902027" elapsed="0.004690"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:11.908416" 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-04-17T03:20:11.908028" elapsed="0.000464"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:11.908945" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:11.908670" elapsed="0.000324"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:20:11.914125" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:12.115576" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:12.518350" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:12.520912" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:20:11.911159" elapsed="0.614529">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:20:11.909062" elapsed="0.616862">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:12.526505" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:12.526045" elapsed="0.000600"/>
</branch>
<status status="FAIL" start="2026-04-17T03:20:11.909043" elapsed="0.617653">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:12.527603" elapsed="0.000120"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:12.527909" elapsed="0.000054"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:12.527845" elapsed="0.000168"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:12.527815" elapsed="0.000234"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:12.528269" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:20:12.528376" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:20:11.907164" elapsed="0.621391">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:12.528677" elapsed="0.000026"/>
</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-04-17T03:20:11.793670" elapsed="0.735166">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:12.529267" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:12.528996" elapsed="0.000383"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:12.528969" elapsed="0.000449"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:12.529468" elapsed="0.000023"/>
</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="FAIL" start="2026-04-17T03:20:11.785966" elapsed="0.743659">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:20:11.776856" elapsed="0.752931">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:20:13.598126" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:13.597663" elapsed="0.000499"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:13.599307" 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-04-17T03:20:13.598789" elapsed="0.000620">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-04-17T03:20:13.599516" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:13.598344" elapsed="0.001198"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:13.600214" 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-04-17T03:20:13.599749" elapsed="0.000494"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:20:13.600663" 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-04-17T03:20:13.600911" 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-04-17T03:20:13.600414" elapsed="0.000646"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:13.601734" 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-04-17T03:20:13.601318" elapsed="0.000484"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:13.603776" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:13.603229" elapsed="0.000614"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:20:13.604569" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:20:13.604079" elapsed="0.000524"/>
</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-04-17T03:20:13.605195" elapsed="0.000060"/>
</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-04-17T03:20:13.606015" elapsed="0.000055"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:20:13.606372" elapsed="0.000050"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:20:13.604884" elapsed="0.001669"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:20:13.604674" elapsed="0.001947"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:20:13.606677" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:20:13.606873" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:20:13.602475" elapsed="0.004425"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:13.601946" elapsed="0.005008"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:13.607204" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:13.606990" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:13.601886" elapsed="0.005431"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:20:13.608121" 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-04-17T03:20:13.607531" elapsed="0.000620"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:20:13.608203" elapsed="0.000033"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:20:13.596848" elapsed="0.011505"/>
</kw>
<msg time="2026-04-17T03:20:13.608413" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:20:13.583010" elapsed="0.025463"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:20:13.624056" 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/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-04-17T03:20:13.636900" 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-04-17T03:20:13.649589" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:13.649836" elapsed="0.000120"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:13.650130" 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-04-17T03:20:13.650562" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:13.650406" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:13.650388" 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-04-17T03:20:13.650789" 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-04-17T03:20:13.650972" 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-04-17T03:20:13.651142" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:20:13.650345" elapsed="0.000849"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:20:13.650218" elapsed="0.001005"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:13.651400" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:13.651482" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:20:13.651647" 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-04-17T03:20:13.577942" elapsed="0.073733"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:13.653151" 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-04-17T03:20:13.652833" elapsed="0.000397">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-04-17T03:20:13.653326" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:13.652409" elapsed="0.000941"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:13.653684" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:13.653419" elapsed="0.000323"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:20:13.654265" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:13.653967" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:13.653766" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:13.653401" elapsed="0.000945"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:13.656721" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:20:13.654497" elapsed="0.002251"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:20:13.656800" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:20:13.656980" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:20:13.652032" elapsed="0.004974"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:13.658300" 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-04-17T03:20:13.658003" elapsed="0.000368">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-04-17T03:20:13.658470" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:13.657649" elapsed="0.000845"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:20:13.658703" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:20:13.658565" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:13.658547" elapsed="0.000247"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:13.658959" elapsed="0.000024"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:13.659178" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:20:13.659245" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:20:13.661377" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:20:13.657321" elapsed="0.004089"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:13.663015" 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-04-17T03:20:13.662705" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:13.663548" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:13.663238" elapsed="0.000356"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:20:13.668789" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:13.870239" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:14.273558" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:14.276236" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:20:13.665747" elapsed="0.614875">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:20:13.663675" elapsed="0.617099">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:14.281194" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:14.280860" elapsed="0.000432"/>
</branch>
<status status="FAIL" start="2026-04-17T03:20:13.663651" elapsed="0.617674">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:14.282016" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:14.282216" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:14.282161" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:14.282134" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:14.282526" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:20:14.282629" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:20:13.661758" elapsed="0.621034">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:14.282905" elapsed="0.000053"/>
</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-04-17T03:20:13.545471" elapsed="0.737615">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:14.283637" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:14.283330" elapsed="0.000422"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:14.283304" elapsed="0.000482"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:14.283836" elapsed="0.000021"/>
</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="FAIL" start="2026-04-17T03:20:13.536783" elapsed="0.747231">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:20:13.530380" elapsed="0.753791">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:20:15.344844" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:15.344407" elapsed="0.000471"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:15.346168" 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-04-17T03:20:15.345688" elapsed="0.000558">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-04-17T03:20:15.346345" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:15.345327" elapsed="0.001043"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:15.346983" 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-04-17T03:20:15.346557" elapsed="0.000455"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:20:15.347327" 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-04-17T03:20:15.347502" 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-04-17T03:20:15.347181" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:15.347991" 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-04-17T03:20:15.347710" elapsed="0.000328"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:15.349393" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:15.348876" elapsed="0.000589"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:20:15.350018" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:20:15.349633" elapsed="0.000411"/>
</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-04-17T03:20:15.350454" elapsed="0.000059"/>
</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-04-17T03:20:15.351255" 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-04-17T03:20:15.351600" elapsed="0.000070"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:20:15.350262" elapsed="0.001535"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:20:15.350097" elapsed="0.001767"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:20:15.351916" elapsed="0.000057"/>
</return>
<msg time="2026-04-17T03:20:15.352114" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:20:15.348512" elapsed="0.003627"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:15.348133" elapsed="0.004110"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:15.352458" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:15.352271" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:15.348106" elapsed="0.004447"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:20:15.353442" 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-04-17T03:20:15.352889" elapsed="0.000582"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:20:15.353522" 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-04-17T03:20:15.343663" elapsed="0.009988"/>
</kw>
<msg time="2026-04-17T03:20:15.353708" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:20:15.330529" elapsed="0.023232"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:20:15.366890" elapsed="0.000075"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:20:15.380059" elapsed="0.000064"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:20:15.393597" elapsed="0.000078"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:15.393968" 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-04-17T03:20:15.394164" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:15.394639" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:15.394479" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:15.394459" elapsed="0.000289"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:15.394905" 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-04-17T03:20:15.395100" 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-04-17T03:20:15.395268" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:20:15.394414" elapsed="0.000909"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:20:15.394250" elapsed="0.001099"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:15.395535" elapsed="0.000024"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:15.395623" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:20:15.395827" 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-04-17T03:20:15.326053" elapsed="0.069896"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:15.397757" 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-04-17T03:20:15.397349" elapsed="0.000505">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-04-17T03:20:15.397976" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:15.396778" elapsed="0.001224"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:15.398347" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:15.398077" elapsed="0.000328"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:20:15.398956" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:15.398615" elapsed="0.000369"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:15.398430" elapsed="0.000591"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:15.398058" elapsed="0.000984"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:15.401853" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:20:15.399198" elapsed="0.002704"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:20:15.402010" elapsed="0.000053"/>
</return>
<msg time="2026-04-17T03:20:15.402263" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:20:15.396381" elapsed="0.005921"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:15.404319" 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-04-17T03:20:15.403878" elapsed="0.000578">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-04-17T03:20:15.404648" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:15.403319" elapsed="0.001370"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:20:15.405054" elapsed="0.000046"/>
</return>
<status status="PASS" start="2026-04-17T03:20:15.404805" elapsed="0.000435"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:15.404775" elapsed="0.000511"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:15.405534" elapsed="0.000043"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:15.405823" elapsed="0.000033"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:20:15.405969" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:20:15.409371" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:20:15.402788" elapsed="0.006624"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:15.411691" 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-04-17T03:20:15.411280" elapsed="0.000483"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:15.412408" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:15.412020" elapsed="0.000456"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:20:15.417846" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:15.619404" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:16.021837" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:16.024375" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:20:15.415029" elapsed="0.615204">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:20:15.412580" elapsed="0.617906">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:16.031206" elapsed="0.000067"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:16.030586" elapsed="0.000800"/>
</branch>
<status status="FAIL" start="2026-04-17T03:20:15.412551" elapsed="0.618894">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:16.031996" elapsed="0.000031"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:16.032177" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:16.032113" elapsed="0.000142"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:16.032090" elapsed="0.000189"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:16.032439" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:20:16.032512" elapsed="0.000017"/>
</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-04-17T03:20:15.409922" elapsed="0.622715">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:16.032718" 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-04-17T03:20:15.301786" elapsed="0.731037">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:16.033137" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:16.032921" elapsed="0.000293"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:16.032902" elapsed="0.000336"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:16.033271" elapsed="0.000014"/>
</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="FAIL" start="2026-04-17T03:20:15.294352" elapsed="0.739024">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:20:15.284806" elapsed="0.748674">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:20:17.096900" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:17.096439" elapsed="0.000515"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:17.098060" 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-04-17T03:20:17.097505" elapsed="0.000645">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-04-17T03:20:17.098257" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:17.097139" elapsed="0.001145"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:17.098950" 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-04-17T03:20:17.098475" elapsed="0.000510"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:20:17.099313" 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-04-17T03:20:17.099484" 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-04-17T03:20:17.099160" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:17.099986" 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-04-17T03:20:17.099699" elapsed="0.000338"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:17.101370" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:17.100867" elapsed="0.000577"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:20:17.102059" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:20:17.101614" elapsed="0.000472"/>
</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-04-17T03:20:17.102507" 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-04-17T03:20:17.103454" elapsed="0.000063"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:20:17.103876" elapsed="0.000048"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:20:17.102315" elapsed="0.001754"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:20:17.102141" elapsed="0.001998"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:20:17.104192" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:20:17.104373" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:20:17.100492" elapsed="0.003907"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:17.100123" elapsed="0.004309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:17.104610" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:17.104458" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:17.100096" elapsed="0.004600"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:20:17.105326" 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-04-17T03:20:17.104845" elapsed="0.000510"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:20:17.105404" 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-04-17T03:20:17.095656" elapsed="0.009875"/>
</kw>
<msg time="2026-04-17T03:20:17.105588" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:20:17.081356" elapsed="0.024290"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:20:17.119432" elapsed="0.000047"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:20:17.133363" elapsed="0.000044"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:20:17.146345" elapsed="0.000035"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:17.146600" 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-04-17T03:20:17.146806" elapsed="0.000036"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:17.147265" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:17.147109" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:17.147091" 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-04-17T03:20:17.147494" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:17.147666" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:17.147847" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:20:17.147051" elapsed="0.000853"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:20:17.146908" elapsed="0.001040"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:17.148102" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:17.148185" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:20:17.148348" 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-04-17T03:20:17.076221" elapsed="0.072157"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:17.149838" 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-04-17T03:20:17.149537" elapsed="0.000380">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-04-17T03:20:17.150085" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:17.149124" 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-04-17T03:20:17.150453" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:17.150184" elapsed="0.000327"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:20:17.151081" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:17.150735" elapsed="0.000373"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:17.150537" elapsed="0.000679"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:17.150166" elapsed="0.001078"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:17.153809" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:20:17.151404" elapsed="0.002434"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:20:17.153905" elapsed="0.000126"/>
</return>
<msg time="2026-04-17T03:20:17.154222" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:20:17.148734" elapsed="0.005518"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:17.155881" 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-04-17T03:20:17.155559" elapsed="0.000418">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-04-17T03:20:17.156078" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:17.155152" elapsed="0.000951"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:20:17.156329" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:20:17.156180" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:17.156160" elapsed="0.000258"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:17.156570" elapsed="0.000024"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:17.156814" elapsed="0.000026"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:20:17.156890" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:20:17.159053" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:20:17.154699" elapsed="0.004382"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:17.160771" 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-04-17T03:20:17.160449" elapsed="0.000372"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:17.161267" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:17.160996" elapsed="0.000329"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:20:17.166492" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:17.367855" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:17.770124" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:17.772906" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:20:17.163637" elapsed="0.612569">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:20:17.161417" elapsed="0.614931">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:17.776722" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:17.776411" elapsed="0.000409"/>
</branch>
<status status="FAIL" start="2026-04-17T03:20:17.161391" elapsed="0.615465">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:17.777515" elapsed="0.000113"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:17.777801" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:17.777743" elapsed="0.000124"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:17.777715" elapsed="0.000186"/>
</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-04-17T03:20:17.778139" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:20:17.778242" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:20:17.159416" elapsed="0.618985">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:17.778516" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:20:17.051088" elapsed="0.727579">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:17.779098" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:17.778807" elapsed="0.000397"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:17.778780" elapsed="0.000460"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:17.779289" elapsed="0.000020"/>
</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="FAIL" start="2026-04-17T03:20:17.043780" elapsed="0.735652">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:20:17.034282" elapsed="0.745314">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:20:17.779736" level="FAIL">Keyword 'Compare_Topology' failed after retrying for 3 minutes. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-17T03:17:16.247400" elapsed="181.532470">Keyword 'Compare_Topology' failed after retrying for 3 minutes. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>empty_topology</arg>
<arg>timeout=180s</arg>
<doc>Wait until Compare_Topology matches expected result.</doc>
<status status="FAIL" start="2026-04-17T03:17:16.247027" elapsed="181.533009">Keyword 'Compare_Topology' failed after retrying for 3 minutes. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:17.782112" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:20:17.781611" elapsed="0.000567"/>
</kw>
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-04-17T03:20:17.781004" elapsed="0.001248"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-04-17T03:20:17.780501" elapsed="0.001834"/>
</kw>
<doc>Sanity check example-ipv4-topology is up but empty.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:17:16.178712" elapsed="181.603682">Keyword 'Compare_Topology' failed after retrying for 3 minutes. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:20:17.787517" elapsed="0.000302"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:20:17.787108" elapsed="0.000795"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:20:17.789415" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:17.789236" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:17.789205" elapsed="0.000315"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:20:17.796727" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:17.796595" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:17.796575" elapsed="0.000225"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:17.798012" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:20:17.797486" elapsed="0.000566"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:20:17.798632" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:20:17.798277" elapsed="0.000385"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:20:17.798709" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:20:17.798880" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:20:17.797082" elapsed="0.001824"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:20:17.806746" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:17.806588" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:17.806560" elapsed="0.000285"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:20:17.808379" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:17.808254" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:17.808233" elapsed="0.000223"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:20:17.809033" level="INFO">${karaf_connection_index} = 19</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:20:17.808638" elapsed="0.000428"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:20:17.809545" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:20:17.809269" elapsed="0.000308"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:20:17.810769" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:20:17.810227" elapsed="0.001367">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:20:17.811819" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:20:17.811875" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:17.809790" elapsed="0.002113"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:20:17.812816" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:20:17.812536" elapsed="0.001138">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:20:17.813929" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:20:17.814016" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:17.812128" elapsed="0.001923"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:20:17.815358" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_BGP_Application_Peer_Post_3_Initial_Routes"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:20:17.814471" elapsed="0.000973">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_BGP_Application_Peer_Post_3_Initial_Routes"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:20:17.814156" elapsed="0.001390">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_BGP_Application_Peer_Post_3_Initial_Routes"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:20:17.814129" elapsed="0.001517">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_BGP_Application_Peer_Post_3_Initial_Routes"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:17.815990" elapsed="0.000034"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:17.816323" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:17.816116" elapsed="0.000284"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:17.816091" elapsed="0.000343"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:20:17.816485" 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-04-17T03:20:17.820142" elapsed="0.000210"/>
</kw>
<msg time="2026-04-17T03:20:17.820443" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:20:17.818665" elapsed="0.001974"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:17.821131" elapsed="0.000109"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:17.821615" 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-04-17T03:20:17.817741" elapsed="0.004129"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:20:17.816963" elapsed="0.005030"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:20:17.807863" elapsed="0.014251">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_BGP_Application_Peer_Post_3_Initial_Routes"</status>
</kw>
<msg time="2026-04-17T03:20:17.822255" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:20:17.822315" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_BGP_Application_Peer_Post_3_Initial_Routes"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:17.807091" elapsed="0.015259"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:20:17.822608" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:17.822457" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:17.822431" elapsed="0.000273"/>
</if>
<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-04-17T03:20:17.823965" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:17.823794" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:17.823768" elapsed="0.000294"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:20:17.824485" level="INFO">index=16
host=10.30.171.238
alias=bgp_app_peer_console
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-04-17T03:20:17.824634" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.238
alias=bgp_app_peer_console
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_error...</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:20:17.824297" elapsed="0.000376"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:17.825280" level="INFO">{1: 19}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:17.824875" elapsed="0.000456"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:17.825803" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:17.825510" elapsed="0.000345"/>
</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-04-17T03:20:17.826548" elapsed="0.000324"/>
</kw>
<msg time="2026-04-17T03:20:17.827016" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:20:17.827074" level="INFO">${old_connection_index} = 19</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:17.826074" elapsed="0.001029"/>
</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-04-17T03:20:17.828180" elapsed="0.000222"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:20:17.830032" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:20:17.829286" elapsed="0.001872">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:17.828600" elapsed="0.002689"/>
</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-04-17T03:20:17.832233" elapsed="0.000367"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:17.831528" elapsed="0.001177"/>
</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-04-17T03:20:17.827489" elapsed="0.005274"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:17.827199" elapsed="0.005693"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:17.827175" elapsed="0.005822"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:20:17.834259" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:20:17.833804" elapsed="0.000492"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:20:17.834365" elapsed="0.000050"/>
</return>
<msg time="2026-04-17T03:20:17.834594" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:20:17.833326" elapsed="0.001304"/>
</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-04-17T03:20:17.834855" elapsed="0.000641"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:20:17.835947" level="INFO">index=20
host=10.30.170.120
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-04-17T03:20:17.836094" level="INFO">${karaf_connection_object} = index=20
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:20:17.835765" elapsed="0.000366"/>
</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-04-17T03:20:17.836344" elapsed="0.003236"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:20:17.840360" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:20:17.841682" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:20:17.839916" elapsed="0.002403">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:20:17.860265" elapsed="0.000454"/>
</kw>
<msg time="2026-04-17T03:20:17.860831" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:20:17.858735" elapsed="0.002479"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:17.861404" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:17.861587" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:20:17.843710" elapsed="0.017969"/>
</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-04-17T03:20:17.842804" elapsed="0.018931"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:20:17.823319" elapsed="0.038527">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:17.862408" elapsed="0.000036"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:20:17.862511" elapsed="0.000029"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:20:17.806101" elapsed="0.056571">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:20:17.862829" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:20:17.862892" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:17.799459" elapsed="0.063470"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:17.863421" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:17.863062" elapsed="0.000437"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:17.863034" elapsed="0.000502"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:20:17.799245" elapsed="0.064327"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:20:17.798994" elapsed="0.064627"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:20:17.796174" elapsed="0.067573"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:20:17.788795" elapsed="0.075119"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:17.788150" elapsed="0.075850"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:20:17.783634" elapsed="0.080447"/>
</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-04-17T03:20:17.864671" elapsed="0.000154"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:17.864279" elapsed="0.000629"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:20:17.878264" level="INFO">${start_cmd} = python3 bgp_app_peer.py --host 10.30.170.120 --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.120/tables=bgp-...</msg>
<var>${start_cmd}</var>
<arg>${command} ${tool_opt}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:17.877733" elapsed="0.000571"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:17.878904" level="INFO">python3 bgp_app_peer.py --host 10.30.170.120 --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.120/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-04-17T03:20:17.878532" elapsed="0.000468"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:20:17.887871" level="INFO">python3 bgp_app_peer.py --host 10.30.170.120 --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.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family &amp;&gt;/dev/null</msg>
<msg time="2026-04-17T03:20:17.888057" level="INFO">${output} =  python3 bgp_app_peer.py --host 10.30.170.120 --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.120/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-04-17T03:20:17.879226" elapsed="0.008873"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:17.888733" level="INFO"> python3 bgp_app_peer.py --host 10.30.170.120 --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.120/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-04-17T03:20:17.888352" elapsed="0.000454"/>
</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-04-17T03:20:17.877037" elapsed="0.011861"/>
</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-04-17T03:20:18.026690" level="INFO">[?2004l[?2004h[jenkins@releng-26932-188-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-04-17T03:20:17.895979" elapsed="0.130854"/>
</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-04-17T03:20:17.895139" elapsed="0.131770"/>
</kw>
<arg>${BGP_APP_PEER_TIMEOUT}</arg>
<doc>Wait ${timeout} for the tool exit.</doc>
<status status="PASS" start="2026-04-17T03:20:17.894566" elapsed="0.132452"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:20:18.037773" level="INFO">Executing command 'cat bgp_app_peer.log'.</msg>
<msg time="2026-04-17T03:20:18.050767" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:20:18.051041" level="INFO">${output_log} = 2026-04-17 03:20:17,981 INFO: Post 3 prefix(es) in a single request (starting from 8.0.1.0/28) into 10.30.170.120:8181/rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:20:18.037571" elapsed="0.013513"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:18.052182" level="INFO">2026-04-17 03:20:17,981 INFO: Post 3 prefix(es) in a single request (starting from 8.0.1.0/28) into 10.30.170.120:8181/rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:18.051543" elapsed="0.000716"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-04-17T03:20:18.053185" 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-04-17T03:20:18.052577" elapsed="0.000716"/>
</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-04-17T03:20:18.037109" elapsed="0.016309"/>
</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-04-17T03:20:18.054451" elapsed="0.000389"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-04-17T03:20:18.053879" elapsed="0.001083"/>
</kw>
<doc>Start BGP application peer tool and give it 30s</doc>
<tag>critical</tag>
<status status="PASS" start="2026-04-17T03:20:17.782827" elapsed="0.272196"/>
</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-04-17T03:20:18.060431" elapsed="0.000360"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:20:18.059984" elapsed="0.000907"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:20:18.062770" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:18.062532" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:18.062491" 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-04-17T03:20:18.070525" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:18.070361" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:18.070330" elapsed="0.000298"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:18.072075" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:20:18.071506" elapsed="0.000605"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:20:18.072753" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:20:18.072371" elapsed="0.000414"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:20:18.072840" elapsed="0.000048"/>
</return>
<msg time="2026-04-17T03:20:18.073067" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:20:18.071012" elapsed="0.002085"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:20:18.081460" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:18.081277" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:18.080148" elapsed="0.001416"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:20:18.083301" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:18.083169" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:18.083147" elapsed="0.000237"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:20:18.083992" level="INFO">${karaf_connection_index} = 20</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:20:18.083575" elapsed="0.000452"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:20:18.084539" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:20:18.084264" elapsed="0.000307"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:20:18.085588" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:20:18.085250" elapsed="0.001179">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:20:18.086657" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:20:18.086716" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:18.084786" elapsed="0.001960"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:20:18.087717" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:20:18.087414" elapsed="0.001191">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:20:18.088828" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:20:18.088884" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:18.086983" elapsed="0.001930"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:20:18.090379" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_Check_Example-IPv4-Topology_Is_Filled_With_3_Routes"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:20:18.089353" elapsed="0.001105">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_Check_Example-IPv4-Topology_Is_Filled_With_3_Routes"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:20:18.089053" elapsed="0.001496">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_Check_Example-IPv4-Topology_Is_Filled_With_3_Routes"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:20:18.089021" elapsed="0.001572">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_Check_Example-IPv4-Topology_Is_Filled_With_3_Routes"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:18.090806" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:18.091117" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:18.090912" elapsed="0.000271"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:18.090891" elapsed="0.000321"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:20:18.091256" elapsed="0.000022"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:20:18.094527" elapsed="0.000197"/>
</kw>
<msg time="2026-04-17T03:20:18.094813" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:20:18.093285" elapsed="0.001716"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:18.095342" elapsed="0.000088"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:18.095752" 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-04-17T03:20:18.092469" elapsed="0.003613"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:20:18.091716" 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="FAIL" start="2026-04-17T03:20:18.082747" elapsed="0.013577">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_Check_Example-IPv4-Topology_Is_Filled_With_3_Routes"</status>
</kw>
<msg time="2026-04-17T03:20:18.096461" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:20:18.096514" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_Check_Example-IPv4-Topology_Is_Filled_With_3_Routes"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:18.081829" elapsed="0.014715"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:20:18.096801" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:18.096651" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:18.096622" elapsed="0.000292"/>
</if>
<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-04-17T03:20:18.098039" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:18.097885" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:18.097863" elapsed="0.000259"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:20:18.098497" level="INFO">index=16
host=10.30.171.238
alias=bgp_app_peer_console
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-04-17T03:20:18.098630" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.238
alias=bgp_app_peer_console
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_error...</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:20:18.098329" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:18.099266" level="INFO">{1: 20}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:18.098867" elapsed="0.000453"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:18.099818" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:18.099513" elapsed="0.000358"/>
</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-04-17T03:20:18.100698" elapsed="0.000533"/>
</kw>
<msg time="2026-04-17T03:20:18.101349" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:20:18.101404" level="INFO">${old_connection_index} = 20</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:18.100189" elapsed="0.001243"/>
</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-04-17T03:20:18.102581" elapsed="0.000217"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:20:18.104031" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:20:18.103561" elapsed="0.001576">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:18.103060" elapsed="0.002182"/>
</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-04-17T03:20:18.105903" elapsed="0.000342"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:18.105423" elapsed="0.000912"/>
</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-04-17T03:20:18.101809" elapsed="0.004573"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:18.101523" elapsed="0.004909"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:18.101501" elapsed="0.004958"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:20:18.107384" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:20:18.107063" elapsed="0.000350"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:20:18.107548" elapsed="0.000045"/>
</return>
<msg time="2026-04-17T03:20:18.107770" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:20:18.106686" elapsed="0.001111"/>
</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-04-17T03:20:18.107977" elapsed="0.000524"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:20:18.110804" level="INFO">index=21
host=10.30.170.120
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-04-17T03:20:18.110958" level="INFO">${karaf_connection_object} = index=21
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:20:18.108684" elapsed="0.002305"/>
</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-04-17T03:20:18.111224" elapsed="0.002595"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:20:18.114374" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:20:18.115562" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:20:18.114093" elapsed="0.001921">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:20:18.130977" elapsed="0.000413"/>
</kw>
<msg time="2026-04-17T03:20:18.131491" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:20:18.129597" elapsed="0.002055"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:18.131820" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:18.132005" elapsed="0.000023"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:20:18.117222" elapsed="0.014875"/>
</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-04-17T03:20:18.116374" elapsed="0.015771"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:20:18.097498" elapsed="0.034739">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:18.132652" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:20:18.132733" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:20:18.079637" elapsed="0.053215">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:20:18.133178" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:20:18.133226" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:18.073590" elapsed="0.059661"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:18.133613" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:18.133338" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:18.133316" elapsed="0.000379"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:20:18.073401" elapsed="0.060320"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:20:18.073171" elapsed="0.060586"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:20:18.069771" elapsed="0.064046"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:20:18.061984" elapsed="0.071892"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:18.061150" elapsed="0.072773"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:20:18.056458" elapsed="0.077538"/>
</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-04-17T03:20:18.189385" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:18.188867" elapsed="0.000554"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:18.190512" 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-04-17T03:20:18.190003" elapsed="0.000613">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-04-17T03:20:18.190737" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:18.189605" elapsed="0.001161"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:18.191477" 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-04-17T03:20:18.191009" elapsed="0.000500"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:20:18.191895" 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-04-17T03:20:18.192125" 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-04-17T03:20:18.191717" elapsed="0.000439"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:18.192723" 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-04-17T03:20:18.192361" elapsed="0.000414"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:18.194226" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:18.193666" elapsed="0.000625"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:20:18.194835" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:20:18.194460" elapsed="0.000401"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:18.195299" elapsed="0.000048"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:18.196109" 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-04-17T03:20:18.196480" elapsed="0.000047"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:20:18.195107" elapsed="0.001547"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:20:18.194917" elapsed="0.001806"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:20:18.196776" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:20:18.196987" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:20:18.193277" elapsed="0.003737"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:18.192866" elapsed="0.004183"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:18.197239" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:18.197078" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:18.192838" elapsed="0.004479"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:20:18.198019" 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-04-17T03:20:18.197468" elapsed="0.000580"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:20:18.198099" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:20:18.187969" elapsed="0.010263"/>
</kw>
<msg time="2026-04-17T03:20:18.198294" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:20:18.174218" elapsed="0.024135"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:20:18.211748" elapsed="0.000064"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:20:18.224714" elapsed="0.000063"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:20:18.237269" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:18.237501" 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-04-17T03:20:18.237694" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:18.238123" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:18.237970" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:18.237950" 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-04-17T03:20:18.238349" 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-04-17T03:20:18.238517" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:18.238683" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:20:18.237896" elapsed="0.000839"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:20:18.237777" elapsed="0.000985"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:18.238908" elapsed="0.000033"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:18.239003" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:20:18.239161" 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-04-17T03:20:18.169484" elapsed="0.069706"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:18.240877" 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-04-17T03:20:18.240446" elapsed="0.000555">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-04-17T03:20:18.241109" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:18.239992" elapsed="0.001152"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:18.241540" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:18.241246" elapsed="0.000379"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:20:18.242183" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:18.241847" elapsed="0.000364"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:18.241652" elapsed="0.000669"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:18.241219" elapsed="0.001126"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:18.245324" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:20:18.242528" elapsed="0.002827"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:20:18.245417" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:20:18.245602" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:20:18.239538" elapsed="0.006091"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:18.247384" 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-04-17T03:20:18.246989" elapsed="0.000491">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-04-17T03:20:18.247604" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:18.246541" elapsed="0.001098"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:20:18.247986" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-04-17T03:20:18.247747" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:18.247715" elapsed="0.000379"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:18.248281" 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-04-17T03:20:18.248471" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:20:18.248586" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:20:18.250898" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:20:18.246094" elapsed="0.004853"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:18.252640" 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-04-17T03:20:18.252304" elapsed="0.000389"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:18.253126" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:18.252852" elapsed="0.000323"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:20:18.258899" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:18.460373" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:18.862570" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:18.864486" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:20:18.255877" elapsed="0.611165">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:20:18.253261" elapsed="0.613927">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:18.867552" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:18.867249" elapsed="0.000397"/>
</branch>
<status status="FAIL" start="2026-04-17T03:20:18.253238" elapsed="0.614441">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:18.868377" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:18.868565" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:18.868512" elapsed="0.000123"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:18.868488" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:18.868884" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:20:18.869005" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:20:18.251363" elapsed="0.617812">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:18.869291" elapsed="0.000026"/>
</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-04-17T03:20:18.146212" elapsed="0.723228">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:18.869798" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:18.869574" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:18.869551" elapsed="0.000418"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:18.870008" elapsed="0.000016"/>
</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="FAIL" start="2026-04-17T03:20:18.139658" elapsed="0.730459">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:20:18.135119" elapsed="0.735130">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:20:19.948322" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:19.947731" elapsed="0.000659"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:19.949600" 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-04-17T03:20:19.949110" elapsed="0.000588">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-04-17T03:20:19.949822" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:19.948627" elapsed="0.001227"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:19.950604" 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-04-17T03:20:19.950104" elapsed="0.000535"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:20:19.951051" 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-04-17T03:20:19.951322" 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-04-17T03:20:19.950850" elapsed="0.000507"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:19.951881" 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-04-17T03:20:19.951568" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:19.953447" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:19.952928" elapsed="0.000583"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:20:19.954071" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:20:19.953679" elapsed="0.000420"/>
</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-04-17T03:20:19.954531" elapsed="0.000056"/>
</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-04-17T03:20:19.956385" elapsed="0.000054"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:20:19.956746" elapsed="0.000047"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:20:19.954327" elapsed="0.002591"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:20:19.954154" elapsed="0.002850"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:20:19.957057" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:20:19.957242" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:20:19.952520" elapsed="0.004749"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:19.952112" elapsed="0.005190"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:19.957484" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:19.957329" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:19.952023" elapsed="0.005571"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:20:19.958265" 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-04-17T03:20:19.957748" elapsed="0.000547"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:20:19.958345" 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-04-17T03:20:19.946846" elapsed="0.011630"/>
</kw>
<msg time="2026-04-17T03:20:19.958533" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:20:19.932442" elapsed="0.026149"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:20:19.972468" elapsed="0.000063"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:20:19.989836" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:20:20.003123" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:20.003426" 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-04-17T03:20:20.003619" 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-04-17T03:20:20.004050" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:20.003880" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:20.003862" 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-04-17T03:20:20.004360" 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-04-17T03:20:20.004582" 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-04-17T03:20:20.004760" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:20:20.003824" elapsed="0.000991"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:20:20.003704" elapsed="0.001139"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:20.005011" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:20.005094" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:20:20.005253" 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-04-17T03:20:19.912069" elapsed="0.093213"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:20.006744" 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-04-17T03:20:20.006447" elapsed="0.000374">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-04-17T03:20:20.006921" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:20.006024" 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-04-17T03:20:20.007312" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:20.007039" elapsed="0.000335"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:20:20.007916" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:20.007592" elapsed="0.000368"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:20.007400" elapsed="0.000598"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:20.007019" elapsed="0.001001"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:20.010689" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:20:20.008199" elapsed="0.002528"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:20:20.010794" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:20:20.011029" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:20:20.005624" elapsed="0.005434"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:20.012460" 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-04-17T03:20:20.012208" elapsed="0.000319">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-04-17T03:20:20.012625" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:20.011802" elapsed="0.000849"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:20:20.012878" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-17T03:20:20.012727" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:20.012705" elapsed="0.000279"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:20.013136" 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-04-17T03:20:20.013513" elapsed="0.000023"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:20:20.013584" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:20:20.015673" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:20:20.011393" elapsed="0.004308"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:20.017305" 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-04-17T03:20:20.017015" elapsed="0.000375"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:20.017867" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:20.017585" elapsed="0.000330"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:20:20.023242" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:20.224838" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:20.627544" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:20.630005" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:20:20.020278" elapsed="0.612887">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:20:20.018003" elapsed="0.615336">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:20.633712" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:20.633401" elapsed="0.000407"/>
</branch>
<status status="FAIL" start="2026-04-17T03:20:20.017983" elapsed="0.615861">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:20.634504" elapsed="0.000040"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:20.634711" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:20.634653" elapsed="0.000130"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:20.634624" elapsed="0.000194"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:20.635055" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:20:20.635157" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:20:20.016078" elapsed="0.619244">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:20.635434" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:20:19.887807" elapsed="0.747777">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:20.636104" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:20.635820" elapsed="0.000388"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:20.635794" elapsed="0.000449"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:20.636289" elapsed="0.000022"/>
</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="FAIL" start="2026-04-17T03:20:19.880094" elapsed="0.756341">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:20:19.870983" elapsed="0.765600">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:20:21.694578" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:21.694161" elapsed="0.000453"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:21.695626" 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-04-17T03:20:21.695226" elapsed="0.000486">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-04-17T03:20:21.695835" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:21.694790" elapsed="0.001072"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:21.696488" 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-04-17T03:20:21.696085" elapsed="0.000431"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:20:21.696833" 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-04-17T03:20:21.697015" 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-04-17T03:20:21.696682" elapsed="0.000359"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:21.697460" 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-04-17T03:20:21.697205" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:21.698754" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:21.698286" elapsed="0.000532"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:20:21.699454" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:20:21.699000" elapsed="0.000483"/>
</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-04-17T03:20:21.699898" 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-04-17T03:20:21.700712" 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-04-17T03:20:21.701148" elapsed="0.000061"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:20:21.699704" elapsed="0.001630"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:20:21.699536" elapsed="0.001865"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:20:21.701451" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:20:21.701650" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:20:21.697900" elapsed="0.003776"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:21.697583" elapsed="0.004184"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:21.701981" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:21.701794" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:21.697559" elapsed="0.004504"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:20:21.702664" 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-04-17T03:20:21.702209" elapsed="0.000483"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:20:21.702742" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:20:21.693499" elapsed="0.009368"/>
</kw>
<msg time="2026-04-17T03:20:21.702955" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:20:21.680258" elapsed="0.022762"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:20:21.716686" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:20:21.729165" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:21.741522" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:21.741728" elapsed="0.000037"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:21.741964" 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-04-17T03:20:21.742357" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:21.742210" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:21.742195" 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-04-17T03:20:21.742575" 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-04-17T03:20:21.742751" 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-04-17T03:20:21.742921" elapsed="0.000035"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:20:21.742166" elapsed="0.000824"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:20:21.742061" elapsed="0.000954"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:21.743179" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:21.743255" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:20:21.743379" 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-04-17T03:20:21.675525" elapsed="0.067922"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:21.744780" 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-04-17T03:20:21.744521" elapsed="0.000331">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-04-17T03:20:21.744959" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:21.744165" elapsed="0.000819"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:21.745303" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:21.745055" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:20:21.745862" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:21.745568" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:21.745383" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:21.745037" elapsed="0.000923"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:21.748332" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:20:21.746110" elapsed="0.002249"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:20:21.748411" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:20:21.748577" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:20:21.743807" elapsed="0.004796"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:21.749824" 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-04-17T03:20:21.749593" elapsed="0.000295">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-04-17T03:20:21.749998" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:21.749257" elapsed="0.000766"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:20:21.750228" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:20:21.750093" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:21.750076" 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-04-17T03:20:21.750458" 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-04-17T03:20:21.750626" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:20:21.750690" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:20:21.752783" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:20:21.748911" elapsed="0.003898"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:21.754251" 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-04-17T03:20:21.753998" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:21.754688" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:21.754449" 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-04-17T03:20:21.759881" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:21.961426" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:22.364454" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:22.367132" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:20:21.757094" elapsed="0.613569">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:20:21.754795" elapsed="0.616046">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:22.371334" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:22.370919" elapsed="0.000519"/>
</branch>
<status status="FAIL" start="2026-04-17T03:20:21.754778" elapsed="0.616693">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:22.372349" elapsed="0.000052"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:22.372622" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:22.372548" elapsed="0.000163"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:22.372509" elapsed="0.000246"/>
</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-04-17T03:20:22.373047" elapsed="0.000045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:20:22.373185" elapsed="0.000030"/>
</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-04-17T03:20:21.753161" elapsed="0.620237">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:22.373552" 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-04-17T03:20:21.651658" elapsed="0.722054">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:22.374182" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:22.373880" elapsed="0.000405"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:22.373839" elapsed="0.000479"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:22.374363" elapsed="0.000020"/>
</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="FAIL" start="2026-04-17T03:20:21.644168" elapsed="0.730346">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:20:21.637184" elapsed="0.737476">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:20:23.440182" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:23.439691" elapsed="0.000527"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:23.441234" 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-04-17T03:20:23.440755" elapsed="0.000576">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-04-17T03:20:23.441434" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:23.440401" elapsed="0.001057"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:23.442251" 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-04-17T03:20:23.441726" elapsed="0.000553"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:20:23.442622" 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-04-17T03:20:23.442880" 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-04-17T03:20:23.442447" elapsed="0.000470"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:23.443532" 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-04-17T03:20:23.443170" elapsed="0.000426"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:23.445379" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:23.444714" elapsed="0.000752"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:20:23.446295" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:20:23.445749" elapsed="0.000583"/>
</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-04-17T03:20:23.446906" elapsed="0.000089"/>
</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-04-17T03:20:23.447978" elapsed="0.000073"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:20:23.448510" elapsed="0.000068"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:20:23.446633" elapsed="0.002118"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:20:23.446404" elapsed="0.002442"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:20:23.448915" elapsed="0.000075"/>
</return>
<msg time="2026-04-17T03:20:23.449231" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:20:23.444213" elapsed="0.005057"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:23.443705" elapsed="0.005647"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:23.449621" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:23.449404" elapsed="0.000345"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:23.443672" elapsed="0.006107"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:20:23.450691" 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-04-17T03:20:23.450004" elapsed="0.000727"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:20:23.450792" 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-04-17T03:20:23.438959" elapsed="0.011960"/>
</kw>
<msg time="2026-04-17T03:20:23.450993" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:20:23.424813" elapsed="0.026233"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:20:23.463844" elapsed="0.000097"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:20:23.476543" 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//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-04-17T03:20:23.489799" elapsed="0.000059"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:23.490160" 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-04-17T03:20:23.490378" 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-04-17T03:20:23.490817" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:23.490660" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:23.490641" 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-04-17T03:20:23.491063" 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-04-17T03:20:23.491232" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:23.491397" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:20:23.490600" elapsed="0.000850"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:20:23.490466" elapsed="0.001011"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:23.491625" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:23.491706" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:20:23.491866" 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-04-17T03:20:23.419609" elapsed="0.072286"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:23.493396" 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-04-17T03:20:23.493078" elapsed="0.000393">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-04-17T03:20:23.493567" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:23.492657" elapsed="0.000935"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:23.493999" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:23.493665" elapsed="0.000393"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:20:23.494572" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:23.494270" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:23.494082" elapsed="0.000619"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:23.493646" elapsed="0.001085"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:23.497134" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:20:23.494892" elapsed="0.002269"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:20:23.497212" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:20:23.497374" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:20:23.492294" elapsed="0.005105"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:23.498706" 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-04-17T03:20:23.498455" elapsed="0.000316">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-04-17T03:20:23.498868" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:23.498115" elapsed="0.000777"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:20:23.499118" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:20:23.498981" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:23.498962" elapsed="0.000241"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:23.499348" 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-04-17T03:20:23.499519" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:20:23.499585" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:20:23.504496" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:20:23.497711" elapsed="0.006853"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:23.506388" 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-04-17T03:20:23.506058" elapsed="0.000383"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:23.506903" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:23.506611" elapsed="0.000355"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:20:23.512297" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:23.713764" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:24.116325" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:24.118620" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:20:23.509229" elapsed="0.613218">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:20:23.507045" elapsed="0.615614">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:24.123096" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:24.122744" elapsed="0.000462"/>
</branch>
<status status="FAIL" start="2026-04-17T03:20:23.507021" elapsed="0.616234">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:24.123994" elapsed="0.000149"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:24.124333" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:24.124269" elapsed="0.000130"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:24.124240" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:24.124653" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:20:24.124766" elapsed="0.000024"/>
</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-04-17T03:20:23.505063" elapsed="0.619908">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:24.125092" elapsed="0.000026"/>
</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-04-17T03:20:23.393764" elapsed="0.731481">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:24.125665" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:24.125388" elapsed="0.000394"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:24.125362" elapsed="0.000456"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:24.125867" elapsed="0.000021"/>
</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="FAIL" start="2026-04-17T03:20:23.385469" elapsed="0.740706">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:20:23.375581" elapsed="0.750768">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:20:25.195424" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:25.194965" elapsed="0.000496"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:25.196581" 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-04-17T03:20:25.196056" elapsed="0.000619">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-04-17T03:20:25.196778" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:25.195644" elapsed="0.001160"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:25.197565" 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-04-17T03:20:25.197006" elapsed="0.000596"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:20:25.198246" 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-04-17T03:20:25.198469" 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-04-17T03:20:25.197831" elapsed="0.000733"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:25.199062" 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-04-17T03:20:25.198735" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:25.201142" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:25.200335" elapsed="0.000927"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:20:25.202319" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:20:25.201543" elapsed="0.000813"/>
</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-04-17T03:20:25.203018" elapsed="0.000066"/>
</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-04-17T03:20:25.204048" elapsed="0.000106"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:20:25.204635" elapsed="0.000088"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:20:25.202696" elapsed="0.002221"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:20:25.202436" elapsed="0.002602"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:20:25.205106" elapsed="0.000055"/>
</return>
<msg time="2026-04-17T03:20:25.205401" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:20:25.199750" elapsed="0.005687"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:25.199212" elapsed="0.006267"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:25.205735" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:25.205512" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:25.199178" elapsed="0.006651"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:20:25.206648" 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-04-17T03:20:25.206061" elapsed="0.000624"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:20:25.206749" 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/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-04-17T03:20:25.194111" elapsed="0.012806"/>
</kw>
<msg time="2026-04-17T03:20:25.207050" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:20:25.180363" elapsed="0.026756"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:20:25.222762" elapsed="0.000065"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:20:25.236230" elapsed="0.000043"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:20:25.252807" elapsed="0.000037"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:25.253180" 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-04-17T03:20:25.253428" 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-04-17T03:20:25.253895" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:25.253739" elapsed="0.000235"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:25.253720" elapsed="0.000281"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:25.254149" 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-04-17T03:20:25.254363" 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-04-17T03:20:25.254541" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:20:25.253681" elapsed="0.000916"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:20:25.253541" elapsed="0.001085"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:25.254822" elapsed="0.000032"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:25.254951" elapsed="0.000023"/>
</return>
<msg time="2026-04-17T03:20:25.255145" 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-04-17T03:20:25.175330" elapsed="0.079846"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:25.256996" 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-04-17T03:20:25.256537" elapsed="0.000590">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-04-17T03:20:25.257267" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:25.256082" elapsed="0.001216"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:25.257768" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:25.257397" elapsed="0.000467"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:20:25.258638" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:25.258207" elapsed="0.000484"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:25.257905" elapsed="0.000849"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:25.257369" elapsed="0.001424"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:25.261751" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:20:25.259061" elapsed="0.002728"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:20:25.261860" elapsed="0.000047"/>
</return>
<msg time="2026-04-17T03:20:25.262211" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:20:25.255591" elapsed="0.006660"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:25.263891" 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-04-17T03:20:25.263576" elapsed="0.000510">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-04-17T03:20:25.264223" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:25.263129" elapsed="0.001124"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:20:25.264524" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-04-17T03:20:25.264354" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:25.264328" elapsed="0.000296"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:25.264808" 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-04-17T03:20:25.265147" elapsed="0.000030"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:20:25.265233" elapsed="0.000021"/>
</return>
<msg time="2026-04-17T03:20:25.267916" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:20:25.262660" elapsed="0.005324"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:25.270062" 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-04-17T03:20:25.269576" elapsed="0.000572"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:25.270843" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:25.270419" elapsed="0.000502"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:20:25.278642" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:25.480646" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:25.883187" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:25.885212" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:20:25.274576" elapsed="0.615901">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:20:25.271088" elapsed="0.619568">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:25.891054" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:25.890720" elapsed="0.000477"/>
</branch>
<status status="FAIL" start="2026-04-17T03:20:25.271052" elapsed="0.620193">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:25.891997" elapsed="0.000043"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:25.892206" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:25.892150" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:25.892122" elapsed="0.000177"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:25.892508" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:20:25.892607" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:20:25.268426" elapsed="0.624396">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:25.892961" 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-04-17T03:20:25.145103" elapsed="0.748004">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:25.893573" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:25.893311" elapsed="0.000366"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:25.893286" elapsed="0.000425"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:25.893757" elapsed="0.000020"/>
</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="FAIL" start="2026-04-17T03:20:25.137470" elapsed="0.756430">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:20:25.127397" elapsed="0.766671">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:20:26.955277" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:26.954819" elapsed="0.000493"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:26.956364" 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-04-17T03:20:26.955915" elapsed="0.000528">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-04-17T03:20:26.956562" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:26.955498" elapsed="0.001100"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:26.957261" 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-04-17T03:20:26.956808" elapsed="0.000482"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:20:26.957607" 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-04-17T03:20:26.957775" 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-04-17T03:20:26.957458" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:26.958261" 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-04-17T03:20:26.958000" 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-04-17T03:20:26.959756" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:26.959254" elapsed="0.000568"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:20:26.960376" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:20:26.960009" 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-04-17T03:20:26.960806" 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-04-17T03:20:26.961623" elapsed="0.000058"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:20:26.962047" elapsed="0.000048"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:20:26.960617" elapsed="0.001602"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:20:26.960454" elapsed="0.001833"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:20:26.962364" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:20:26.962554" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:20:26.958806" elapsed="0.003779"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:26.958389" elapsed="0.004300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:26.962961" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:26.962736" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:26.958364" elapsed="0.004703"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:20:26.963703" 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-04-17T03:20:26.963223" elapsed="0.000517"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:20:26.963798" 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//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-04-17T03:20:26.954056" elapsed="0.009931"/>
</kw>
<msg time="2026-04-17T03:20:26.964050" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:20:26.939649" elapsed="0.024455"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:20:26.977713" 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/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-04-17T03:20:26.991506" elapsed="0.000063"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:20:27.005439" elapsed="0.000072"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:27.005838" elapsed="0.000035"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:27.006147" 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-04-17T03:20:27.006764" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:27.006534" elapsed="0.000305"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:27.006506" 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-04-17T03:20:27.007113" 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-04-17T03:20:27.007366" 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-04-17T03:20:27.007569" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:20:27.006452" elapsed="0.001174"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:20:27.006269" elapsed="0.001386"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:27.007833" elapsed="0.000028"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:27.007925" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:20:27.008119" 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-04-17T03:20:26.934771" elapsed="0.073448"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:27.009788" 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-04-17T03:20:27.009461" elapsed="0.000404">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-04-17T03:20:27.010041" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:27.009051" 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-04-17T03:20:27.010422" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:27.010153" elapsed="0.000326"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:20:27.011015" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:27.010691" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:27.010505" elapsed="0.000572"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:27.010133" elapsed="0.000965"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:27.013705" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:20:27.011251" elapsed="0.002482"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:20:27.013793" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:20:27.014066" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:20:27.008608" elapsed="0.005497"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:27.015574" 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-04-17T03:20:27.015231" elapsed="0.000435">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-04-17T03:20:27.015797" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:27.014858" elapsed="0.000974"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:20:27.016151" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-04-17T03:20:27.015955" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:27.015909" elapsed="0.000366"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:27.016481" 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-04-17T03:20:27.016720" elapsed="0.000028"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:20:27.016810" elapsed="0.000023"/>
</return>
<msg time="2026-04-17T03:20:27.020103" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:20:27.014494" elapsed="0.005659"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:27.022993" 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-04-17T03:20:27.022490" elapsed="0.000571"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:27.023608" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:27.023277" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:20:27.029215" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:27.231058" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:27.634264" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:27.644273" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:20:27.026217" elapsed="0.623616">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:20:27.023765" elapsed="0.626459">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:27.651011" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:27.650375" elapsed="0.000766"/>
</branch>
<status status="FAIL" start="2026-04-17T03:20:27.023737" elapsed="0.627441">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:27.651976" elapsed="0.000046"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:27.652235" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:27.652168" elapsed="0.000140"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:27.652132" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:27.652565" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:20:27.652664" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:20:27.020766" elapsed="0.632090">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:27.652997" elapsed="0.000026"/>
</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-04-17T03:20:26.910244" elapsed="0.742945">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:27.653666" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:27.653336" elapsed="0.000441"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:27.653309" elapsed="0.000503"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:27.653857" elapsed="0.000021"/>
</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="FAIL" start="2026-04-17T03:20:26.901741" elapsed="0.752296">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:20:26.894649" elapsed="0.759570">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:20:28.725959" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:28.725348" elapsed="0.000659"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:28.727242" 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-04-17T03:20:28.726701" elapsed="0.000622">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-04-17T03:20:28.727421" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:28.726247" elapsed="0.001199"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:28.728211" 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-04-17T03:20:28.727654" elapsed="0.000595"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:20:28.728648" 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-04-17T03:20:28.728857" 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-04-17T03:20:28.728463" elapsed="0.000427"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:28.729473" 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-04-17T03:20:28.729134" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:28.730971" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:28.730474" elapsed="0.000564"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:20:28.731653" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:20:28.731204" elapsed="0.000549"/>
</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-04-17T03:20:28.732380" elapsed="0.000060"/>
</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-04-17T03:20:28.733355" elapsed="0.000071"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:20:28.733850" elapsed="0.000068"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:20:28.732067" elapsed="0.002044"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:20:28.731829" elapsed="0.002383"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:20:28.734289" elapsed="0.000062"/>
</return>
<msg time="2026-04-17T03:20:28.734551" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:20:28.730054" elapsed="0.004533"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:28.729641" elapsed="0.004994"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:28.734898" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:28.734678" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:28.729609" elapsed="0.005414"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:20:28.735974" 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-04-17T03:20:28.735238" elapsed="0.000778"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:20:28.736084" 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//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-04-17T03:20:28.724252" elapsed="0.012008"/>
</kw>
<msg time="2026-04-17T03:20:28.736340" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:20:28.707608" elapsed="0.028818"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:20:28.750871" elapsed="0.000178"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:20:28.764101" elapsed="0.000067"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:20:28.776935" elapsed="0.000062"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:28.777268" 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-04-17T03:20:28.777512" 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-04-17T03:20:28.777973" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:28.777801" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:28.777783" 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-04-17T03:20:28.778202" 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-04-17T03:20:28.778369" 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-04-17T03:20:28.778536" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:20:28.777744" elapsed="0.000845"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:20:28.777608" elapsed="0.001008"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:28.778761" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:28.778840" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:20:28.779012" 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-04-17T03:20:28.701019" elapsed="0.078022"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:28.780574" 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-04-17T03:20:28.780224" elapsed="0.000428">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-04-17T03:20:28.780749" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:28.779801" 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-04-17T03:20:28.781277" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:28.780846" elapsed="0.000526"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:20:28.781965" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:28.781593" elapsed="0.000401"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:28.781401" elapsed="0.000728"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:28.780828" elapsed="0.001328"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:28.784618" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:20:28.782315" elapsed="0.002341"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:20:28.784726" elapsed="0.000047"/>
</return>
<msg time="2026-04-17T03:20:28.784910" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:20:28.779409" elapsed="0.005552"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:28.786253" 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-04-17T03:20:28.786009" elapsed="0.000311">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-04-17T03:20:28.786414" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:28.785647" elapsed="0.000791"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:20:28.786651" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:20:28.786513" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:28.786490" elapsed="0.000246"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:28.786882" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:28.787072" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:20:28.787138" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:20:28.789274" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:20:28.785310" elapsed="0.004011"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:28.790984" 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-04-17T03:20:28.790668" elapsed="0.000382"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:28.791563" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:28.791237" 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-04-17T03:20:28.796784" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:28.998586" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:29.401144" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:29.403127" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:20:28.793830" elapsed="0.612324">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:20:28.791689" elapsed="0.614617">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:29.406649" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:29.406360" elapsed="0.000375"/>
</branch>
<status status="FAIL" start="2026-04-17T03:20:28.791670" elapsed="0.615094">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:29.407541" elapsed="0.000108"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:29.407796" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:29.407745" elapsed="0.000106"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:29.407722" elapsed="0.000155"/>
</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-04-17T03:20:29.408077" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:20:29.408213" 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-04-17T03:20:28.789667" elapsed="0.618694">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:29.408457" 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-04-17T03:20:28.672353" elapsed="0.736225">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:29.408952" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:29.408690" elapsed="0.000378"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:29.408670" elapsed="0.000442"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:29.409173" 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="FAIL" start="2026-04-17T03:20:28.663979" elapsed="0.745391">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:20:28.654796" elapsed="0.754781">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:20:29.409773" level="FAIL">Keyword 'Compare_Topology' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-17T03:20:18.134508" elapsed="11.275497">Keyword 'Compare_Topology' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>filled_topology</arg>
<doc>Wait until Compare_Topology matches expected result.</doc>
<status status="FAIL" start="2026-04-17T03:20:18.134145" elapsed="11.276081">Keyword 'Compare_Topology' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:29.413263" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:20:29.412688" elapsed="0.000639"/>
</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-04-17T03:20:29.411599" elapsed="0.001800"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-04-17T03:20:29.410891" elapsed="0.002601"/>
</kw>
<doc>See new routes in example-ipv4-topology as a proof that synchronization was correct.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:20:18.055348" elapsed="11.358205">Keyword 'Compare_Topology' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:20:29.418618" elapsed="0.000364"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:20:29.418226" elapsed="0.000845"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:20:29.420617" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:29.420438" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:29.420407" elapsed="0.000312"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:20:29.427674" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:29.427518" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:29.427494" elapsed="0.000274"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:29.429359" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:20:29.428719" elapsed="0.000679"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:20:29.430077" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:20:29.429628" elapsed="0.000485"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:20:29.430177" elapsed="0.000054"/>
</return>
<msg time="2026-04-17T03:20:29.430410" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:20:29.428179" elapsed="0.002266"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:20:29.438340" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:29.438167" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:29.438131" elapsed="0.000309"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:20:29.440060" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:29.439912" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:29.439893" elapsed="0.000239"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:20:29.440659" level="INFO">${karaf_connection_index} = 21</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:20:29.440314" elapsed="0.000373"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:20:29.441137" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:20:29.440879" elapsed="0.000284"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:20:29.442230" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:20:29.441733" elapsed="0.001272">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:20:29.443203" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:20:29.443251" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:29.441345" elapsed="0.001929"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:20:29.444095" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:20:29.443804" elapsed="0.001116">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:20:29.445166" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:20:29.445218" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:29.443450" elapsed="0.001793"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:20:29.446254" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_Connect_BGP_Peer"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:20:29.445587" elapsed="0.000731">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_Connect_BGP_Peer"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:20:29.445328" elapsed="0.001063">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_Connect_BGP_Peer"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:20:29.445306" elapsed="0.001119">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_Connect_BGP_Peer"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:29.446669" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:29.446901" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:29.446760" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:29.446742" elapsed="0.000259"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:20:29.447038" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:20:29.449706" elapsed="0.000151"/>
</kw>
<msg time="2026-04-17T03:20:29.449925" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:20:29.448643" elapsed="0.001442"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:29.450370" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:29.450711" 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-04-17T03:20:29.447941" elapsed="0.002961"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:20:29.447345" 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="FAIL" start="2026-04-17T03:20:29.439549" elapsed="0.011524">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_Connect_BGP_Peer"</status>
</kw>
<msg time="2026-04-17T03:20:29.451179" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:20:29.451223" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_Connect_BGP_Peer"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:29.438681" elapsed="0.012566"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:20:29.451435" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:29.451323" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:29.451304" elapsed="0.000196"/>
</if>
<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-04-17T03:20:29.452406" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:29.452292" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:29.452273" elapsed="0.000199"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:20:29.452763" level="INFO">index=16
host=10.30.171.238
alias=bgp_app_peer_console
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-04-17T03:20:29.452870" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.238
alias=bgp_app_peer_console
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_error...</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:20:29.452633" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:29.453444" level="INFO">{1: 21}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:29.453170" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:29.453909" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:29.453642" elapsed="0.000337"/>
</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-04-17T03:20:29.454670" elapsed="0.000376"/>
</kw>
<msg time="2026-04-17T03:20:29.455179" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:20:29.455242" level="INFO">${old_connection_index} = 21</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:29.454145" elapsed="0.001122"/>
</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-04-17T03:20:29.456204" elapsed="0.000224"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:20:29.460258" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:20:29.459706" elapsed="0.001586">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:29.456624" elapsed="0.004777"/>
</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-04-17T03:20:29.462096" elapsed="0.000287"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:29.461586" elapsed="0.000882"/>
</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-04-17T03:20:29.455589" elapsed="0.006926"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:29.455348" elapsed="0.007275"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:29.455329" elapsed="0.007327"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:20:29.463605" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:20:29.463283" elapsed="0.000350"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:20:29.463684" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:20:29.463848" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:20:29.462909" elapsed="0.000964"/>
</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-04-17T03:20:29.464053" elapsed="0.000465"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:20:29.464827" level="INFO">index=22
host=10.30.170.120
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-04-17T03:20:29.464964" level="INFO">${karaf_connection_object} = index=22
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:20:29.464695" elapsed="0.000298"/>
</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-04-17T03:20:29.465147" elapsed="0.002321"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:20:29.467966" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:20:29.469380" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:20:29.467641" elapsed="0.002181">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:20:29.484423" elapsed="0.000444"/>
</kw>
<msg time="2026-04-17T03:20:29.485344" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:20:29.482966" elapsed="0.002547"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:29.485687" elapsed="0.000039"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:29.485883" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:20:29.470877" elapsed="0.015114"/>
</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-04-17T03:20:29.470224" elapsed="0.015818"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:20:29.451918" elapsed="0.034220">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:29.486544" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:20:29.486625" elapsed="0.000023"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:20:29.437550" elapsed="0.049205">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:20:29.486877" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:20:29.486921" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:29.430991" elapsed="0.056411"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:29.487789" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:29.487492" elapsed="0.000354"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:29.487470" elapsed="0.000402"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:20:29.430768" elapsed="0.057129"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:20:29.430523" elapsed="0.057428"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:20:29.427015" elapsed="0.061002"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:20:29.419943" elapsed="0.068133"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:29.419288" elapsed="0.069038"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:20:29.414553" elapsed="0.073835"/>
</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-04-17T03:20:29.488859" elapsed="0.000141"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:29.488539" elapsed="0.000518"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:20:29.498417" level="INFO">${start_cmd} = python3 play.py --amount 0 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --peerport=1790 --debug </msg>
<var>${start_cmd}</var>
<arg>${command} ${tool_opt}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:29.498017" elapsed="0.000435"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:29.498903" level="INFO">python3 play.py --amount 0 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --peerport=1790 --debug </msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:29.498634" elapsed="0.000333"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:20:29.514716" level="INFO">python3 play.py --amount 0 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --peerport=1790 --debug  [A[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[K</msg>
<msg time="2026-04-17T03:20:29.515111" level="INFO">${output} =  python3 play.py --amount 0 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --peerport=1790 --debug  [A[C[C[C[C[C[C[C...</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-17T03:20:29.499125" elapsed="0.016043"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:29.516030" level="INFO"> python3 play.py --amount 0 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --peerport=1790 --debug  [A[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[K 
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:29.515507" elapsed="0.000980"/>
</kw>
<arg>${BGP_PEER_COMMAND}</arg>
<arg>${BGP_PEER_OPTIONS}</arg>
<doc>Start the tool ${command} ${tool_opt}</doc>
<status status="PASS" start="2026-04-17T03:20:29.497471" elapsed="0.019123"/>
</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-04-17T03:20:39.520004" level="FAIL">No match found for '&gt;' in 10 seconds
Output:
[?2004l2026-04-17 03:20:29,585 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:20:29,585 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.238
2026-04-17 03:20:29,585 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-04-17 03:20:29,585 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.120
2026-04-17 03:20:29,585 DEBUG BGP-Thread-1 (job): Remote port: 1790
Exception in thread Thread-1 (job):
Traceback (most recent call last):
  File "/usr/lib/python3.10/threading.py", line 1016, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.10/threading.py", line 953, in run
    self._target(*self._args, **self._kwargs)
  File "/home/jenkins/play.py", line 2406, in job
    bgp_socket = establish_connection(arguments)
  File "/home/jenkins/play.py", line 284, in establish_connection
    talking_socket.connect((str(arguments.peerip), arguments.peerport))
ConnectionRefusedError: [Errno 111] Connection refused
.</msg>
<var>${text}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="FAIL" start="2026-04-17T03:20:29.519244" elapsed="10.001648">No match found for '&gt;' in 10 seconds
Output:
[?2004l2026-04-17 03:20:29,585 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:20:29,585 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.238
2026-04-17 03:20:29,585 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-04-17 03:20:29,585 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.120
2026-04-17 03:20:29,585 DEBUG BGP-Thread-1 (job): Remote port: 1790
Exception in thread Thread-1 (job):
Traceback (most recent call last):
  File "/usr/lib/python3.10/threading.py", line 1016, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.10/threading.py", line 953, in run
    self._target(*self._args, **self._kwargs)
  File "/home/jenkins/play.py", line 2406, in job
    bgp_socket = establish_connection(arguments)
  File "/home/jenkins/play.py", line 284, in establish_connection
    talking_socket.connect((str(arguments.peerip), arguments.peerport))
ConnectionRefusedError: [Errno 111] Connection refused
.</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-04-17T03:20:39.521274" elapsed="0.000041"/>
</kw>
<doc>Log text gathered by SSHLibrary.Read_Until_Prompt.
This needs to be a separate keyword just because how Read_And_Fail_If_Prompt_Is_Seen is implemented.</doc>
<status status="FAIL" start="2026-04-17T03:20:29.518780" elapsed="10.002770">No match found for '&gt;' in 10 seconds
Output:
[?2004l2026-04-17 03:20:29,585 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:20:29,585 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.238
2026-04-17 03:20:29,585 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-04-17 03:20:29,585 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.120
2026-04-17 03:20:29,585 DEBUG BGP-Thread-1 (job): Remote port: 1790
Exception in thread Thread-1 (job):
Traceback (most recent call last):
  File "/usr/lib/python3.10/threading.py", line 1016, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.10/threading.py", line 953, in run
    self._target(*self._args, **self._kwargs)
  File "/home/jenkins/play.py", line 2406, in job
    bgp_socket = establish_connection(arguments)
  File "/home/jenkins/play.py", line 284, in establish_connection
    talking_socket.connect((str(arguments.peerip), arguments.peerport))
ConnectionRefusedError: [Errno 111] Connection refused
.</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-04-17T03:20:29.518133" elapsed="10.003760"/>
</kw>
<msg time="2026-04-17T03:20:39.522047" 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-04-17T03:20:29.517529" elapsed="10.004545"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-04-17T03:20:39.522284" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-17T03:20:39.522182" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:39.522152" elapsed="0.000320"/>
</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-04-17T03:20:39.522726" elapsed="0.000031"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was seen but it was not expected yet</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:39.522918" elapsed="0.000038"/>
</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-04-17T03:20:29.517050" elapsed="10.005970"/>
</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-04-17T03:20:39.523696" elapsed="0.000341"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-04-17T03:20:39.523318" elapsed="0.000786"/>
</kw>
<doc>Start BGP peer tool</doc>
<tag>critical</tag>
<status status="PASS" start="2026-04-17T03:20:29.413946" elapsed="10.110197"/>
</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-04-17T03:20:39.527800" elapsed="0.000255"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:20:39.527527" elapsed="0.000584"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:20:39.529193" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:39.529060" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:39.529039" 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-04-17T03:20:39.536992" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:39.536803" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:39.536776" elapsed="0.000320"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:39.538586" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:20:39.538094" elapsed="0.000520"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:20:39.539099" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:20:39.538777" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:20:39.539187" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:20:39.539386" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:20:39.537494" elapsed="0.001918"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:20:39.545088" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:39.544977" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:39.544957" 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-04-17T03:20:39.546432" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:39.546318" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:39.546301" elapsed="0.000199"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:20:39.546977" level="INFO">${karaf_connection_index} = 22</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:20:39.546654" elapsed="0.000350"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:20:39.547385" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:20:39.547167" elapsed="0.000244"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:20:39.548215" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:20:39.547943" elapsed="0.001136">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:20:39.549271" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:20:39.549318" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:39.547570" elapsed="0.001771"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:20:39.550178" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:20:39.549915" elapsed="0.000955">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:20:39.551078" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:20:39.551123" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:39.549568" elapsed="0.001578"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:20:39.552204" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_BGP_Peer_Check_Incomming_Updates_For_3_Introduced_Prefixes"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:20:39.551541" elapsed="0.000736">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_BGP_Peer_Check_Incomming_Updates_For_3_Introduced_Prefixes"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:20:39.551282" elapsed="0.001068">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_BGP_Peer_Check_Incomming_Updates_For_3_Introduced_Prefixes"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:20:39.551262" elapsed="0.001123">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_BGP_Peer_Check_Incomming_Updates_For_3_Introduced_Prefixes"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:39.552551" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:39.552782" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:39.552639" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:39.552622" elapsed="0.000236"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:20:39.552891" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:20:39.555477" elapsed="0.000146"/>
</kw>
<msg time="2026-04-17T03:20:39.555698" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:20:39.554431" 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-04-17T03:20:39.556132" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:39.556513" 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-04-17T03:20:39.553784" 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-04-17T03:20:39.553197" 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="FAIL" start="2026-04-17T03:20:39.546014" elapsed="0.010853">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_BGP_Peer_Check_Incomming_Updates_For_3_Introduced_Prefixes"</status>
</kw>
<msg time="2026-04-17T03:20:39.557005" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:20:39.557052" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_BGP_Peer_Check_Incomming_Updates_For_3_Introduced_Prefixes"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:39.545313" elapsed="0.011763"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:20:39.557264" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:39.557154" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:39.557135" elapsed="0.000208"/>
</if>
<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-04-17T03:20:39.558229" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:39.558121" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:39.558103" elapsed="0.000193"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:20:39.558613" level="INFO">index=15
host=10.30.171.238
alias=bgp_peer_console
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-04-17T03:20:39.558725" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=bgp_peer_console
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=st...</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:20:39.558458" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:39.559197" level="INFO">{1: 22}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:39.558909" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:39.559642" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:39.559396" elapsed="0.000290"/>
</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-04-17T03:20:39.560246" elapsed="0.000271"/>
</kw>
<msg time="2026-04-17T03:20:39.560616" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:20:39.560663" level="INFO">${old_connection_index} = 22</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:39.559846" elapsed="0.000840"/>
</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-04-17T03:20:39.561621" elapsed="0.000242"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:20:39.562978" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:20:39.562541" elapsed="0.001537">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:39.562050" elapsed="0.002133"/>
</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-04-17T03:20:39.564886" elapsed="0.000393"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:39.564394" elapsed="0.000971"/>
</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-04-17T03:20:39.561063" elapsed="0.004348"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:39.560763" elapsed="0.004725"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:39.560743" elapsed="0.004772"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:20:39.566389" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:20:39.566076" elapsed="0.000341"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:20:39.566464" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:20:39.566637" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:20:39.565728" elapsed="0.000935"/>
</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-04-17T03:20:39.566821" elapsed="0.000484"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:20:39.567594" level="INFO">index=23
host=10.30.170.120
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-04-17T03:20:39.567696" level="INFO">${karaf_connection_object} = index=23
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:20:39.567483" elapsed="0.000241"/>
</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-04-17T03:20:39.567874" elapsed="0.002668"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:20:39.571138" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:20:39.572475" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:20:39.570768" elapsed="0.002252">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:20:39.590152" elapsed="0.000430"/>
</kw>
<msg time="2026-04-17T03:20:39.590690" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:20:39.588746" elapsed="0.002105"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:39.591034" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:39.591206" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:20:39.574179" elapsed="0.017113"/>
</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-04-17T03:20:39.573420" elapsed="0.017919"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:20:39.557801" elapsed="0.033627">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:39.591820" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:20:39.591898" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:20:39.544617" elapsed="0.047477">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:20:39.592213" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:20:39.592258" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:39.539854" elapsed="0.052429"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:39.592707" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:39.592435" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:39.592413" elapsed="0.000374"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:20:39.539684" elapsed="0.053128"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:20:39.539480" elapsed="0.053367"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:20:39.536244" elapsed="0.056665"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:20:39.528727" elapsed="0.064261"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:39.528268" elapsed="0.064770"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:20:39.524964" elapsed="0.068130"/>
</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-04-17T03:20:39.593590" elapsed="0.000124"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:39.593240" elapsed="0.000532"/>
</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-04-17T03:20:39.606987" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:20:39.620374" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:20:39.620530" 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-04-17T03:20:39.606792" elapsed="0.013772"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:39.621229" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:39.620807" elapsed="0.000489"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:20:39.622709" 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-04-17T03:20:39.621719" elapsed="0.001157">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-04-17T03:20:39.606392" elapsed="0.016776">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:20:40.642605" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:20:40.656021" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:20:40.656291" 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-04-17T03:20:40.642370" elapsed="0.013969"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:40.657170" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:40.656666" elapsed="0.000573"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:20:40.658088" 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-04-17T03:20:40.657461" elapsed="0.000741">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-04-17T03:20:40.641758" elapsed="0.016615">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:20:41.678758" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:20:41.691847" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:20:41.692063" 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-04-17T03:20:41.678438" elapsed="0.013664"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:41.692826" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:41.692391" elapsed="0.000499"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:20:41.693706" 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-04-17T03:20:41.693127" elapsed="0.000680">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-04-17T03:20:41.677865" elapsed="0.016124">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:20:42.713600" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:20:42.735885" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:20:42.736225" 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-04-17T03:20:42.713388" elapsed="0.022898"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:42.737544" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:42.736773" elapsed="0.000881"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:20:42.739076" 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-04-17T03:20:42.738057" elapsed="0.001353">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-04-17T03:20:42.712787" elapsed="0.027083">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:20:43.755126" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:20:43.778578" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:20:43.778822" 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-04-17T03:20:43.754906" elapsed="0.023973"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:43.780151" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:43.779397" elapsed="0.000860"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:20:43.781450" 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-04-17T03:20:43.780602" elapsed="0.001000">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-04-17T03:20:43.754379" elapsed="0.027467">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:20:44.801249" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:20:44.814356" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:20:44.814620" 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-04-17T03:20:44.801003" elapsed="0.013674"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:44.816009" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:44.815202" elapsed="0.000921"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:20:44.817472" 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-04-17T03:20:44.816538" elapsed="0.001100">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-04-17T03:20:44.800203" elapsed="0.017693">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:20:45.837856" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:20:45.852079" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:20:45.852562" 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-04-17T03:20:45.837613" elapsed="0.015016"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:45.854285" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:45.853393" elapsed="0.001012"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:20:45.855803" 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-04-17T03:20:45.854802" elapsed="0.001247">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-04-17T03:20:45.836845" elapsed="0.019609">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:20:46.873562" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:20:46.886759" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:20:46.887115" 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-04-17T03:20:46.873298" elapsed="0.013890"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:46.888394" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:46.887613" elapsed="0.000910"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:20:46.890316" 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-04-17T03:20:46.889167" elapsed="0.001325">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-04-17T03:20:46.872535" elapsed="0.018288">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:20:47.910808" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:20:47.923600" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:20:47.923753" 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-04-17T03:20:47.910538" elapsed="0.013244"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:47.924693" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:47.924091" elapsed="0.000738"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:20:47.926538" 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-04-17T03:20:47.925338" elapsed="0.001413">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-04-17T03:20:47.909880" elapsed="0.017218">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:20:48.947193" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:20:48.959984" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:20:48.960528" 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-04-17T03:20:48.946909" elapsed="0.013683"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:48.961890" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:48.961116" elapsed="0.000920"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:20:48.963114" 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-04-17T03:20:48.962462" elapsed="0.000766">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-04-17T03:20:48.945910" elapsed="0.017493">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:20:49.981854" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:20:49.994772" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:20:49.995079" 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-04-17T03:20:49.981614" elapsed="0.013526"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:49.996280" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:49.995537" elapsed="0.000846"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:20:49.997605" 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-04-17T03:20:49.996729" elapsed="0.001042">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-04-17T03:20:49.980975" elapsed="0.017081">0 != 3</status>
</kw>
<msg time="2026-04-17T03:20:49.998273" 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-04-17T03:20:39.593943" elapsed="10.404542">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-04-17T03:20:50.013570" elapsed="0.000064"/>
</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-04-17T03:20:50.025437" elapsed="0.000037"/>
</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-04-17T03:20:50.037130" elapsed="0.000031"/>
</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-04-17T03:20:50.048564" elapsed="0.000030"/>
</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-04-17T03:20:50.050443" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:20:50.050066" elapsed="0.000432"/>
</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-04-17T03:20:50.049476" elapsed="0.001076"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-04-17T03:20:50.049058" elapsed="0.001558"/>
</kw>
<doc>Check incomming updates for new routes</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:20:39.524377" elapsed="10.526284">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-04-17T03:20:50.054218" elapsed="0.000232"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:20:50.053937" elapsed="0.000568"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:20:50.055789" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:50.055563" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:50.055529" elapsed="0.000381"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:20:50.061095" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:50.060959" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:50.060938" elapsed="0.000230"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:50.062316" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:20:50.061877" elapsed="0.000468"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:20:50.062812" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:20:50.062509" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:20:50.062883" elapsed="0.000204"/>
</return>
<msg time="2026-04-17T03:20:50.063241" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:20:50.061489" elapsed="0.001778"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:20:50.069331" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:50.069219" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:50.069198" 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-04-17T03:20:50.070659" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:50.070549" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:50.070531" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:20:50.071284" level="INFO">${karaf_connection_index} = 23</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:20:50.070884" elapsed="0.000427"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:20:50.071715" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:20:50.071479" elapsed="0.000261"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:20:50.072605" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:20:50.072278" elapsed="0.001143">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:20:50.073620" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:20:50.073667" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:50.071905" elapsed="0.001785"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:20:50.074488" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:20:50.074226" elapsed="0.001012">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:20:50.075431" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:20:50.075476" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:50.073860" elapsed="0.001640"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:20:50.076506" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_BGP_Application_Peer_Delete_3_Initial_Routes"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:20:50.075840" elapsed="0.000731">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_BGP_Application_Peer_Delete_3_Initial_Routes"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:20:50.075578" elapsed="0.001064">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_BGP_Application_Peer_Delete_3_Initial_Routes"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:20:50.075556" elapsed="0.001121">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_BGP_Application_Peer_Delete_3_Initial_Routes"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:50.076844" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:50.077091" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:50.076946" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:50.076913" elapsed="0.000284"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:20:50.077238" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:20:50.080169" elapsed="0.000165"/>
</kw>
<msg time="2026-04-17T03:20:50.080415" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:20:50.078751" elapsed="0.001796"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:50.080825" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:50.081194" 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-04-17T03:20:50.078116" elapsed="0.003276"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:20:50.077550" elapsed="0.003907"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:20:50.070239" elapsed="0.011307">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_BGP_Application_Peer_Delete_3_Initial_Routes"</status>
</kw>
<msg time="2026-04-17T03:20:50.081704" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:20:50.081749" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_BGP_Application_Peer_Delete_3_Initial_Routes"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:50.069556" elapsed="0.012218"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:20:50.082112" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:50.081851" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:50.081833" elapsed="0.000348"/>
</if>
<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-04-17T03:20:50.083239" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:50.083131" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:50.083113" elapsed="0.000194"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:20:50.083614" level="INFO">index=15
host=10.30.171.238
alias=bgp_peer_console
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-04-17T03:20:50.083723" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=bgp_peer_console
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=st...</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:20:50.083463" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:50.084205" level="INFO">{1: 23}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:50.083910" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:50.084649" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:50.084403" elapsed="0.000311"/>
</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-04-17T03:20:50.085317" elapsed="0.000280"/>
</kw>
<msg time="2026-04-17T03:20:50.085698" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:20:50.085754" level="INFO">${old_connection_index} = 23</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:50.084880" elapsed="0.000913"/>
</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-04-17T03:20:50.086636" elapsed="0.000195"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:20:50.087993" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:20:50.087552" elapsed="0.001345">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:50.087068" elapsed="0.001948"/>
</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-04-17T03:20:50.089758" elapsed="0.000320"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:50.089218" elapsed="0.000947"/>
</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-04-17T03:20:50.086126" elapsed="0.004086"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:50.085877" elapsed="0.004382"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:50.085858" elapsed="0.004426"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:20:50.091273" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:20:50.090846" elapsed="0.000454"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:20:50.091348" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:20:50.091506" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:20:50.090514" elapsed="0.001016"/>
</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-04-17T03:20:50.091690" elapsed="0.000491"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:20:50.092463" level="INFO">index=24
host=10.30.170.120
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-04-17T03:20:50.092567" level="INFO">${karaf_connection_object} = index=24
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:20:50.092351" elapsed="0.000241"/>
</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-04-17T03:20:50.092742" elapsed="0.002538"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:20:50.095759" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:20:50.097960" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:20:50.095448" elapsed="0.002911">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:20:50.114791" elapsed="0.000442"/>
</kw>
<msg time="2026-04-17T03:20:50.115326" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:20:50.113315" elapsed="0.002161"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:50.115643" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:50.115805" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:20:50.099284" elapsed="0.016602"/>
</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-04-17T03:20:50.098652" elapsed="0.017296"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:20:50.082780" elapsed="0.033254">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:50.116389" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:20:50.116463" 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="FAIL" start="2026-04-17T03:20:50.068812" elapsed="0.047758">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:20:50.116685" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:20:50.116729" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:50.063834" elapsed="0.052918"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:50.117277" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:50.116832" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:50.116814" elapsed="0.000540"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:20:50.063680" elapsed="0.053698"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:20:50.063477" elapsed="0.053942"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:20:50.060574" elapsed="0.056909"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:20:50.055221" elapsed="0.062319"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:50.054662" elapsed="0.062926"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:20:50.051673" elapsed="0.065970"/>
</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-04-17T03:20:50.118089" elapsed="0.000107"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:50.117803" elapsed="0.000447"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:20:50.127116" level="INFO">${start_cmd} = python3 bgp_app_peer.py --host 10.30.170.120 --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.120/tables=bg...</msg>
<var>${start_cmd}</var>
<arg>${command} ${tool_opt}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:50.126748" elapsed="0.000396"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:50.127543" level="INFO">python3 bgp_app_peer.py --host 10.30.170.120 --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.120/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-04-17T03:20:50.127299" elapsed="0.000293"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:20:50.132863" level="INFO">python3 bgp_app_peer.py --host 10.30.170.120 --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.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family &amp;&gt;/dev/null</msg>
<msg time="2026-04-17T03:20:50.132981" level="INFO">${output} =  python3 bgp_app_peer.py --host 10.30.170.120 --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.120/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-04-17T03:20:50.127741" elapsed="0.005325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:50.133494" level="INFO"> python3 bgp_app_peer.py --host 10.30.170.120 --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.120/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-04-17T03:20:50.133237" elapsed="0.000305"/>
</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-04-17T03:20:50.126321" elapsed="0.007276"/>
</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-04-17T03:20:50.295959" level="INFO">[?2004l[?2004h[jenkins@releng-26932-188-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-04-17T03:20:50.138373" elapsed="0.157902"/>
</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-04-17T03:20:50.137798" elapsed="0.158589"/>
</kw>
<arg>${BGP_APP_PEER_TIMEOUT}</arg>
<doc>Wait ${timeout} for the tool exit.</doc>
<status status="PASS" start="2026-04-17T03:20:50.137454" elapsed="0.159034"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:20:50.306594" level="INFO">Executing command 'cat bgp_app_peer.log'.</msg>
<msg time="2026-04-17T03:20:50.319723" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:20:50.320117" level="INFO">${output_log} = 2026-04-17 03:20:50,236 INFO: Delete 3 prefix(es) (starting from 8.0.1.0/28) from 10.30.170.120:8181/rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:20:50.306399" elapsed="0.013786"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:50.321518" level="INFO">2026-04-17 03:20:50,236 INFO: Delete 3 prefix(es) (starting from 8.0.1.0/28) from 10.30.170.120:8181/rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family
2026-04-17 03:20:50,236 INFO: Deleting prefix 8.0.1.0/28/,0 from 10.30.170.120:8181/rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:50.320704" elapsed="0.000925"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-04-17T03:20:50.323193" 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-04-17T03:20:50.322143" elapsed="0.001180"/>
</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-04-17T03:20:50.305785" elapsed="0.017688"/>
</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-04-17T03:20:50.324526" elapsed="0.000396"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-04-17T03:20:50.324024" elapsed="0.001009"/>
</kw>
<doc>Start BGP application peer tool and give him 30s</doc>
<tag>critical</tag>
<status status="PASS" start="2026-04-17T03:20:50.051063" elapsed="0.274027"/>
</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-04-17T03:20:50.333451" elapsed="0.000347"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:20:50.333053" elapsed="0.000833"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:20:50.335769" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:50.335544" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:50.335501" elapsed="0.000361"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:20:50.340964" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:50.340840" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:50.340822" elapsed="0.000211"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:50.342094" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:20:50.341662" elapsed="0.000461"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:20:50.342583" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:20:50.342284" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:20:50.342654" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:20:50.342827" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:20:50.341277" elapsed="0.001575"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:20:50.348671" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:50.348556" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:50.348534" elapsed="0.000303"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:20:50.350131" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:50.350021" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:50.350002" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:20:50.350661" level="INFO">${karaf_connection_index} = 24</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:20:50.350345" elapsed="0.000344"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:20:50.351125" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:20:50.350852" elapsed="0.000301"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:20:50.351963" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:20:50.351649" elapsed="0.001234">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:20:50.353096" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:20:50.353142" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:50.351314" elapsed="0.001852"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:20:50.353941" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:20:50.353674" elapsed="0.000948">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:20:50.354807" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:20:50.354852" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:50.353335" elapsed="0.001540"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:20:50.355909" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_Check_Example-IPv4-Topology_Is_Empty"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:20:50.355269" elapsed="0.000725">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_Check_Example-IPv4-Topology_Is_Empty"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:20:50.354972" elapsed="0.001099">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_Check_Example-IPv4-Topology_Is_Empty"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:20:50.354952" elapsed="0.001152">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_Check_Example-IPv4-Topology_Is_Empty"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:50.356270" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:50.356496" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:50.356356" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:50.356340" elapsed="0.000229"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:20:50.356601" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:20:50.360334" elapsed="0.000228"/>
</kw>
<msg time="2026-04-17T03:20:50.360641" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:20:50.358109" elapsed="0.002675"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:50.361083" elapsed="0.000082"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:50.361430" 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-04-17T03:20:50.357471" elapsed="0.004159"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:20:50.356905" elapsed="0.004792"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:20:50.349681" elapsed="0.012115">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_Check_Example-IPv4-Topology_Is_Empty"</status>
</kw>
<msg time="2026-04-17T03:20:50.361912" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:20:50.361985" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_Check_Example-IPv4-Topology_Is_Empty"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:50.349030" elapsed="0.012993"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:20:50.362277" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:50.362117" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:50.362092" elapsed="0.000388"/>
</if>
<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-04-17T03:20:50.363606" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:50.363498" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:50.363480" elapsed="0.000192"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:20:50.364033" level="INFO">index=16
host=10.30.171.238
alias=bgp_app_peer_console
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-04-17T03:20:50.364146" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.238
alias=bgp_app_peer_console
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_error...</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:20:50.363836" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:50.364664" level="INFO">{1: 24}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:50.364332" elapsed="0.000378"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:50.365124" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:50.364863" elapsed="0.000305"/>
</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-04-17T03:20:50.365759" elapsed="0.000307"/>
</kw>
<msg time="2026-04-17T03:20:50.366169" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:20:50.366214" level="INFO">${old_connection_index} = 24</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:50.365336" elapsed="0.000900"/>
</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-04-17T03:20:50.367330" elapsed="0.000202"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:20:50.368687" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:20:50.368227" elapsed="0.001893">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:50.367699" elapsed="0.002579"/>
</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-04-17T03:20:50.371300" elapsed="0.000322"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:50.370563" elapsed="0.001144"/>
</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-04-17T03:20:50.366539" elapsed="0.005215"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:50.366311" elapsed="0.005495"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:50.366293" elapsed="0.005555"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:20:50.372945" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:20:50.372574" elapsed="0.000401"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:20:50.373030" elapsed="0.000051"/>
</return>
<msg time="2026-04-17T03:20:50.373214" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:20:50.372154" elapsed="0.001084"/>
</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-04-17T03:20:50.373404" elapsed="0.000503"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:20:50.374251" level="INFO">index=25
host=10.30.170.120
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-04-17T03:20:50.374356" level="INFO">${karaf_connection_object} = index=25
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:20:50.374103" elapsed="0.000278"/>
</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-04-17T03:20:50.374534" elapsed="0.002610"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:20:50.377581" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:20:50.379189" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:20:50.377313" elapsed="0.002324">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:20:50.393758" elapsed="0.000415"/>
</kw>
<msg time="2026-04-17T03:20:50.394356" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:20:50.392259" elapsed="0.002256"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:50.394677" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:50.394841" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:20:50.380589" elapsed="0.014350"/>
</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-04-17T03:20:50.380035" elapsed="0.014955"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:20:50.363123" elapsed="0.031959">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:50.395501" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:20:50.395579" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:20:50.348148" elapsed="0.047547">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:20:50.395816" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:20:50.395860" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:50.343303" elapsed="0.052580"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:50.396453" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:50.396181" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:50.396157" elapsed="0.000375"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:20:50.343153" elapsed="0.053404"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:20:50.342921" elapsed="0.053677"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:20:50.340464" elapsed="0.056204"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:20:50.334798" elapsed="0.061935"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:20:50.334126" elapsed="0.062656"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:20:50.326701" elapsed="0.070138"/>
</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-04-17T03:20:50.450001" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:50.449581" elapsed="0.000454"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:50.451050" 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-04-17T03:20:50.450549" elapsed="0.000607">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-04-17T03:20:50.451258" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:50.450209" elapsed="0.001074"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:50.451848" 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-04-17T03:20:50.451455" elapsed="0.000420"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:20:50.452247" 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-04-17T03:20:50.452470" 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-04-17T03:20:50.452082" elapsed="0.000492"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:50.453020" 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-04-17T03:20:50.452745" elapsed="0.000322"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:50.454338" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:50.453867" elapsed="0.000535"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:20:50.455031" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:20:50.454570" elapsed="0.000487"/>
</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-04-17T03:20:50.455546" elapsed="0.000053"/>
</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-04-17T03:20:50.456383" elapsed="0.000058"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:20:50.456776" elapsed="0.000052"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:20:50.455347" elapsed="0.001641"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:20:50.455127" elapsed="0.001940"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:20:50.457125" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:20:50.457337" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:20:50.453511" elapsed="0.003856"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:50.453149" elapsed="0.004252"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:50.457582" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:50.457430" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:50.453123" elapsed="0.004536"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:20:50.458305" 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-04-17T03:20:50.457806" elapsed="0.000528"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:20:50.458383" 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-04-17T03:20:50.448894" elapsed="0.009614"/>
</kw>
<msg time="2026-04-17T03:20:50.458564" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:20:50.436156" elapsed="0.022457"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:20:50.471562" 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/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-04-17T03:20:50.483907" 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/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-04-17T03:20:50.496207" elapsed="0.000032"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:50.496461" 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-04-17T03:20:50.496777" 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-04-17T03:20:50.497268" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:50.497103" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:50.497083" elapsed="0.000273"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:50.497505" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:50.497676" 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-04-17T03:20:50.497844" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:20:50.497033" elapsed="0.000864"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:20:50.496878" elapsed="0.001063"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:50.498096" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:50.498180" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:20:50.498370" 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-04-17T03:20:50.431844" elapsed="0.066556"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:50.500513" 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-04-17T03:20:50.500132" elapsed="0.000477">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-04-17T03:20:50.500708" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:50.499513" elapsed="0.001220"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:50.501114" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:50.500805" elapsed="0.000366"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:20:50.501701" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:50.501403" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:50.501197" elapsed="0.000564"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:50.500786" elapsed="0.000996"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:50.504222" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:20:50.501950" elapsed="0.002298"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:20:50.504302" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:20:50.504466" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:20:50.498769" elapsed="0.005722"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:50.505875" 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-04-17T03:20:50.505599" elapsed="0.000359">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-04-17T03:20:50.506054" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:50.505229" elapsed="0.000850"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:20:50.506285" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-17T03:20:50.506149" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:50.506131" elapsed="0.000237"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:50.506517" elapsed="0.000063"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:50.506738" elapsed="0.000159"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:20:50.506964" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:20:50.509102" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:20:50.504868" elapsed="0.004260"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:50.510712" 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-04-17T03:20:50.510414" elapsed="0.000357"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:50.511211" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:50.510944" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:20:50.517200" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:50.719186" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:51.122500" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:51.125227" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:20:50.513521" elapsed="0.615470">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:20:50.511322" elapsed="0.617852">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:51.129665" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:51.129252" elapsed="0.000521"/>
</branch>
<status status="FAIL" start="2026-04-17T03:20:50.511304" elapsed="0.618506">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:51.130588" elapsed="0.000042"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:51.130818" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:51.130749" elapsed="0.000143"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:51.130717" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:51.131170" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:20:51.131273" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:20:50.509522" elapsed="0.621936">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:51.131595" elapsed="0.000026"/>
</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-04-17T03:20:50.409070" elapsed="0.722678">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:51.132325" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:51.132019" elapsed="0.000446"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:51.131991" elapsed="0.000511"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:51.132552" elapsed="0.000022"/>
</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="FAIL" start="2026-04-17T03:20:50.402551" elapsed="0.730157">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:20:50.397892" elapsed="0.734975">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:20:52.198251" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:52.197656" elapsed="0.000641"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:52.199464" 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-04-17T03:20:52.198908" elapsed="0.000657">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-04-17T03:20:52.199669" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:52.198510" elapsed="0.001185"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:52.200345" 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-04-17T03:20:52.199870" elapsed="0.000504"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:20:52.200708" 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-04-17T03:20:52.200943" 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-04-17T03:20:52.200543" elapsed="0.000428"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:52.201475" 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-04-17T03:20:52.201170" elapsed="0.000354"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:52.203034" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:52.202549" elapsed="0.000550"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:20:52.203653" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:20:52.203268" 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-04-17T03:20:52.204242" 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-04-17T03:20:52.205101" 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-04-17T03:20:52.205453" elapsed="0.000047"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:20:52.203945" elapsed="0.001681"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:20:52.203746" elapsed="0.001958"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:20:52.205765" elapsed="0.000050"/>
</return>
<msg time="2026-04-17T03:20:52.205983" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:20:52.202144" elapsed="0.003866"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:52.201632" elapsed="0.004411"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:52.206224" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:52.206070" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:52.201596" elapsed="0.004838"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:20:52.207359" 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-04-17T03:20:52.206633" elapsed="0.000765"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:20:52.207464" 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//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-04-17T03:20:52.196536" elapsed="0.011104"/>
</kw>
<msg time="2026-04-17T03:20:52.207726" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:20:52.183003" elapsed="0.024809"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:20:52.227442" elapsed="0.000142"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:20:52.250746" elapsed="0.000129"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:20:52.266063" elapsed="0.000095"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:52.266509" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:52.266728" 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-04-17T03:20:52.267341" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:52.267171" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:52.267148" elapsed="0.000282"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:52.267586" 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-04-17T03:20:52.267785" 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-04-17T03:20:52.267979" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:20:52.267093" elapsed="0.000944"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:20:52.266839" elapsed="0.001228"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:52.268276" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:52.268395" elapsed="0.000023"/>
</return>
<msg time="2026-04-17T03:20:52.268677" 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-04-17T03:20:52.178128" elapsed="0.090587"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:52.270838" 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-04-17T03:20:52.270428" elapsed="0.000526">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-04-17T03:20:52.271063" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:52.269884" elapsed="0.001204"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:52.271478" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:52.271172" elapsed="0.000365"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:20:52.272210" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:52.271811" elapsed="0.000434"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:52.271567" elapsed="0.000721"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:52.271151" elapsed="0.001162"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:52.275229" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:20:52.272505" elapsed="0.002754"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:20:52.275324" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:20:52.275518" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:20:52.269427" elapsed="0.006117"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:52.277206" 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-04-17T03:20:52.276799" elapsed="0.000497">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-04-17T03:20:52.277399" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:52.276417" elapsed="0.001018"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:20:52.277687" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-04-17T03:20:52.277521" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:52.277498" 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-04-17T03:20:52.277989" elapsed="0.000025"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:52.278175" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:20:52.278243" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:20:52.280503" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:20:52.275983" elapsed="0.004546"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:52.282160" 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-04-17T03:20:52.281836" elapsed="0.000372"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:52.282614" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:52.282363" 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-04-17T03:20:52.288814" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:52.490768" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:52.894436" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:52.897476" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:20:52.284920" elapsed="0.616227">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:20:52.282727" elapsed="0.618736">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:52.902036" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:52.901547" elapsed="0.000602"/>
</branch>
<status status="FAIL" start="2026-04-17T03:20:52.282707" elapsed="0.619482">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:52.902966" elapsed="0.000043"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:52.903200" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:52.903133" elapsed="0.000143"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:52.903100" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:52.903551" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:20:52.903656" elapsed="0.000024"/>
</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-04-17T03:20:52.280915" elapsed="0.622937">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:52.903993" 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-04-17T03:20:52.153852" elapsed="0.750259">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:52.904574" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:52.904233" elapsed="0.000454"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:52.904204" elapsed="0.000521"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:52.904777" elapsed="0.000022"/>
</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="FAIL" start="2026-04-17T03:20:52.144508" elapsed="0.760453">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:20:52.133858" elapsed="0.771282">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:20:53.972400" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:53.971922" elapsed="0.000521"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:53.973963" 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-04-17T03:20:53.973389" elapsed="0.000675">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-04-17T03:20:53.974166" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:53.972642" elapsed="0.001550"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:53.974823" 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-04-17T03:20:53.974415" elapsed="0.000436"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:20:53.975433" 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-04-17T03:20:53.975636" 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-04-17T03:20:53.975265" elapsed="0.000398"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:53.976099" 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-04-17T03:20:53.975837" elapsed="0.000328"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:53.977553" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:53.977096" elapsed="0.000519"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:20:53.978241" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:20:53.977790" elapsed="0.000480"/>
</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-04-17T03:20:53.978715" elapsed="0.000048"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:53.979495" 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-04-17T03:20:53.979848" elapsed="0.000045"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:20:53.978520" elapsed="0.001513"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:20:53.978335" elapsed="0.001767"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:20:53.980160" elapsed="0.000047"/>
</return>
<msg time="2026-04-17T03:20:53.980350" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:20:53.976690" elapsed="0.003685"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:53.976263" elapsed="0.004145"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:53.980586" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:53.980435" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:53.976232" elapsed="0.004430"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:20:53.981335" 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-04-17T03:20:53.980807" elapsed="0.000556"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:20:53.981412" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:20:53.971167" elapsed="0.010370"/>
</kw>
<msg time="2026-04-17T03:20:53.981595" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:20:53.957797" elapsed="0.023860"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:20:53.995435" elapsed="0.000107"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:20:54.011401" elapsed="0.000081"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:20:54.025401" elapsed="0.000049"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:54.025721" 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-04-17T03:20:54.025919" elapsed="0.000037"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:54.026428" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:54.026266" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:54.026244" 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-04-17T03:20:54.026661" 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-04-17T03:20:54.026833" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:54.027013" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:20:54.026192" elapsed="0.000874"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:20:54.026039" elapsed="0.001056"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:54.027245" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:54.027329" elapsed="0.000021"/>
</return>
<msg time="2026-04-17T03:20:54.027535" 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-04-17T03:20:53.952581" elapsed="0.074985"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:54.029460" 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-04-17T03:20:54.028981" elapsed="0.000574">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-04-17T03:20:54.029654" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:54.028480" elapsed="0.001199"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:54.030110" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:54.029749" elapsed="0.000425"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:20:54.030757" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:54.030439" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:54.030200" elapsed="0.000631"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:54.029731" elapsed="0.001126"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:54.033373" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:20:54.031043" elapsed="0.002358"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:20:54.033453" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:20:54.033622" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:20:54.027997" elapsed="0.005650"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:54.035082" 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-04-17T03:20:54.034825" elapsed="0.000322">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-04-17T03:20:54.035243" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:54.034484" elapsed="0.000783"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:20:54.035474" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:20:54.035337" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:54.035318" elapsed="0.000242"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:54.035708" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:54.035903" elapsed="0.000038"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:20:54.035989" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:20:54.038370" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:20:54.034144" elapsed="0.004261"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:54.040220" 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-04-17T03:20:54.039884" elapsed="0.000386"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:54.040700" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:54.040426" elapsed="0.000319"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:20:54.046299" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:54.248301" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:54.651868" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:54.655354" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:20:54.042980" elapsed="0.616692">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:20:54.040813" elapsed="0.619046">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:54.660385" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:54.659958" elapsed="0.000530"/>
</branch>
<status status="FAIL" start="2026-04-17T03:20:54.040793" elapsed="0.619729">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:54.661279" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:54.661525" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:54.661462" elapsed="0.000131"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:54.661430" elapsed="0.000193"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:54.661836" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:20:54.662054" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:20:54.038819" elapsed="0.623416">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:54.662346" 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-04-17T03:20:53.925178" elapsed="0.737310">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:54.662897" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:54.662625" elapsed="0.000395"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:54.662601" elapsed="0.000452"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:54.663099" elapsed="0.000021"/>
</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="FAIL" start="2026-04-17T03:20:53.916603" elapsed="0.746640">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:20:53.906435" elapsed="0.756955">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:20:55.726921" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:55.726482" elapsed="0.000509"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:55.728689" 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-04-17T03:20:55.727540" elapsed="0.001294">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-04-17T03:20:55.729046" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:55.727180" elapsed="0.001899"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:55.730190" 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-04-17T03:20:55.729475" elapsed="0.000744"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:20:55.730568" 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-04-17T03:20:55.730763" 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-04-17T03:20:55.730401" elapsed="0.000388"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:55.731450" 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-04-17T03:20:55.731081" 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-04-17T03:20:55.733606" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:55.732897" elapsed="0.000797"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:20:55.734579" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:20:55.734003" elapsed="0.000722"/>
</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-04-17T03:20:55.735299" elapsed="0.000053"/>
</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-04-17T03:20:55.736105" elapsed="0.000070"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:55.736481" elapsed="0.000046"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:20:55.735069" elapsed="0.001585"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:20:55.734814" elapsed="0.001911"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:20:55.736789" elapsed="0.000048"/>
</return>
<msg time="2026-04-17T03:20:55.737018" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:20:55.732291" elapsed="0.004753"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:55.731648" elapsed="0.005429"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:55.737275" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:55.737105" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:55.731603" elapsed="0.005750"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:20:55.738043" 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-04-17T03:20:55.737503" elapsed="0.000570"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:20:55.738122" 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//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-04-17T03:20:55.725747" elapsed="0.012517"/>
</kw>
<msg time="2026-04-17T03:20:55.738324" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:20:55.712635" elapsed="0.025751"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:20:55.863865" elapsed="0.000083"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:20:55.876552" 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-04-17T03:20:55.888957" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:55.889198" 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-04-17T03:20:55.889386" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:55.889807" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:55.889650" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:55.889633" 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-04-17T03:20:55.890082" 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-04-17T03:20:55.890332" 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-04-17T03:20:55.890499" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:20:55.889592" elapsed="0.000959"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:20:55.889471" elapsed="0.001109"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:55.890728" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:55.890806" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:20:55.890981" 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-04-17T03:20:55.707531" elapsed="0.183479"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:55.892429" 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-04-17T03:20:55.892141" elapsed="0.000364">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-04-17T03:20:55.892599" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:55.891712" elapsed="0.000912"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:55.892970" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:55.892693" elapsed="0.000336"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:20:55.893536" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:55.893237" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:55.893053" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:55.892675" elapsed="0.000944"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:55.895990" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:20:55.893770" elapsed="0.002247"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:20:55.896068" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:20:55.896247" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:20:55.891346" elapsed="0.004934"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:55.897523" 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-04-17T03:20:55.897285" elapsed="0.000301">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-04-17T03:20:55.897680" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:55.896943" elapsed="0.000761"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:20:55.897911" elapsed="0.000044"/>
</return>
<status status="PASS" start="2026-04-17T03:20:55.897775" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:55.897757" elapsed="0.000293"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:55.898201" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:55.898373" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:20:55.898438" elapsed="0.000014"/>
</return>
<msg time="2026-04-17T03:20:55.900493" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:20:55.896598" elapsed="0.003922"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:55.901962" 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-04-17T03:20:55.901687" elapsed="0.000387"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:55.902481" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:55.902231" 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-04-17T03:20:55.907553" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:56.109030" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:56.512212" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:56.514897" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:20:55.904665" elapsed="0.614908">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:20:55.902591" elapsed="0.617135">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:56.520138" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:56.519788" elapsed="0.000450"/>
</branch>
<status status="FAIL" start="2026-04-17T03:20:55.902573" elapsed="0.617698">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:56.520957" elapsed="0.000061"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:56.521222" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:56.521151" elapsed="0.000155"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:56.521121" elapsed="0.000217"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:56.521646" elapsed="0.000042"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:20:56.521767" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:20:55.900840" elapsed="0.621129">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:56.522094" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:20:55.683771" elapsed="0.838465">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:56.522722" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:56.522450" elapsed="0.000387"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:56.522423" elapsed="0.000450"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:56.523000" elapsed="0.000023"/>
</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="FAIL" start="2026-04-17T03:20:55.675485" elapsed="0.847675">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:20:55.664202" elapsed="0.859102">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:20:57.583917" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:57.583440" elapsed="0.000531"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:57.585002" 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-04-17T03:20:57.584516" elapsed="0.000569">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-04-17T03:20:57.585185" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:57.584155" elapsed="0.001055"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:57.585779" 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-04-17T03:20:57.585381" elapsed="0.000426"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:20:57.586138" 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-04-17T03:20:57.586306" 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-04-17T03:20:57.585991" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:57.586762" 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-04-17T03:20:57.586506" 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-04-17T03:20:57.588193" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:57.587699" elapsed="0.000559"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:20:57.588784" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:20:57.588423" elapsed="0.000388"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:57.589358" elapsed="0.000063"/>
</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-04-17T03:20:57.590451" 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-04-17T03:20:57.591017" elapsed="0.000059"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:20:57.589097" elapsed="0.002138"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:20:57.588866" elapsed="0.002466"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:20:57.591400" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:20:57.591584" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:20:57.587343" elapsed="0.004267"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:57.586964" elapsed="0.004680"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:57.591856" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:57.591671" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:57.586918" elapsed="0.005061"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:20:57.592644" 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-04-17T03:20:57.592138" elapsed="0.000535"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:20:57.592784" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:20:57.582578" elapsed="0.010338"/>
</kw>
<msg time="2026-04-17T03:20:57.592990" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:20:57.568444" elapsed="0.024602"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:20:57.606070" elapsed="0.000044"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:20:57.619377" elapsed="0.000059"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:20:57.632749" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:57.633043" 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-04-17T03:20:57.633254" 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-04-17T03:20:57.633727" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:57.633552" elapsed="0.000234"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:57.633533" elapsed="0.000282"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:57.633995" 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-04-17T03:20:57.634182" 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-04-17T03:20:57.634366" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:20:57.633490" elapsed="0.000932"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:20:57.633348" elapsed="0.001104"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:57.634617" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:57.634701" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:20:57.634877" 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-04-17T03:20:57.563378" elapsed="0.071572"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:57.636511" 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-04-17T03:20:57.636197" elapsed="0.000465">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-04-17T03:20:57.636767" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:57.635729" elapsed="0.001065"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:57.637184" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:57.636872" elapsed="0.000374"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:20:57.637798" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:57.637479" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:57.637273" elapsed="0.000592"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:57.636852" elapsed="0.001036"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:57.640741" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:20:57.638077" elapsed="0.002694"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:20:57.640829" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:20:57.641015" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:20:57.635333" elapsed="0.005710"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:57.642403" 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-04-17T03:20:57.642137" elapsed="0.000334">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-04-17T03:20:57.642571" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:57.641748" elapsed="0.000849"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:20:57.642818" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-17T03:20:57.642672" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:57.642653" elapsed="0.000309"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:57.643135" 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-04-17T03:20:57.643327" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:20:57.643397" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:20:57.646313" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:20:57.641393" elapsed="0.004958"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:57.648396" 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-04-17T03:20:57.648019" elapsed="0.000440"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:57.649011" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:57.648664" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:20:57.655034" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:57.857036" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:58.260537" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:58.263447" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:20:57.652116" elapsed="0.615261">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:20:57.649169" elapsed="0.618434">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:58.267986" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:58.267664" elapsed="0.000421"/>
</branch>
<status status="FAIL" start="2026-04-17T03:20:57.649142" elapsed="0.618976">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:58.268727" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:58.268951" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:20:58.268869" elapsed="0.000151"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:58.268843" elapsed="0.000207"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:58.269257" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:20:58.269358" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:20:57.646800" elapsed="0.622717">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:58.269626" 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-04-17T03:20:57.539479" elapsed="0.730285">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:20:58.270181" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:58.269895" elapsed="0.000388"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:58.269872" elapsed="0.000444"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:58.270362" elapsed="0.000020"/>
</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="FAIL" start="2026-04-17T03:20:57.531820" elapsed="0.738690">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:20:57.524366" elapsed="0.746340">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:20:59.333764" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:59.333300" elapsed="0.000518"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:59.334832" 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-04-17T03:20:59.334418" elapsed="0.000491">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-04-17T03:20:59.335174" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:59.334041" elapsed="0.001160"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:59.335858" 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-04-17T03:20:59.335408" elapsed="0.000479"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:20:59.336224" 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-04-17T03:20:59.336386" 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-04-17T03:20:59.336075" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:59.336829" 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-04-17T03:20:59.336574" 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-04-17T03:20:59.338253" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:59.337745" elapsed="0.000571"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:20:59.338876" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:20:59.338484" elapsed="0.000421"/>
</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-04-17T03:20:59.339383" elapsed="0.000049"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:59.340220" 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-04-17T03:20:59.340563" elapsed="0.000044"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:20:59.339191" elapsed="0.001539"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:20:59.339006" elapsed="0.001792"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:20:59.340850" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:20:59.341047" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:20:59.337354" elapsed="0.003718"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:59.336984" elapsed="0.004122"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:59.341282" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:59.341132" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:59.336954" elapsed="0.004405"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:20:59.341993" 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-04-17T03:20:59.341506" elapsed="0.000516"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:20:59.342074" 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-04-17T03:20:59.332595" elapsed="0.009609"/>
</kw>
<msg time="2026-04-17T03:20:59.342260" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:20:59.319077" elapsed="0.023235"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:20:59.355589" elapsed="0.000056"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:20:59.368549" 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//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-04-17T03:20:59.386824" elapsed="0.000049"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:59.387187" elapsed="0.000035"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:59.387469" elapsed="0.000040"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:59.388180" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:59.387947" elapsed="0.000318"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:20:59.387882" elapsed="0.000420"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:59.388505" 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-04-17T03:20:59.388784" 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-04-17T03:20:59.389063" elapsed="0.000027"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:20:59.387768" elapsed="0.001360"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:20:59.387603" elapsed="0.001554"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:59.389311" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:20:59.389393" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:20:59.389560" 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-04-17T03:20:59.314316" elapsed="0.075273"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:59.391222" 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-04-17T03:20:59.390830" elapsed="0.000480">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-04-17T03:20:59.391409" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:59.390394" elapsed="0.001040"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:59.391797" elapsed="0.000074"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:20:59.391509" elapsed="0.000403"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:20:59.392456" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:20:59.392147" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-17T03:20:59.391953" elapsed="0.000566"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:59.391490" elapsed="0.001050"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:20:59.395060" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:20:59.392761" elapsed="0.002327"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:20:59.395156" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:20:59.395332" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:20:59.389991" elapsed="0.005371"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:20:59.396734" 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-04-17T03:20:59.396485" elapsed="0.000317">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-04-17T03:20:59.396986" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:20:59.396086" elapsed="0.000931"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:20:59.397263" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-17T03:20:59.397118" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-04-17T03:20:59.397097" elapsed="0.000285"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:20:59.397538" 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-04-17T03:20:59.397714" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:20:59.397786" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:20:59.400057" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:20:59.395694" elapsed="0.004394"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:59.401700" 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-04-17T03:20:59.401353" elapsed="0.000415"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:20:59.402267" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:20:59.401959" 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-04-17T03:20:59.407796" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:59.609514" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:00.012195" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:00.015165" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:20:59.404656" elapsed="0.615859">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:20:59.402421" elapsed="0.618319">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:00.021205" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:00.020830" elapsed="0.000475"/>
</branch>
<status status="FAIL" start="2026-04-17T03:20:59.402400" elapsed="0.618939">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:00.021977" elapsed="0.000049"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:00.022195" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:00.022138" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:00.022110" elapsed="0.000177"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:00.022494" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:21:00.022592" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:20:59.400443" elapsed="0.622310">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:00.022964" elapsed="0.000026"/>
</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-04-17T03:20:59.290151" elapsed="0.732963">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:00.023510" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:00.023249" elapsed="0.000366"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:00.023226" elapsed="0.000423"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:00.023697" elapsed="0.000022"/>
</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="FAIL" start="2026-04-17T03:20:59.280553" elapsed="0.743290">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:20:59.271550" elapsed="0.752464">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:21:01.100957" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:21:01.100476" elapsed="0.000517"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:01.102027" 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-04-17T03:21:01.101531" elapsed="0.000577">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-04-17T03:21:01.102209" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:01.101175" elapsed="0.001059"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:21:01.102804" 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-04-17T03:21:01.102406" elapsed="0.000425"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:21:01.103162" 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-04-17T03:21:01.103325" 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-04-17T03:21:01.103014" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:01.103770" 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-04-17T03:21:01.103514" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:01.105149" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:01.104633" elapsed="0.000580"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:21:01.105744" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:21:01.105378" 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-04-17T03:21:01.106190" 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-04-17T03:21:01.106908" elapsed="0.000080"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:01.107344" elapsed="0.000046"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:21:01.106001" elapsed="0.001511"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:21:01.105824" elapsed="0.001756"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:21:01.107631" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:21:01.107805" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:21:01.104274" elapsed="0.003557"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:01.103897" elapsed="0.003967"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:01.108055" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:01.107889" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:01.103873" elapsed="0.004260"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:21:01.108761" 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-04-17T03:21:01.108277" elapsed="0.000513"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:21:01.108841" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:21:01.099696" elapsed="0.009288"/>
</kw>
<msg time="2026-04-17T03:21:01.109044" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:21:01.083690" elapsed="0.025406"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:21:01.122319" 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/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-04-17T03:21:01.135125" elapsed="0.000042"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:21:01.147849" elapsed="0.000032"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:01.148100" 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-04-17T03:21:01.148286" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:01.148700" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:01.148548" elapsed="0.000241"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:01.148530" 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-04-17T03:21:01.148986" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:01.149156" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:01.149327" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:21:01.148491" elapsed="0.000891"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:21:01.148373" elapsed="0.001119"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:01.149644" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:01.149725" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:21:01.149887" 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-04-17T03:21:01.077501" elapsed="0.072415"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:01.151428" 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-04-17T03:21:01.151073" elapsed="0.000460">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-04-17T03:21:01.151688" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:01.150647" elapsed="0.001073"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:01.152181" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:01.151802" elapsed="0.000465"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:21:01.153108" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:21:01.152570" elapsed="0.000577"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:01.152305" elapsed="0.000895"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:01.151780" elapsed="0.001451"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:21:01.156905" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:21:01.153459" elapsed="0.003505"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:21:01.157038" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:21:01.157214" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:21:01.150283" elapsed="0.006957"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:01.158551" 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-04-17T03:21:01.158290" elapsed="0.000332">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-04-17T03:21:01.158718" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:01.157943" elapsed="0.000800"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:21:01.158972" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:21:01.158816" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:01.158797" elapsed="0.000267"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:01.159214" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:01.159390" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:21:01.159456" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:21:01.161715" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:21:01.157581" elapsed="0.004170"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:01.163339" 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-04-17T03:21:01.163028" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:01.163808" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:01.163545" elapsed="0.000328"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:21:01.169694" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:01.371386" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:01.773662" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:01.776032" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:21:01.166259" elapsed="0.615315">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:21:01.163976" elapsed="0.617831">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:01.782361" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:01.781895" elapsed="0.000619"/>
</branch>
<status status="FAIL" start="2026-04-17T03:21:01.163954" elapsed="0.618613">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:01.783579" elapsed="0.000088"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:01.784061" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:01.783961" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:01.783872" elapsed="0.000343"/>
</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-04-17T03:21:01.784741" elapsed="0.000068"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:21:01.784965" elapsed="0.000041"/>
</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-04-17T03:21:01.162177" elapsed="0.623138">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:01.785501" elapsed="0.000037"/>
</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-04-17T03:21:01.046305" elapsed="0.739466">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:01.786261" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:01.786036" elapsed="0.000301"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:01.786000" elapsed="0.000363"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:01.786397" elapsed="0.000015"/>
</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="FAIL" start="2026-04-17T03:21:01.037741" elapsed="0.748760">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:21:01.024805" elapsed="0.761890">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:21:01.786858" level="FAIL">Keyword 'Compare_Topology' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-17T03:20:50.397382" elapsed="11.389653">Keyword 'Compare_Topology' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>empty_topology</arg>
<doc>Wait until Compare_Topology matches expected result.</doc>
<status status="FAIL" start="2026-04-17T03:20:50.397026" elapsed="11.390146">Keyword 'Compare_Topology' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:01.788808" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:21:01.788389" elapsed="0.000471"/>
</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-04-17T03:21:01.787945" elapsed="0.000969"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-04-17T03:21:01.787543" elapsed="0.001449"/>
</kw>
<doc>See new routes are deleted.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:20:50.325819" elapsed="11.463214">Keyword 'Compare_Topology' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:21:01.792982" elapsed="0.000322"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:21:01.792648" elapsed="0.000718"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:21:01.794610" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:01.794430" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:01.794405" 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-04-17T03:21:01.800563" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:01.800420" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:01.800392" elapsed="0.000280"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:21:01.802010" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:21:01.801546" elapsed="0.000494"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:21:01.802515" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:21:01.802207" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:21:01.802586" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:21:01.802754" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:21:01.801033" elapsed="0.001746"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:21:01.808846" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:01.808695" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:01.808671" elapsed="0.000289"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:21:01.810501" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:01.810391" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:01.810372" elapsed="0.000207"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:21:01.811083" level="INFO">${karaf_connection_index} = 25</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:21:01.810734" elapsed="0.000378"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:21:01.811595" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:21:01.811362" elapsed="0.000260"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:21:01.814538" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:21:01.812258" elapsed="0.003029">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:21:01.815515" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:21:01.815574" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:01.811789" elapsed="0.003812"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:21:01.816492" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:21:01.816219" elapsed="0.001037">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:21:01.817453" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:21:01.817500" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:01.815812" elapsed="0.001712"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:21:01.818570" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_Peer_Check_Incomming_Updates_For_3_Withdrawn_Prefixes"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:21:01.817850" elapsed="0.000792">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_Peer_Check_Incomming_Updates_For_3_Withdrawn_Prefixes"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:21:01.817609" elapsed="0.001111">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_Peer_Check_Incomming_Updates_For_3_Withdrawn_Prefixes"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:21:01.817586" elapsed="0.001171">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_Peer_Check_Incomming_Updates_For_3_Withdrawn_Prefixes"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:01.818979" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:01.819267" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:01.819082" elapsed="0.000251"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:01.819064" elapsed="0.000318"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:21:01.819432" elapsed="0.000019"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:21:01.822305" elapsed="0.000156"/>
</kw>
<msg time="2026-04-17T03:21:01.822531" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:21:01.821128" 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-04-17T03:21:01.823025" elapsed="0.000083"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:01.823372" 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-04-17T03:21:01.820421" elapsed="0.003141"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:21:01.819744" elapsed="0.003884"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:21:01.810077" elapsed="0.013640">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_Peer_Check_Incomming_Updates_For_3_Withdrawn_Prefixes"</status>
</kw>
<msg time="2026-04-17T03:21:01.823825" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:21:01.823872" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_Peer_Check_Incomming_Updates_For_3_Withdrawn_Prefixes"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:01.809250" elapsed="0.014647"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:21:01.824222" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:01.824106" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:01.824084" elapsed="0.000208"/>
</if>
<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-04-17T03:21:01.825280" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:01.825164" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:01.825138" elapsed="0.000210"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:21:01.825663" level="INFO">index=16
host=10.30.171.238
alias=bgp_app_peer_console
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-04-17T03:21:01.825860" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.238
alias=bgp_app_peer_console
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_error...</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:21:01.825511" elapsed="0.000378"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:01.826446" level="INFO">{1: 25}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:01.826119" elapsed="0.000373"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:01.827018" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:01.826670" elapsed="0.000399"/>
</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-04-17T03:21:01.827635" elapsed="0.000278"/>
</kw>
<msg time="2026-04-17T03:21:01.828033" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:21:01.828080" level="INFO">${old_connection_index} = 25</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:01.827237" elapsed="0.000866"/>
</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-04-17T03:21:01.828948" elapsed="0.000258"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:21:01.830801" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:21:01.830017" elapsed="0.001970">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:01.829426" elapsed="0.002672"/>
</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-04-17T03:21:01.832760" elapsed="0.000427"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:01.832280" elapsed="0.000997"/>
</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-04-17T03:21:01.828413" elapsed="0.004911"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:01.828181" elapsed="0.005192"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:01.828162" elapsed="0.005238"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:21:01.834370" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:21:01.834047" elapsed="0.000350"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:21:01.834448" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:21:01.834612" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:21:01.833665" elapsed="0.000972"/>
</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-04-17T03:21:01.834799" elapsed="0.000453"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:21:01.835551" level="INFO">index=26
host=10.30.170.120
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-04-17T03:21:01.835656" level="INFO">${karaf_connection_object} = index=26
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:21:01.835433" elapsed="0.000250"/>
</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-04-17T03:21:01.835839" elapsed="0.002615"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:21:01.838899" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:21:01.840043" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:21:01.838628" elapsed="0.001867">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:21:01.857444" elapsed="0.000431"/>
</kw>
<msg time="2026-04-17T03:21:01.858010" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:21:01.855617" elapsed="0.002570"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:01.858357" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:01.858526" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:21:01.841514" elapsed="0.017101"/>
</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-04-17T03:21:01.840820" elapsed="0.017938"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:21:01.824716" elapsed="0.034141">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:01.859470" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:21:01.859552" elapsed="0.000024"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:21:01.808261" elapsed="0.051413">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:21:01.859794" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:21:01.859840" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:01.803249" elapsed="0.056616"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:01.860273" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:01.859979" elapsed="0.000351"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:01.859949" elapsed="0.000407"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:21:01.803093" elapsed="0.057290"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:21:01.802839" elapsed="0.057580"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:21:01.799949" elapsed="0.060532"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:21:01.794109" elapsed="0.066432"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:01.793551" elapsed="0.067038"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:21:01.789866" elapsed="0.070780"/>
</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-04-17T03:21:01.861199" elapsed="0.000154"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:01.860790" elapsed="0.000634"/>
</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-04-17T03:21:01.876589" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:21:01.891090" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:21:01.891341" 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-04-17T03:21:01.876392" elapsed="0.014987"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:01.892425" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:01.891728" elapsed="0.000797"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:21:01.893848" 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-04-17T03:21:01.892867" elapsed="0.001216">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-04-17T03:21:01.875845" elapsed="0.018507">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:21:02.914139" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:21:02.927788" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:21:02.928132" 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-04-17T03:21:02.913912" elapsed="0.014283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:02.929316" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:02.928626" elapsed="0.000791"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:21:02.930657" 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-04-17T03:21:02.929756" elapsed="0.001057">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-04-17T03:21:02.913339" elapsed="0.017808">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:21:03.949305" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:21:03.962848" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:21:03.963201" 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-04-17T03:21:03.949095" elapsed="0.014160"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:03.964438" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:03.963792" elapsed="0.000740"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:21:03.965657" 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-04-17T03:21:03.964855" elapsed="0.000942">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-04-17T03:21:03.948537" elapsed="0.017523">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:21:04.985347" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:21:04.998091" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:21:04.998379" 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-04-17T03:21:04.985100" elapsed="0.013340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:04.999637" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:04.998922" elapsed="0.000820"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:21:05.000948" 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-04-17T03:21:05.000126" elapsed="0.001006">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-04-17T03:21:04.984470" elapsed="0.016909">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:21:06.015864" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:21:06.028614" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:21:06.028753" 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-04-17T03:21:06.015666" elapsed="0.013113"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:06.029428" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:06.029018" elapsed="0.000468"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:21:06.030142" 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-04-17T03:21:06.029659" elapsed="0.000560">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-04-17T03:21:06.015143" elapsed="0.015196">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:21:07.049806" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:21:07.063349" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:21:07.063610" 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-04-17T03:21:07.049600" elapsed="0.014074"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:07.064885" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:07.064184" elapsed="0.000879"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:21:07.066826" 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-04-17T03:21:07.065600" elapsed="0.001486">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-04-17T03:21:07.049073" elapsed="0.018342">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:21:08.083374" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:21:08.097248" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:21:08.097509" 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-04-17T03:21:08.083098" elapsed="0.014454"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:08.098565" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:08.098039" elapsed="0.000604"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:21:08.099626" 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-04-17T03:21:08.098880" elapsed="0.000896">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-04-17T03:21:08.082322" elapsed="0.017727">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:21:09.118726" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:21:09.131509" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:21:09.131741" 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-04-17T03:21:09.118447" elapsed="0.013334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:09.132621" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:09.132146" elapsed="0.000545"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:21:09.133509" 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-04-17T03:21:09.132937" elapsed="0.000672">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-04-17T03:21:09.117813" elapsed="0.015964">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:21:10.153117" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:21:10.166890" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:21:10.167300" 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-04-17T03:21:10.152843" elapsed="0.014519"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:10.168790" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:10.168078" elapsed="0.000896"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:21:10.170474" 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-04-17T03:21:10.169400" elapsed="0.001260">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-04-17T03:21:10.152257" elapsed="0.018717">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:21:11.197903" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:21:11.211066" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:21:11.211234" 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-04-17T03:21:11.197687" elapsed="0.013584"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:11.212405" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:11.211613" elapsed="0.000899"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:21:11.213721" 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-04-17T03:21:11.212860" elapsed="0.001020">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-04-17T03:21:11.197141" elapsed="0.017025">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:21:12.232625" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:21:12.245896" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:21:12.246126" 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-04-17T03:21:12.232356" elapsed="0.013810"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:12.247042" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:12.246490" elapsed="0.000638"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:21:12.248166" 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-04-17T03:21:12.247417" elapsed="0.000855">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-04-17T03:21:12.231680" elapsed="0.016782">0 != 3</status>
</kw>
<msg time="2026-04-17T03:21:12.248643" 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-04-17T03:21:01.861612" elapsed="10.387190">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-04-17T03:21:12.265875" elapsed="0.000042"/>
</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-04-17T03:21:12.280165" elapsed="0.000065"/>
</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-04-17T03:21:12.293790" elapsed="0.000043"/>
</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-04-17T03:21:12.307483" elapsed="0.000068"/>
</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-04-17T03:21:12.309486" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:21:12.309137" elapsed="0.000399"/>
</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-04-17T03:21:12.308560" elapsed="0.001030"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-04-17T03:21:12.308098" elapsed="0.001553"/>
</kw>
<doc>Check incomming updates for new routes</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:21:01.789307" elapsed="10.520384">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-04-17T03:21:12.314089" elapsed="0.000294"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:21:12.313708" 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-04-17T03:21:12.316037" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:12.315844" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:12.315812" elapsed="0.000326"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:21:12.323525" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:12.323352" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:12.323326" elapsed="0.000288"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:21:12.324967" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:21:12.324414" elapsed="0.000585"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:21:12.325479" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:21:12.325166" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:21:12.325551" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:21:12.325718" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:21:12.323898" elapsed="0.001844"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:21:12.332724" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:12.332571" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:12.332546" elapsed="0.000270"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:21:12.334355" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:12.334227" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:12.334208" elapsed="0.000219"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:21:12.335057" level="INFO">${karaf_connection_index} = 26</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:21:12.334620" elapsed="0.000471"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:21:12.335581" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:21:12.335303" elapsed="0.000312"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:21:12.336579" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:21:12.336253" elapsed="0.001175">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:21:12.337639" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:21:12.337687" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:12.335829" elapsed="0.001884"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:21:12.338661" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:21:12.338397" elapsed="0.001047">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:21:12.339668" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:21:12.339727" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:12.337919" elapsed="0.001842"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:21:12.340909" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_Stop_BGP_Peer"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:21:12.340161" elapsed="0.000844">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_Stop_BGP_Peer"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:21:12.339859" elapsed="0.001222">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_Stop_BGP_Peer"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:21:12.339835" elapsed="0.001283">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_Stop_BGP_Peer"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:12.341303" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:12.341579" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:12.341394" elapsed="0.000251"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:12.341376" elapsed="0.000302"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:21:12.341720" elapsed="0.000018"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:21:12.345197" elapsed="0.000200"/>
</kw>
<msg time="2026-04-17T03:21:12.345490" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:21:12.343731" elapsed="0.001915"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:12.345972" elapsed="0.000100"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:12.346382" 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-04-17T03:21:12.342701" elapsed="0.003896"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:21:12.342059" 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="FAIL" start="2026-04-17T03:21:12.333825" elapsed="0.012965">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_Stop_BGP_Peer"</status>
</kw>
<msg time="2026-04-17T03:21:12.346934" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:21:12.347059" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC1_Stop_BGP_Peer"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:12.333050" elapsed="0.014035"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:21:12.347300" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:12.347181" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:12.347153" elapsed="0.000216"/>
</if>
<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-04-17T03:21:12.348600" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:12.348462" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:12.348444" elapsed="0.000239"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:21:12.349132" level="INFO">index=15
host=10.30.171.238
alias=bgp_peer_console
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-04-17T03:21:12.349275" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=bgp_peer_console
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=st...</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:21:12.348938" elapsed="0.000370"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:12.349877" level="INFO">{1: 26}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:12.349525" elapsed="0.000410"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:12.350385" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:12.350110" elapsed="0.000320"/>
</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-04-17T03:21:12.351198" elapsed="0.000342"/>
</kw>
<msg time="2026-04-17T03:21:12.351674" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:21:12.351722" level="INFO">${old_connection_index} = 26</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:12.350648" elapsed="0.001097"/>
</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-04-17T03:21:12.352677" elapsed="0.000225"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:21:12.354100" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:21:12.353647" elapsed="0.001446">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:12.353148" elapsed="0.002049"/>
</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-04-17T03:21:12.355848" elapsed="0.000308"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:12.355373" elapsed="0.000870"/>
</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-04-17T03:21:12.352078" elapsed="0.004212"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:12.351825" elapsed="0.004514"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:12.351806" elapsed="0.004560"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:21:12.357318" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:21:12.356966" elapsed="0.000380"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:21:12.357397" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:21:12.357561" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:21:12.356596" elapsed="0.001068"/>
</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-04-17T03:21:12.357833" elapsed="0.000537"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:21:12.358674" level="INFO">index=27
host=10.30.170.120
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-04-17T03:21:12.358787" level="INFO">${karaf_connection_object} = index=27
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:21:12.358552" elapsed="0.000268"/>
</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-04-17T03:21:12.359000" elapsed="0.002681"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:21:12.362143" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:21:12.364764" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:21:12.361853" elapsed="0.003425">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:21:12.384581" elapsed="0.000516"/>
</kw>
<msg time="2026-04-17T03:21:12.385206" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:21:12.383065" elapsed="0.002335"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:12.385622" elapsed="0.000028"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:12.385805" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:21:12.366293" elapsed="0.019602"/>
</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-04-17T03:21:12.365635" elapsed="0.020332"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:21:12.348134" elapsed="0.037936">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:12.386495" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:21:12.386575" 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="FAIL" start="2026-04-17T03:21:12.332166" elapsed="0.054545">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:21:12.386874" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:21:12.387191" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:12.326192" elapsed="0.061041"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:12.387732" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:12.387362" elapsed="0.000447"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:12.387330" elapsed="0.000515"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:21:12.326026" elapsed="0.061856"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:21:12.325801" elapsed="0.062137"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:21:12.322856" elapsed="0.065197"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:21:12.315447" elapsed="0.072690"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:12.314669" elapsed="0.073537"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:21:12.310822" elapsed="0.077454"/>
</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-04-17T03:21:12.388795" elapsed="0.000177"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:12.388463" elapsed="0.000590"/>
</kw>
<kw name="Stop_Console_Tool" owner="BGPcliKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:21:12.390711" 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-04-17T03:21:12.390248" elapsed="0.000507"/>
</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-04-17T03:21:12.391272" elapsed="0.000406"/>
</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-04-17T03:21:12.389864" elapsed="0.001925"/>
</kw>
<kw name="Read" owner="SSHLibrary">
<msg time="2026-04-17T03:21:14.393826" level="INFO">^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-188-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-04-17T03:21:14.394297" level="INFO">${output} = ^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.ser...</msg>
<var>${output}</var>
<arg>delay=1s</arg>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-04-17T03:21:12.392048" elapsed="2.002321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:14.395905" level="INFO">^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-188-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-04-17T03:21:14.395136" elapsed="0.000984"/>
</kw>
<doc>Stop the tool if still running.</doc>
<status status="PASS" start="2026-04-17T03:21:12.389376" elapsed="2.006897"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:21:14.409765" level="INFO">Executing command 'cat bgp_peer.log'.</msg>
<msg time="2026-04-17T03:21:14.423011" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:21:14.423268" level="INFO">${output_log} = 2026-04-17 03:20:29,585 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:20:29,585 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.238
2026-04-17 03:20:29,585 DEBUG BGP-Thr...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-17T03:21:14.409591" elapsed="0.013719"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:14.424205" level="INFO">2026-04-17 03:20:29,585 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:20:29,585 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.238
2026-04-17 03:20:29,585 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-04-17 03:20:29,585 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.120
2026-04-17 03:20:29,585 DEBUG BGP-Thread-1 (job): Remote port: 1790</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:14.423666" elapsed="0.000614"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-04-17T03:21:14.425191" 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-04-17T03:21:14.424600" elapsed="0.000677"/>
</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-04-17T03:21:14.409072" elapsed="0.016310"/>
</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-04-17T03:21:14.426413" elapsed="0.000385"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-04-17T03:21:14.425842" elapsed="0.001054"/>
</kw>
<doc>Stop BGP peer tool</doc>
<tag>critical</tag>
<status status="PASS" start="2026-04-17T03:21:12.310177" elapsed="2.116802"/>
</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-04-17T03:21:14.432838" elapsed="0.000366"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:21:14.432415" elapsed="0.000878"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:21:14.434960" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:14.434791" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:14.434762" elapsed="0.000282"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:21:14.440860" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:14.440741" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:14.440721" elapsed="0.000232"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:21:14.442111" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:21:14.441650" elapsed="0.000492"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:21:14.442694" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:21:14.442364" elapsed="0.000358"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:21:14.442772" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:21:14.442972" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:21:14.441224" elapsed="0.001776"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:21:14.449356" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:14.449224" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:14.449203" 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-04-17T03:21:14.450922" elapsed="0.000042"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:14.450803" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:14.450785" elapsed="0.000236"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:21:14.451522" level="INFO">${karaf_connection_index} = 27</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:21:14.451181" elapsed="0.000370"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:21:14.451964" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:21:14.451720" elapsed="0.000278"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:21:14.452890" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:21:14.452590" elapsed="0.001227">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:21:14.454030" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:21:14.454077" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:14.452185" elapsed="0.001917"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:21:14.454921" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:21:14.454670" elapsed="0.000944">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:21:14.455803" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:21:14.455849" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:14.454276" elapsed="0.001596"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:21:14.456846" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_Reconnect_BGP_Peer"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:21:14.456219" elapsed="0.000690">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_Reconnect_BGP_Peer"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:21:14.455987" elapsed="0.001014">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_Reconnect_BGP_Peer"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:21:14.455932" elapsed="0.001103">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_Reconnect_BGP_Peer"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:14.457203" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:14.457432" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:14.457290" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:14.457273" elapsed="0.000235"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:21:14.457540" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:21:14.460351" elapsed="0.000160"/>
</kw>
<msg time="2026-04-17T03:21:14.460581" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:21:14.459154" elapsed="0.001566"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:14.461046" elapsed="0.000080"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:14.461406" 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-04-17T03:21:14.458466" elapsed="0.003135"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:21:14.457831" elapsed="0.003838"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:21:14.450233" elapsed="0.011530">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_Reconnect_BGP_Peer"</status>
</kw>
<msg time="2026-04-17T03:21:14.461932" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:21:14.461995" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_Reconnect_BGP_Peer"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:14.449595" elapsed="0.012426"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:21:14.462223" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:14.462104" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:14.462085" elapsed="0.000224"/>
</if>
<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-04-17T03:21:14.463285" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:14.463177" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:14.463159" elapsed="0.000195"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:21:14.463669" level="INFO">index=15
host=10.30.171.238
alias=bgp_peer_console
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-04-17T03:21:14.463806" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=bgp_peer_console
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=st...</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:21:14.463512" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:14.464413" level="INFO">{1: 27}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:14.464126" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:14.464874" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:14.464625" elapsed="0.000294"/>
</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-04-17T03:21:14.465486" elapsed="0.000273"/>
</kw>
<msg time="2026-04-17T03:21:14.465859" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:21:14.465906" level="INFO">${old_connection_index} = 27</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:14.465100" elapsed="0.000833"/>
</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-04-17T03:21:14.466807" elapsed="0.000216"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:21:14.468386" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:21:14.467678" elapsed="0.001642">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:14.467193" elapsed="0.002229"/>
</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-04-17T03:21:14.470097" elapsed="0.000283"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:14.469597" elapsed="0.000916"/>
</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-04-17T03:21:14.466252" elapsed="0.004310"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:14.466024" elapsed="0.004588"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:14.466004" elapsed="0.004633"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:21:14.471519" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:21:14.471202" elapsed="0.000344"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:21:14.471596" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:21:14.471769" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:21:14.470852" elapsed="0.000941"/>
</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-04-17T03:21:14.471995" elapsed="0.000435"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:21:14.472714" level="INFO">index=28
host=10.30.170.120
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-04-17T03:21:14.472815" level="INFO">${karaf_connection_object} = index=28
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:21:14.472603" elapsed="0.000238"/>
</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-04-17T03:21:14.473011" elapsed="0.002409"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:21:14.475856" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:21:14.477329" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:21:14.475590" elapsed="0.002193">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:21:14.492720" elapsed="0.000781"/>
</kw>
<msg time="2026-04-17T03:21:14.493611" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:21:14.491154" elapsed="0.002633"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:14.493992" elapsed="0.000025"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:14.494166" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:21:14.478750" elapsed="0.015502"/>
</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-04-17T03:21:14.478111" elapsed="0.016192"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:21:14.462845" elapsed="0.031552">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:14.494835" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:21:14.494924" elapsed="0.000076"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:21:14.448839" elapsed="0.046276">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:21:14.495262" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:21:14.495317" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:14.443499" elapsed="0.051842"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:14.495717" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:14.495432" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:14.495409" elapsed="0.000392"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:21:14.443331" elapsed="0.052496"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:21:14.443133" elapsed="0.052733"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:21:14.440336" elapsed="0.055597"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:21:14.434390" elapsed="0.061720"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:14.433538" elapsed="0.062629"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:21:14.428226" elapsed="0.068000"/>
</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-04-17T03:21:14.496665" elapsed="0.000109"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:14.496374" elapsed="0.000456"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:21:14.507958" level="INFO">${start_cmd} = python3 play.py --amount 0 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --peerport=1790 --debug </msg>
<var>${start_cmd}</var>
<arg>${command} ${tool_opt}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:21:14.507560" elapsed="0.000429"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:14.508407" level="INFO">python3 play.py --amount 0 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --peerport=1790 --debug </msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:14.508154" elapsed="0.000299"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:21:14.519248" level="INFO">python3 play.py --amount 0 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --peerport=1790 --debug  [A[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[K</msg>
<msg time="2026-04-17T03:21:14.519476" level="INFO">${output} = python3 play.py --amount 0 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --peerport=1790 --debug  [A[C[C[C[C[C[C[C...</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-17T03:21:14.508606" elapsed="0.010916"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:14.520095" level="INFO">python3 play.py --amount 0 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --peerport=1790 --debug  [A[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[K 
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:14.519763" elapsed="0.000591"/>
</kw>
<arg>${BGP_PEER_COMMAND}</arg>
<arg>${BGP_PEER_OPTIONS}</arg>
<doc>Start the tool ${command} ${tool_opt}</doc>
<status status="PASS" start="2026-04-17T03:21:14.507129" elapsed="0.013297"/>
</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-04-17T03:21:24.522991" level="FAIL">No match found for '&gt;' in 10 seconds
Output:
[?2004l2026-04-17 03:21:14,582 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:21:14,582 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.238
2026-04-17 03:21:14,582 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-04-17 03:21:14,583 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.120
2026-04-17 03:21:14,583 DEBUG BGP-Thread-1 (job): Remote port: 1790
Exception in thread Thread-1 (job):
Traceback (most recent call last):
  File "/usr/lib/python3.10/threading.py", line 1016, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.10/threading.py", line 953, in run
    self._target(*self._args, **self._kwargs)
  File "/home/jenkins/play.py", line 2406, in job
    bgp_socket = establish_connection(arguments)
  File "/home/jenkins/play.py", line 284, in establish_connection
    talking_socket.connect((str(arguments.peerip), arguments.peerport))
ConnectionRefusedError: [Errno 111] Connection refused
.</msg>
<var>${text}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="FAIL" start="2026-04-17T03:21:14.522386" elapsed="10.001456">No match found for '&gt;' in 10 seconds
Output:
[?2004l2026-04-17 03:21:14,582 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:21:14,582 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.238
2026-04-17 03:21:14,582 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-04-17 03:21:14,583 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.120
2026-04-17 03:21:14,583 DEBUG BGP-Thread-1 (job): Remote port: 1790
Exception in thread Thread-1 (job):
Traceback (most recent call last):
  File "/usr/lib/python3.10/threading.py", line 1016, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.10/threading.py", line 953, in run
    self._target(*self._args, **self._kwargs)
  File "/home/jenkins/play.py", line 2406, in job
    bgp_socket = establish_connection(arguments)
  File "/home/jenkins/play.py", line 284, in establish_connection
    talking_socket.connect((str(arguments.peerip), arguments.peerport))
ConnectionRefusedError: [Errno 111] Connection refused
.</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-04-17T03:21:24.524191" 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-04-17T03:21:14.522067" elapsed="10.002297">No match found for '&gt;' in 10 seconds
Output:
[?2004l2026-04-17 03:21:14,582 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:21:14,582 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.238
2026-04-17 03:21:14,582 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-04-17 03:21:14,583 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.120
2026-04-17 03:21:14,583 DEBUG BGP-Thread-1 (job): Remote port: 1790
Exception in thread Thread-1 (job):
Traceback (most recent call last):
  File "/usr/lib/python3.10/threading.py", line 1016, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.10/threading.py", line 953, in run
    self._target(*self._args, **self._kwargs)
  File "/home/jenkins/play.py", line 2406, in job
    bgp_socket = establish_connection(arguments)
  File "/home/jenkins/play.py", line 284, in establish_connection
    talking_socket.connect((str(arguments.peerip), arguments.peerport))
ConnectionRefusedError: [Errno 111] Connection refused
.</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-04-17T03:21:14.521580" elapsed="10.002929"/>
</kw>
<msg time="2026-04-17T03:21:24.524635" 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-04-17T03:21:14.521140" elapsed="10.003526"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-04-17T03:21:24.524861" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-04-17T03:21:24.524764" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:24.524738" elapsed="0.000230"/>
</if>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<doc>Send all output produced by the play.py utility to Robot logs.
This needs to be called if your suite detects play.py crashing and bypasses
Kill_BGP_Speaker in that case otherwise the output of play.py (which most
likely contains clues about why it crashed) will be lost.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:24.525213" elapsed="0.000027"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was seen but it was not expected yet</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:24.525392" elapsed="0.000021"/>
</kw>
<doc>Try to read SSH to see prompt, but expect to see no prompt within SSHLibrary's timeout.</doc>
<status status="PASS" start="2026-04-17T03:21:14.520772" elapsed="10.004709"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:21:24.538837" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:21:24.552114" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:21:24.552432" 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-04-17T03:21:24.538543" elapsed="0.013953"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:24.553792" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:24.553014" elapsed="0.000890"/>
</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-04-17T03:21:24.554339" elapsed="0.000942"/>
</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-04-17T03:21:24.537952" elapsed="0.017548"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:21:24.572814" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:21:24.602294" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:21:24.602511" 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-04-17T03:21:24.572637" elapsed="0.029909"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:24.603319" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:24.602962" elapsed="0.000404"/>
</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-04-17T03:21:24.603523" elapsed="0.000368"/>
</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-04-17T03:21:24.572236" elapsed="0.031745"/>
</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-04-17T03:21:24.604632" elapsed="0.000260"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-04-17T03:21:24.604298" elapsed="0.000681"/>
</kw>
<doc>Start BGP peer tool</doc>
<tag>critical</tag>
<status status="PASS" start="2026-04-17T03:21:14.427457" elapsed="10.177562"/>
</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-04-17T03:21:24.609520" elapsed="0.000218"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:21:24.609246" 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-04-17T03:21:24.611378" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:24.611063" elapsed="0.000425"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:24.610992" elapsed="0.000547"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:21:24.617095" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:24.616974" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:24.616953" elapsed="0.000219"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:21:24.618364" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:21:24.617897" elapsed="0.000510"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:21:24.618906" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:21:24.618589" elapsed="0.000362"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:21:24.618999" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:21:24.619171" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:21:24.617453" elapsed="0.001743"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:21:24.625333" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:24.625220" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:24.625201" 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-04-17T03:21:24.626700" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:24.626590" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:24.626572" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:21:24.627325" level="INFO">${karaf_connection_index} = 28</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:21:24.626920" elapsed="0.000436"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:21:24.627820" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:21:24.627540" elapsed="0.000308"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:21:24.628720" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:21:24.628401" elapsed="0.001271">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:21:24.629869" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:21:24.629918" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:24.628039" elapsed="0.001922"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:21:24.630875" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:21:24.630554" elapsed="0.001001">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:21:24.631775" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:21:24.631825" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:24.630158" elapsed="0.001692"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:21:24.632892" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_BGP_Application_Peer_Put_3_Routes"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:21:24.632258" elapsed="0.000719">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_BGP_Application_Peer_Put_3_Routes"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:21:24.632027" elapsed="0.001025">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_BGP_Application_Peer_Put_3_Routes"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:21:24.632006" elapsed="0.001080">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_BGP_Application_Peer_Put_3_Routes"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:24.633252" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:24.633513" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:24.633353" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:24.633329" elapsed="0.000263"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:21:24.633626" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:21:24.636639" elapsed="0.000205"/>
</kw>
<msg time="2026-04-17T03:21:24.636954" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:21:24.635185" elapsed="0.001914"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:24.637455" elapsed="0.000080"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:24.637805" 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-04-17T03:21:24.634480" elapsed="0.003729"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:21:24.633911" elapsed="0.004370"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:21:24.626279" elapsed="0.012093">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_BGP_Application_Peer_Put_3_Routes"</status>
</kw>
<msg time="2026-04-17T03:21:24.638480" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:21:24.638526" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_BGP_Application_Peer_Put_3_Routes"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:24.625559" elapsed="0.012991"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:21:24.638740" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:24.638628" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:24.638608" elapsed="0.000209"/>
</if>
<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-04-17T03:21:24.639775" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:24.639636" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:24.639618" elapsed="0.000225"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:21:24.640216" level="INFO">index=15
host=10.30.171.238
alias=bgp_peer_console
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-04-17T03:21:24.640325" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=bgp_peer_console
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=st...</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:21:24.640086" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:24.640782" level="INFO">{1: 28}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:24.640509" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:24.641252" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:24.640999" elapsed="0.000298"/>
</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-04-17T03:21:24.641835" elapsed="0.000337"/>
</kw>
<msg time="2026-04-17T03:21:24.642273" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:21:24.642320" level="INFO">${old_connection_index} = 28</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:24.641458" elapsed="0.000884"/>
</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-04-17T03:21:24.643225" elapsed="0.000199"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:21:24.644655" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:21:24.644227" elapsed="0.001770">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:24.643595" elapsed="0.002505"/>
</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-04-17T03:21:24.646757" elapsed="0.000299"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:24.646280" elapsed="0.000863"/>
</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-04-17T03:21:24.642663" elapsed="0.004526"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:24.642436" elapsed="0.004802"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:24.642416" elapsed="0.004848"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:21:24.648234" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:21:24.647848" elapsed="0.000413"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:21:24.648311" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:21:24.648470" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:21:24.647477" elapsed="0.001018"/>
</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-04-17T03:21:24.648655" elapsed="0.000474"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:21:24.649414" level="INFO">index=29
host=10.30.170.120
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-04-17T03:21:24.649514" level="INFO">${karaf_connection_object} = index=29
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:21:24.649304" elapsed="0.000237"/>
</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-04-17T03:21:24.649691" elapsed="0.002521"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:21:24.652672" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:21:24.662712" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:21:24.652403" elapsed="0.011425">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:21:24.686714" elapsed="0.000686"/>
</kw>
<msg time="2026-04-17T03:21:24.687509" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:21:24.685053" elapsed="0.002652"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:24.687955" elapsed="0.000027"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:24.688144" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:21:24.666568" elapsed="0.021665"/>
</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-04-17T03:21:24.664703" elapsed="0.023581"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:21:24.639328" elapsed="0.049052">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:24.688787" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:21:24.688866" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:21:24.624854" elapsed="0.064152">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:21:24.689137" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:21:24.689182" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:24.619593" elapsed="0.069612"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:24.689661" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:24.689293" elapsed="0.000423"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:24.689272" elapsed="0.000470"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:21:24.619446" elapsed="0.070322"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:21:24.619259" elapsed="0.070552"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:21:24.616544" elapsed="0.073342"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:21:24.610514" elapsed="0.079621"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:24.610010" elapsed="0.080183"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:21:24.606264" elapsed="0.083990"/>
</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-04-17T03:21:24.690688" elapsed="0.000110"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:24.690403" elapsed="0.000453"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:21:24.700607" level="INFO">${start_cmd} = python3 bgp_app_peer.py --host 10.30.170.120 --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.120/tables=bgp-t...</msg>
<var>${start_cmd}</var>
<arg>${command} ${tool_opt}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:21:24.700229" elapsed="0.000408"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:24.701277" level="INFO">python3 bgp_app_peer.py --host 10.30.170.120 --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.120/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-04-17T03:21:24.700876" elapsed="0.000480"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:21:24.708198" level="INFO">python3 bgp_app_peer.py --host 10.30.170.120 --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.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family &amp;&gt;/dev/null</msg>
<msg time="2026-04-17T03:21:24.708379" level="INFO">${output} =  python3 bgp_app_peer.py --host 10.30.170.120 --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.120/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-04-17T03:21:24.701598" elapsed="0.006823"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:24.709126" level="INFO"> python3 bgp_app_peer.py --host 10.30.170.120 --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.120/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-04-17T03:21:24.708659" elapsed="0.000559"/>
</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-04-17T03:21:24.699673" elapsed="0.009656"/>
</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-04-17T03:21:24.841599" level="INFO">[?2004l[?2004h[jenkins@releng-26932-188-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-04-17T03:21:24.715381" elapsed="0.126391"/>
</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-04-17T03:21:24.714846" elapsed="0.127014"/>
</kw>
<arg>${BGP_APP_PEER_TIMEOUT}</arg>
<doc>Wait ${timeout} for the tool exit.</doc>
<status status="PASS" start="2026-04-17T03:21:24.714464" elapsed="0.127544"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:21:24.852144" level="INFO">Executing command 'cat bgp_app_peer.log'.</msg>
<msg time="2026-04-17T03:21:24.865129" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:21:24.865390" level="INFO">${output_log} = 2026-04-17 03:21:24,797 INFO: Put 3 prefix(es) in a single request (starting from 8.0.1.0/28) into 10.30.170.120:8181/rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:21:24.851925" elapsed="0.013525"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:24.866875" level="INFO">2026-04-17 03:21:24,797 INFO: Put 3 prefix(es) in a single request (starting from 8.0.1.0/28) into 10.30.170.120:8181/rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:24.866032" elapsed="0.001050"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-04-17T03:21:24.868646" 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-04-17T03:21:24.867677" elapsed="0.001101"/>
</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-04-17T03:21:24.851410" elapsed="0.017481"/>
</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-04-17T03:21:24.869959" elapsed="0.000406"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-04-17T03:21:24.869342" elapsed="0.001194"/>
</kw>
<doc>Start BGP application peer tool and give him 30s</doc>
<tag>critical</tag>
<status status="PASS" start="2026-04-17T03:21:24.605634" elapsed="0.264961"/>
</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-04-17T03:21:24.875767" elapsed="0.000332"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:21:24.875388" elapsed="0.000789"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:21:24.877541" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:24.877401" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:24.877375" elapsed="0.000242"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:21:24.883503" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:24.883383" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:24.883361" elapsed="0.000214"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:21:24.884708" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:21:24.884233" elapsed="0.000504"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:21:24.885234" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:21:24.884905" elapsed="0.000355"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:21:24.885306" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:21:24.885483" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:21:24.883824" elapsed="0.001694"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:21:24.891664" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:24.891498" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:24.891467" elapsed="0.000303"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:21:24.893315" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:24.893173" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:24.893154" elapsed="0.000238"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:21:24.893868" level="INFO">${karaf_connection_index} = 29</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:21:24.893547" elapsed="0.000349"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:21:24.894313" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:21:24.894082" elapsed="0.000258"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:21:24.895162" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:21:24.894847" elapsed="0.001282">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:21:24.896377" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:21:24.896433" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:24.894499" elapsed="0.001996"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:21:24.897357" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:21:24.897076" elapsed="0.001005">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:21:24.898270" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:21:24.898318" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:24.896680" elapsed="0.001662"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:21:24.899527" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_Check_Example-IPv4-Topology_Is_Filled_With_3_Routes"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:21:24.898696" elapsed="0.000914">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_Check_Example-IPv4-Topology_Is_Filled_With_3_Routes"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:21:24.898417" elapsed="0.001272">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_Check_Example-IPv4-Topology_Is_Filled_With_3_Routes"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:21:24.898398" elapsed="0.001552">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_Check_Example-IPv4-Topology_Is_Filled_With_3_Routes"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:24.900257" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:24.900542" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:24.900351" elapsed="0.000247"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:24.900334" elapsed="0.000289"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:21:24.900657" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:21:24.903837" elapsed="0.000216"/>
</kw>
<msg time="2026-04-17T03:21:24.904145" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:21:24.902405" elapsed="0.001914"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:24.904681" elapsed="0.000080"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:24.905082" 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-04-17T03:21:24.901635" elapsed="0.003633"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:21:24.900968" elapsed="0.004366"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:21:24.892753" elapsed="0.012671">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_Check_Example-IPv4-Topology_Is_Filled_With_3_Routes"</status>
</kw>
<msg time="2026-04-17T03:21:24.905530" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:21:24.905574" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_Check_Example-IPv4-Topology_Is_Filled_With_3_Routes"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:24.891978" elapsed="0.013621"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:21:24.905839" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:24.905726" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:24.905706" elapsed="0.000200"/>
</if>
<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-04-17T03:21:24.906787" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:24.906678" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:24.906659" elapsed="0.000195"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:21:24.907168" level="INFO">index=16
host=10.30.171.238
alias=bgp_app_peer_console
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-04-17T03:21:24.907278" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.238
alias=bgp_app_peer_console
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_error...</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:21:24.907032" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:24.907789" level="INFO">{1: 29}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:24.907495" elapsed="0.000360"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:24.908308" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:24.908036" elapsed="0.000318"/>
</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-04-17T03:21:24.909355" elapsed="0.000365"/>
</kw>
<msg time="2026-04-17T03:21:24.909828" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:21:24.909875" level="INFO">${old_connection_index} = 29</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:24.908576" elapsed="0.001321"/>
</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-04-17T03:21:24.910909" elapsed="0.000439"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:21:24.912483" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:21:24.912037" elapsed="0.001561">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:24.911521" elapsed="0.002180"/>
</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-04-17T03:21:24.914429" elapsed="0.000289"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:24.913877" elapsed="0.000927"/>
</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-04-17T03:21:24.910266" elapsed="0.004584"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:24.909996" elapsed="0.005008"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:24.909974" elapsed="0.005061"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:21:24.916003" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:21:24.915630" elapsed="0.000402"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:21:24.916084" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:21:24.916251" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:21:24.915271" elapsed="0.001006"/>
</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-04-17T03:21:24.916438" elapsed="0.000511"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:21:24.917251" level="INFO">index=30
host=10.30.170.120
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-04-17T03:21:24.917354" level="INFO">${karaf_connection_object} = index=30
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:21:24.917130" elapsed="0.000250"/>
</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-04-17T03:21:24.917554" elapsed="0.002800"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:21:24.920883" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:21:24.922306" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:21:24.920600" elapsed="0.002139">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:21:24.937882" elapsed="0.000549"/>
</kw>
<msg time="2026-04-17T03:21:24.938537" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:21:24.936323" elapsed="0.002381"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:24.938881" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:24.939072" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:21:24.923753" elapsed="0.015406"/>
</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-04-17T03:21:24.923174" elapsed="0.016033"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:21:24.906374" elapsed="0.032930">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:24.939720" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:21:24.939800" elapsed="0.000024"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:21:24.891091" elapsed="0.048832">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:21:24.940072" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:21:24.940146" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:24.886025" elapsed="0.054153"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:24.940714" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:24.940290" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:24.940264" elapsed="0.000552"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:21:24.885854" elapsed="0.054990"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:21:24.885603" elapsed="0.055279"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:21:24.882984" elapsed="0.058193"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:21:24.877085" elapsed="0.064238"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:24.876441" elapsed="0.064933"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:21:24.871806" elapsed="0.069629"/>
</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-04-17T03:21:24.999067" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:21:24.998581" elapsed="0.000529"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:25.000162" 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-04-17T03:21:24.999671" elapsed="0.000601">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-04-17T03:21:25.000376" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:24.999311" elapsed="0.001090"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:21:25.001016" 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-04-17T03:21:25.000574" elapsed="0.000481"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:21:25.001418" 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-04-17T03:21:25.001606" 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-04-17T03:21:25.001259" elapsed="0.000374"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:25.002100" 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-04-17T03:21:25.001797" elapsed="0.000355"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:25.003601" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:25.003088" elapsed="0.000577"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:21:25.004253" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:21:25.003829" elapsed="0.000464"/>
</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-04-17T03:21:25.004725" elapsed="0.000047"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:25.005597" 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-04-17T03:21:25.005959" elapsed="0.000048"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:21:25.004535" elapsed="0.001592"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:21:25.004358" elapsed="0.001838"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:21:25.006249" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:21:25.006425" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:21:25.002674" elapsed="0.003775"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:25.002247" elapsed="0.004234"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:25.006655" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:25.006506" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:25.002210" elapsed="0.004519"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:21:25.007415" 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-04-17T03:21:25.006875" elapsed="0.000578"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:21:25.007515" 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//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-04-17T03:21:24.997730" elapsed="0.009950"/>
</kw>
<msg time="2026-04-17T03:21:25.007839" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:21:24.984140" elapsed="0.023778"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:21:25.024656" elapsed="0.000089"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:21:25.038649" 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-04-17T03:21:25.052008" elapsed="0.000041"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:25.052271" 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-04-17T03:21:25.052503" 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-04-17T03:21:25.053047" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:25.052834" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:25.052815" 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-04-17T03:21:25.053288" 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-04-17T03:21:25.053457" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:25.053625" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:21:25.052772" elapsed="0.000906"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:21:25.052627" elapsed="0.001079"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:25.053853" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:25.053950" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:21:25.054121" 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-04-17T03:21:24.979449" elapsed="0.074703"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:25.055662" 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-04-17T03:21:25.055356" elapsed="0.000384">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-04-17T03:21:25.055837" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:25.054868" 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-04-17T03:21:25.056297" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:25.055953" elapsed="0.000404"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:21:25.056881" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:21:25.056571" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:25.056383" elapsed="0.000618"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:25.055917" elapsed="0.001107"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:21:25.059704" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:21:25.057195" elapsed="0.002545"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:21:25.059810" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:21:25.060055" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:21:25.054500" elapsed="0.005590"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:25.061786" 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-04-17T03:21:25.061467" elapsed="0.000412">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-04-17T03:21:25.062028" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:25.060997" elapsed="0.001067"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:21:25.062346" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-17T03:21:25.062164" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:25.062138" elapsed="0.000326"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:25.062670" elapsed="0.000030"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:25.062914" elapsed="0.000049"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:21:25.063028" elapsed="0.000021"/>
</return>
<msg time="2026-04-17T03:21:25.066000" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:21:25.060513" elapsed="0.005525"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:25.067951" 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-04-17T03:21:25.067584" elapsed="0.000428"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:25.068542" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:25.068217" 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-04-17T03:21:25.074329" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:25.276115" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:25.679189" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:25.682317" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:21:25.070864" elapsed="0.616919">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:21:25.068678" elapsed="0.619296">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:25.688350" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:25.688038" elapsed="0.000500"/>
</branch>
<status status="FAIL" start="2026-04-17T03:21:25.068656" elapsed="0.619917">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:25.689216" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:25.689471" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:25.689363" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:25.689336" elapsed="0.000269"/>
</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-04-17T03:21:25.689887" elapsed="0.000063"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:21:25.690035" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:21:25.066463" elapsed="0.623740">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:25.690326" 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-04-17T03:21:24.953556" elapsed="0.736946">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:25.691092" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:25.690680" elapsed="0.000531"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:25.690648" elapsed="0.000598"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:25.691295" elapsed="0.000021"/>
</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="FAIL" start="2026-04-17T03:21:24.947026" elapsed="0.744419">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:21:24.942509" elapsed="0.749085">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:21:26.752694" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:21:26.752256" elapsed="0.000474"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:26.753818" 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-04-17T03:21:26.753328" elapsed="0.000573">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-04-17T03:21:26.754030" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:26.752958" elapsed="0.001100"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:21:26.754636" 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-04-17T03:21:26.754231" elapsed="0.000505"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:21:26.755086" 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-04-17T03:21:26.755248" 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-04-17T03:21:26.754907" elapsed="0.000369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:26.755705" 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-04-17T03:21:26.755440" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:26.757118" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:26.756629" elapsed="0.000555"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:21:26.757764" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:21:26.757352" elapsed="0.000440"/>
</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-04-17T03:21:26.758236" elapsed="0.000048"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:26.759011" elapsed="0.000053"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:21:26.759400" elapsed="0.000049"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:21:26.758038" elapsed="0.001539"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:21:26.757849" elapsed="0.001800"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:21:26.759705" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:21:26.759894" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:21:26.756228" elapsed="0.003692"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:26.755838" elapsed="0.004134"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:26.760157" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:26.760001" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:26.755812" elapsed="0.004424"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:21:26.760884" 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-04-17T03:21:26.760387" elapsed="0.000527"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:21:26.760982" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:21:26.751473" elapsed="0.009642"/>
</kw>
<msg time="2026-04-17T03:21:26.761173" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:21:26.738488" elapsed="0.022741"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:21:26.776528" elapsed="0.000064"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:21:26.792229" elapsed="0.000071"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:21:26.806453" elapsed="0.000051"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:26.806821" 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-04-17T03:21:26.807029" 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-04-17T03:21:26.807473" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:26.807319" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:26.807302" 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-04-17T03:21:26.807702" 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-04-17T03:21:26.807874" 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-04-17T03:21:26.808074" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:21:26.807263" elapsed="0.000871"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:21:26.807130" elapsed="0.001032"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:26.808314" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:26.808396" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:21:26.808560" 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-04-17T03:21:26.733661" elapsed="0.074927"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:26.810152" 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-04-17T03:21:26.809823" elapsed="0.000408">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-04-17T03:21:26.810330" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:26.809366" 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-04-17T03:21:26.810710" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:26.810426" elapsed="0.000348"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:21:26.811338" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:21:26.811004" elapsed="0.000361"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:26.810799" elapsed="0.000601"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:26.810408" elapsed="0.001013"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:21:26.814121" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:21:26.811587" elapsed="0.002575"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:21:26.814230" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:21:26.814402" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:21:26.808977" elapsed="0.005450"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:26.815773" 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-04-17T03:21:26.815518" elapsed="0.000325">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-04-17T03:21:26.815960" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:26.815152" elapsed="0.000834"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:21:26.816293" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:21:26.816145" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:26.816121" elapsed="0.000260"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:26.816533" elapsed="0.000024"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:26.816710" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:21:26.816778" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:21:26.819128" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:21:26.814752" elapsed="0.004414"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:26.820787" 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-04-17T03:21:26.820511" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:26.821263" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:26.821011" 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="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:21:26.826574" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:27.028290" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:27.431440" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:27.434642" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:21:26.823621" elapsed="0.616913">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:21:26.821376" elapsed="0.619313">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:27.441105" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:27.440745" elapsed="0.000447"/>
</branch>
<status status="FAIL" start="2026-04-17T03:21:26.821357" elapsed="0.619867">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:27.441795" elapsed="0.000034"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:27.441994" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:27.441923" elapsed="0.000127"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:27.441897" 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-04-17T03:21:27.442272" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:21:27.442362" 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-04-17T03:21:26.819599" elapsed="0.622915">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:27.442691" 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-04-17T03:21:26.709031" elapsed="0.733789">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:27.443183" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:27.442951" elapsed="0.000340"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:27.442914" elapsed="0.000406"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:27.443359" elapsed="0.000017"/>
</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="FAIL" start="2026-04-17T03:21:26.702316" elapsed="0.741166">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:21:26.692339" elapsed="0.751264">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:21:28.501998" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:21:28.501527" elapsed="0.000555"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:28.503125" 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-04-17T03:21:28.502618" elapsed="0.000586">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-04-17T03:21:28.503303" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:28.502269" elapsed="0.001060"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:21:28.503897" 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-04-17T03:21:28.503499" elapsed="0.000443"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:21:28.504256" 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-04-17T03:21:28.504426" 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-04-17T03:21:28.504111" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:28.504872" 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-04-17T03:21:28.504618" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:28.506196" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:28.505714" elapsed="0.000544"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:21:28.506785" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:21:28.506423" elapsed="0.000389"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:28.507240" elapsed="0.000047"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:28.508011" 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-04-17T03:21:28.508355" elapsed="0.000046"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:21:28.507048" elapsed="0.001550"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:21:28.506866" elapsed="0.001803"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:21:28.508722" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:21:28.508898" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:21:28.505335" elapsed="0.003604"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:28.505017" elapsed="0.003958"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:28.509152" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:28.509000" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:28.504992" elapsed="0.004239"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:21:28.509858" 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-04-17T03:21:28.509376" elapsed="0.000511"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:21:28.509954" 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-04-17T03:21:28.500869" elapsed="0.009215"/>
</kw>
<msg time="2026-04-17T03:21:28.510140" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:21:28.487975" elapsed="0.022216"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:21:28.523089" 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//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-04-17T03:21:28.535865" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:28.548819" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:28.549043" 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-04-17T03:21:28.549247" 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-04-17T03:21:28.549652" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:28.549483" elapsed="0.000242"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:28.549468" elapsed="0.000290"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:28.549923" elapsed="0.000038"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:28.550130" 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-04-17T03:21:28.550307" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:21:28.549438" elapsed="0.000924"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:21:28.549329" elapsed="0.001061"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:28.550541" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:28.550666" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:21:28.550804" 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-04-17T03:21:28.483532" elapsed="0.067300"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:28.552275" 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-04-17T03:21:28.551954" elapsed="0.000395">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-04-17T03:21:28.552451" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:28.551568" elapsed="0.000910"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:28.552813" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:28.552553" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:21:28.553422" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:21:28.553111" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:28.552897" elapsed="0.000588"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:28.552533" elapsed="0.000974"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:21:28.556049" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:21:28.553695" elapsed="0.002388"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:21:28.556150" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:21:28.556343" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:21:28.551214" elapsed="0.005158"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:28.558007" 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-04-17T03:21:28.557733" elapsed="0.000342">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-04-17T03:21:28.558173" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:28.557320" elapsed="0.000879"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:21:28.558414" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-17T03:21:28.558271" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:28.558252" elapsed="0.000251"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:28.558674" elapsed="0.000024"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:28.558853" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:21:28.558919" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:21:28.561078" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:21:28.556729" elapsed="0.004377"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:28.562644" 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-04-17T03:21:28.562376" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:28.563125" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:28.562852" elapsed="0.000319"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:21:28.568824" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:28.770895" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:29.173412" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:29.176336" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:21:28.565405" elapsed="0.615682">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:21:28.563239" elapsed="0.618011">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:29.181646" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:29.181315" elapsed="0.000433"/>
</branch>
<status status="FAIL" start="2026-04-17T03:21:28.563220" elapsed="0.618563">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:29.182463" elapsed="0.000042"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:29.182678" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:29.182619" elapsed="0.000126"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:29.182589" elapsed="0.000188"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:29.183050" elapsed="0.000037"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:21:29.183161" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:21:28.561438" elapsed="0.621894">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:29.183445" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:21:28.460875" elapsed="0.722716">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:29.184016" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:29.183728" elapsed="0.000412"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:29.183702" elapsed="0.000485"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:29.184238" elapsed="0.000021"/>
</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="FAIL" start="2026-04-17T03:21:28.452962" elapsed="0.731427">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:21:28.444310" elapsed="0.740227">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:21:30.251979" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:21:30.251359" elapsed="0.000663"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:30.253175" 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-04-17T03:21:30.252649" elapsed="0.000611">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-04-17T03:21:30.253362" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:30.252254" elapsed="0.001134"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:21:30.254021" 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-04-17T03:21:30.253564" elapsed="0.000486"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:21:30.254583" 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-04-17T03:21:30.254780" 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-04-17T03:21:30.254401" elapsed="0.000405"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:30.255246" 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-04-17T03:21:30.254985" 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-04-17T03:21:30.256677" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:30.256199" elapsed="0.000542"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:21:30.257526" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:21:30.256976" elapsed="0.000578"/>
</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-04-17T03:21:30.258034" elapsed="0.000065"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:30.258794" 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-04-17T03:21:30.259209" elapsed="0.000066"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:21:30.257779" elapsed="0.001689"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:21:30.257612" elapsed="0.001933"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:21:30.259601" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:21:30.259783" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:21:30.255766" elapsed="0.004043"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:30.255379" elapsed="0.004464"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:30.260042" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:30.259869" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:30.255353" elapsed="0.004796"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:21:30.260774" 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-04-17T03:21:30.260311" elapsed="0.000492"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:21:30.260853" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:21:30.250322" elapsed="0.010697"/>
</kw>
<msg time="2026-04-17T03:21:30.261077" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:21:30.232422" elapsed="0.028718"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:21:30.275666" elapsed="0.000054"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:21:30.289386" 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//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-04-17T03:21:30.302894" elapsed="0.000050"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:30.303154" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:30.303341" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:30.303760" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:30.303606" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:30.303588" 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-04-17T03:21:30.304006" 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-04-17T03:21:30.304178" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:30.304345" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:21:30.303548" elapsed="0.000849"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:21:30.303429" elapsed="0.000997"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:30.304572" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:30.304651" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:21:30.304807" 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-04-17T03:21:30.226351" elapsed="0.078485"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:30.306638" 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-04-17T03:21:30.306291" elapsed="0.000440">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-04-17T03:21:30.306856" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:30.305841" elapsed="0.001050"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:30.307270" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:30.306998" elapsed="0.000399"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:21:30.307991" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:21:30.307635" elapsed="0.000384"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:30.307427" elapsed="0.000628"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:30.306979" elapsed="0.001098"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:21:30.311360" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:21:30.308244" elapsed="0.003158"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:21:30.311483" elapsed="0.000055"/>
</return>
<msg time="2026-04-17T03:21:30.311724" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:21:30.305462" elapsed="0.006290"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:30.313764" 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-04-17T03:21:30.313377" elapsed="0.000491">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-04-17T03:21:30.314025" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:30.312771" elapsed="0.001292"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:21:30.314384" elapsed="0.000044"/>
</return>
<status status="PASS" start="2026-04-17T03:21:30.314175" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:30.314145" elapsed="0.000375"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:30.314746" 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-04-17T03:21:30.315045" elapsed="0.000033"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:21:30.315147" elapsed="0.000024"/>
</return>
<msg time="2026-04-17T03:21:30.318223" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:21:30.312274" elapsed="0.005989"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:30.320488" 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-04-17T03:21:30.320098" elapsed="0.000465"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:30.321213" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:30.320788" elapsed="0.000493"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:21:30.328453" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:30.530189" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:30.932762" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:30.934979" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:21:30.324654" elapsed="0.615119">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:21:30.321382" elapsed="0.618670">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:30.940614" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:30.940166" elapsed="0.000604"/>
</branch>
<status status="FAIL" start="2026-04-17T03:21:30.321354" elapsed="0.619469">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:30.941912" elapsed="0.000203"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:30.942397" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:30.942307" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:30.942260" elapsed="0.000285"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:30.942879" elapsed="0.000087"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:21:30.943075" 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-04-17T03:21:30.318753" elapsed="0.624445">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:30.943278" 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-04-17T03:21:30.202136" elapsed="0.741243">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:30.943664" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:30.943475" elapsed="0.000262"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:30.943459" elapsed="0.000301"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:30.943792" elapsed="0.000014"/>
</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="FAIL" start="2026-04-17T03:21:30.192586" elapsed="0.751309">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:21:30.185511" elapsed="0.758506">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:21:32.007706" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:21:32.007216" elapsed="0.000567"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:32.008842" 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-04-17T03:21:32.008399" elapsed="0.000552">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-04-17T03:21:32.009058" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:32.008003" elapsed="0.001082"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:21:32.009694" 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-04-17T03:21:32.009273" elapsed="0.000450"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:21:32.010172" 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-04-17T03:21:32.010341" 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-04-17T03:21:32.010006" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:32.010824" 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-04-17T03:21:32.010549" 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-04-17T03:21:32.012320" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:32.011815" elapsed="0.000572"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:21:32.012968" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:21:32.012569" elapsed="0.000429"/>
</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-04-17T03:21:32.013449" elapsed="0.000048"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:32.014257" 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-04-17T03:21:32.014621" elapsed="0.000046"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:21:32.013238" elapsed="0.001557"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:21:32.013057" elapsed="0.001810"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:21:32.014939" elapsed="0.000045"/>
</return>
<msg time="2026-04-17T03:21:32.015139" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:21:32.011400" elapsed="0.003766"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:32.010982" elapsed="0.004219"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:32.015399" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:32.015230" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:32.010951" elapsed="0.004530"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:21:32.016209" 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-04-17T03:21:32.015648" elapsed="0.000591"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:21:32.016291" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:21:32.006323" elapsed="0.010105"/>
</kw>
<msg time="2026-04-17T03:21:32.016488" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:21:31.992121" elapsed="0.024427"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:21:32.031523" elapsed="0.000072"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:21:32.046180" elapsed="0.000064"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:21:32.060638" elapsed="0.000070"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:32.061098" 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-04-17T03:21:32.061312" 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-04-17T03:21:32.061793" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:32.061616" elapsed="0.000237"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:32.061597" 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-04-17T03:21:32.062061" 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-04-17T03:21:32.062256" 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-04-17T03:21:32.062440" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:21:32.061555" elapsed="0.000941"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:21:32.061404" elapsed="0.001121"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:32.062692" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:32.062780" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:21:32.062973" 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-04-17T03:21:31.986992" elapsed="0.076012"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:32.064653" 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-04-17T03:21:32.064331" elapsed="0.000403">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-04-17T03:21:32.064836" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:32.063868" 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-04-17T03:21:32.065268" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:32.064958" elapsed="0.000373"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:21:32.065897" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:21:32.065572" elapsed="0.000369"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:32.065359" elapsed="0.000622"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:32.064919" elapsed="0.001086"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:21:32.068749" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:21:32.066178" elapsed="0.002600"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:21:32.068836" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:21:32.069029" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:21:32.063420" elapsed="0.005636"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:32.070505" 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-04-17T03:21:32.070213" elapsed="0.000367">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-04-17T03:21:32.070682" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:32.069797" elapsed="0.000912"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:21:32.070952" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-17T03:21:32.070787" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:32.070767" elapsed="0.000281"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:32.071383" elapsed="0.000025"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:32.071582" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:21:32.071653" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:21:32.074081" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:21:32.069422" elapsed="0.004688"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:32.075669" 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-04-17T03:21:32.075392" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:32.076206" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:32.075939" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:21:32.082165" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:32.284071" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:32.687011" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:32.690168" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:21:32.078680" elapsed="0.616937">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:21:32.076324" elapsed="0.619519">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:32.696544" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:32.696005" elapsed="0.000787"/>
</branch>
<status status="FAIL" start="2026-04-17T03:21:32.076305" elapsed="0.620563">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:32.697544" elapsed="0.000033"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:32.697698" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:32.697657" elapsed="0.000100"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:32.697636" 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-04-17T03:21:32.697965" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:21:32.698048" 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-04-17T03:21:32.074466" elapsed="0.623704">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:32.698260" 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-04-17T03:21:31.961902" elapsed="0.736486">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:32.698780" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:32.698573" elapsed="0.000292"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:32.698553" elapsed="0.000338"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:32.698925" elapsed="0.000047"/>
</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="FAIL" start="2026-04-17T03:21:31.952168" elapsed="0.746909">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:21:31.944689" elapsed="0.754502">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:21:33.760460" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:21:33.760027" elapsed="0.000469"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:33.761468" 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-04-17T03:21:33.761042" elapsed="0.000506">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-04-17T03:21:33.761649" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:33.760676" elapsed="0.000999"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:21:33.762384" 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-04-17T03:21:33.761865" elapsed="0.000550"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:21:33.762734" 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-04-17T03:21:33.762897" 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-04-17T03:21:33.762587" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:33.763384" 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-04-17T03:21:33.763131" 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-04-17T03:21:33.764679" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:33.764217" elapsed="0.000525"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:21:33.765307" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:21:33.764908" elapsed="0.000425"/>
</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-04-17T03:21:33.765748" elapsed="0.000049"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:33.766568" 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-04-17T03:21:33.766915" elapsed="0.000076"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:21:33.765555" elapsed="0.001561"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:21:33.765389" elapsed="0.001809"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:21:33.767253" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:21:33.767487" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:21:33.763813" elapsed="0.003699"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:33.763506" elapsed="0.004041"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:33.767723" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:33.767572" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:33.763482" elapsed="0.004319"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:21:33.768454" 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-04-17T03:21:33.767971" elapsed="0.000512"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:21:33.768533" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:21:33.759370" elapsed="0.009286"/>
</kw>
<msg time="2026-04-17T03:21:33.768712" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:21:33.746224" elapsed="0.022536"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:21:33.784457" 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-04-17T03:21:33.797123" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:33.810896" elapsed="0.000055"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:33.811170" 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-04-17T03:21:33.811356" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:33.811779" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:33.811626" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:33.811608" 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-04-17T03:21:33.812021" 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-04-17T03:21:33.812197" 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-04-17T03:21:33.812362" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:21:33.811568" elapsed="0.000847"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:21:33.811442" elapsed="0.001001"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:33.812590" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:33.812669" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:21:33.812828" 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-04-17T03:21:33.741664" elapsed="0.071275"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:33.814402" 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-04-17T03:21:33.814072" elapsed="0.000408">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-04-17T03:21:33.814574" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:33.813658" elapsed="0.000941"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:33.814955" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:33.814671" elapsed="0.000343"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:21:33.815577" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:21:33.815270" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:33.815039" elapsed="0.000599"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:33.814653" elapsed="0.001006"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:21:33.818018" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:21:33.815812" elapsed="0.002232"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:21:33.818095" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:21:33.818281" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:21:33.813298" elapsed="0.005014"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:33.819548" 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-04-17T03:21:33.819314" elapsed="0.000298">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-04-17T03:21:33.819706" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:33.818970" elapsed="0.000761"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:21:33.819952" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-17T03:21:33.819800" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:33.819783" elapsed="0.000256"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:33.820188" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:33.820360" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:21:33.820426" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:21:33.822584" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:21:33.818628" elapsed="0.003983"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:33.824081" 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-04-17T03:21:33.823806" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:33.824521" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:33.824280" 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-04-17T03:21:33.830068" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:34.031630" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:34.434767" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:34.437164" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:21:33.826786" elapsed="0.613861">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:21:33.824629" elapsed="0.616168">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:34.441212" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:34.440860" elapsed="0.000454"/>
</branch>
<status status="FAIL" start="2026-04-17T03:21:33.824611" elapsed="0.616738">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:34.442186" elapsed="0.000054"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:34.442456" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:34.442383" elapsed="0.000155"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:34.442345" elapsed="0.000233"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:34.442859" elapsed="0.000042"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:21:34.443018" elapsed="0.000031"/>
</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-04-17T03:21:33.822975" elapsed="0.620259">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:34.443352" 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-04-17T03:21:33.715275" elapsed="0.728222">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:34.444001" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:34.443630" elapsed="0.000483"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:34.443606" elapsed="0.000543"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:34.444195" elapsed="0.000021"/>
</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="FAIL" start="2026-04-17T03:21:33.707880" elapsed="0.736485">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:21:33.699794" elapsed="0.744741">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:21:35.503337" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:21:35.502906" elapsed="0.000468"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:35.504347" 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-04-17T03:21:35.503898" elapsed="0.000711">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-04-17T03:21:35.504708" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:35.503552" elapsed="0.001182"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:21:35.505426" 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-04-17T03:21:35.505021" elapsed="0.000433"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:21:35.505766" 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-04-17T03:21:35.505955" 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-04-17T03:21:35.505621" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:35.506406" 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-04-17T03:21:35.506147" 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-04-17T03:21:35.507692" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:35.507243" elapsed="0.000511"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:21:35.508302" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:21:35.507918" 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-04-17T03:21:35.508743" elapsed="0.000047"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:35.509615" 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-04-17T03:21:35.509989" elapsed="0.000046"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:21:35.508548" elapsed="0.001608"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:21:35.508382" elapsed="0.001843"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:21:35.510283" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:21:35.510459" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:21:35.506867" elapsed="0.003617"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:35.506529" elapsed="0.003987"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:35.510689" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:35.510540" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:35.506506" elapsed="0.004257"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:21:35.511476" 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-04-17T03:21:35.510907" elapsed="0.000596"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:21:35.511552" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:21:35.502064" elapsed="0.009612"/>
</kw>
<msg time="2026-04-17T03:21:35.511730" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:21:35.488354" elapsed="0.023426"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:21:35.527652" 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/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-04-17T03:21:35.540747" elapsed="0.000058"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:21:35.553410" elapsed="0.000102"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:35.553764" 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-04-17T03:21:35.553972" 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-04-17T03:21:35.554420" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:35.554264" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:35.554247" 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-04-17T03:21:35.554654" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:35.554828" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:35.555016" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:21:35.554205" elapsed="0.000867"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:21:35.554063" elapsed="0.001039"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:35.555253" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:35.555336" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:21:35.555501" 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-04-17T03:21:35.483781" elapsed="0.071748"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:35.557033" 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-04-17T03:21:35.556699" elapsed="0.000412">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-04-17T03:21:35.557214" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:35.556293" elapsed="0.000947"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:35.557622" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:35.557312" elapsed="0.000372"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:21:35.558217" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:21:35.557895" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:35.557708" elapsed="0.000635"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:35.557293" elapsed="0.001073"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:21:35.560797" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:21:35.558524" elapsed="0.002300"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:21:35.560878" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:21:35.561059" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:21:35.555905" elapsed="0.005179"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:35.562417" 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-04-17T03:21:35.562168" elapsed="0.000316">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-04-17T03:21:35.562581" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:35.561804" elapsed="0.000802"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:21:35.562814" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:21:35.562676" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:35.562658" elapsed="0.000242"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:35.563066" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:35.563240" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:21:35.563305" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:21:35.565431" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:21:35.561404" elapsed="0.004054"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:35.567044" 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-04-17T03:21:35.566736" elapsed="0.000357"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:35.567501" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:35.567251" 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-04-17T03:21:35.572998" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:35.775027" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:36.179833" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:36.182197" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:21:35.569837" elapsed="0.615424">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:21:35.567612" elapsed="0.617766">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:36.185671" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:36.185426" elapsed="0.000318"/>
</branch>
<status status="FAIL" start="2026-04-17T03:21:35.567593" elapsed="0.618178">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:36.186354" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:36.186543" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:36.186497" elapsed="0.000096"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:36.186476" elapsed="0.000141"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:36.186773" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:21:36.186852" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:21:35.565853" elapsed="0.621152">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:36.187087" 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-04-17T03:21:35.461039" elapsed="0.726160">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:36.187495" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:36.187302" elapsed="0.000269"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:36.187283" elapsed="0.000313"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:36.187631" elapsed="0.000015"/>
</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="FAIL" start="2026-04-17T03:21:35.453431" elapsed="0.734308">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:21:35.445461" elapsed="0.742384">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:21:36.187970" level="FAIL">Keyword 'Compare_Topology' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-17T03:21:24.941972" elapsed="11.246102">Keyword 'Compare_Topology' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>filled_topology</arg>
<doc>Wait until Compare_Topology matches expected result.</doc>
<status status="FAIL" start="2026-04-17T03:21:24.941595" elapsed="11.246602">Keyword 'Compare_Topology' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:36.189739" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:21:36.189393" elapsed="0.000393"/>
</kw>
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-04-17T03:21:36.188914" elapsed="0.000925"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-04-17T03:21:36.188545" elapsed="0.001353"/>
</kw>
<doc>See new routes in example-ipv4-topology as a proof that synchronization was correct.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:21:24.870903" elapsed="11.319054">Keyword 'Compare_Topology' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:21:36.193869" elapsed="0.000250"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:21:36.193588" 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-04-17T03:21:36.195281" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:36.195154" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:36.195133" elapsed="0.000219"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:21:36.200460" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:36.200350" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:36.200331" elapsed="0.000199"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:21:36.201694" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:21:36.201231" elapsed="0.000492"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:21:36.202235" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:21:36.201895" elapsed="0.000367"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:21:36.202309" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:21:36.202478" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:21:36.200762" elapsed="0.001741"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:21:36.208477" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:36.208362" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:36.208342" elapsed="0.000265"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:21:36.209881" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:36.209770" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:36.209751" elapsed="0.000224"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:21:36.210489" level="INFO">${karaf_connection_index} = 30</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:21:36.210127" elapsed="0.000393"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:21:36.211021" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:21:36.210691" elapsed="0.000358"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:21:36.212094" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:21:36.211591" elapsed="0.001186">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:21:36.212993" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:21:36.213043" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:36.211214" elapsed="0.001854"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:21:36.213973" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:21:36.213653" elapsed="0.001073">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:21:36.214988" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:21:36.215039" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:36.213259" elapsed="0.001804"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:21:36.216063" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_BGP_Peer_Check_Incomming_Updates_For_3_Introduced_Prefixes"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:21:36.215404" elapsed="0.000729">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_BGP_Peer_Check_Incomming_Updates_For_3_Introduced_Prefixes"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:21:36.215159" elapsed="0.001058">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_BGP_Peer_Check_Incomming_Updates_For_3_Introduced_Prefixes"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:21:36.215128" elapsed="0.001186">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_BGP_Peer_Check_Incomming_Updates_For_3_Introduced_Prefixes"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:36.216491" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:36.216724" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:36.216579" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:36.216562" elapsed="0.000239"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:21:36.216835" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:21:36.220096" elapsed="0.000203"/>
</kw>
<msg time="2026-04-17T03:21:36.220385" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:21:36.218605" elapsed="0.001949"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:36.220915" elapsed="0.000117"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:36.221385" 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-04-17T03:21:36.217767" elapsed="0.003855"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:21:36.217153" elapsed="0.004554"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:21:36.209412" elapsed="0.012411">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_BGP_Peer_Check_Incomming_Updates_For_3_Introduced_Prefixes"</status>
</kw>
<msg time="2026-04-17T03:21:36.221982" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:21:36.222040" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_BGP_Peer_Check_Incomming_Updates_For_3_Introduced_Prefixes"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:36.208766" elapsed="0.013305"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:21:36.222319" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:36.222175" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:36.222149" elapsed="0.000257"/>
</if>
<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-04-17T03:21:36.223634" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:36.223503" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:36.223480" elapsed="0.000239"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:21:36.224114" level="INFO">index=16
host=10.30.171.238
alias=bgp_app_peer_console
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-04-17T03:21:36.224242" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.238
alias=bgp_app_peer_console
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_error...</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:21:36.223932" elapsed="0.000342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:36.224747" level="INFO">{1: 30}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:36.224465" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:36.225214" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:36.224964" elapsed="0.000300"/>
</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-04-17T03:21:36.225849" elapsed="0.000303"/>
</kw>
<msg time="2026-04-17T03:21:36.226261" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:21:36.226309" level="INFO">${old_connection_index} = 30</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:36.225426" elapsed="0.000906"/>
</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-04-17T03:21:36.227273" elapsed="0.000202"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:21:36.228818" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:21:36.228154" elapsed="0.001743">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:36.227646" elapsed="0.002374"/>
</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-04-17T03:21:36.230681" elapsed="0.000477"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:36.230200" elapsed="0.001051"/>
</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-04-17T03:21:36.226634" elapsed="0.004723"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:36.226409" elapsed="0.004999"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:36.226390" elapsed="0.005045"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:21:36.232338" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:21:36.232014" elapsed="0.000352"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:21:36.232417" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:21:36.232579" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:21:36.231657" elapsed="0.000947"/>
</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-04-17T03:21:36.232761" elapsed="0.000475"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:21:36.233522" level="INFO">index=31
host=10.30.170.120
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-04-17T03:21:36.233638" level="INFO">${karaf_connection_object} = index=31
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:21:36.233411" elapsed="0.000263"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:21:36.233842" elapsed="0.002403"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:21:36.236684" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:21:36.237835" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:21:36.236416" elapsed="0.001863">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:21:36.254180" elapsed="0.000412"/>
</kw>
<msg time="2026-04-17T03:21:36.254692" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:21:36.252689" elapsed="0.002163"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:36.255065" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:36.255265" elapsed="0.000024"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:21:36.239339" elapsed="0.016020"/>
</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-04-17T03:21:36.238595" elapsed="0.016845"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:21:36.223113" elapsed="0.032425">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:36.255926" elapsed="0.000288"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:21:36.256270" elapsed="0.000023"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:21:36.208001" elapsed="0.048389">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:21:36.256507" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:21:36.256551" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:36.202976" elapsed="0.053599"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:36.257009" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:36.256662" elapsed="0.000419"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:36.256641" elapsed="0.000473"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:21:36.202806" elapsed="0.054342"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:21:36.202564" elapsed="0.054630"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:21:36.199977" elapsed="0.057299"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:21:36.194826" elapsed="0.062608"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:36.194339" elapsed="0.063162"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:21:36.190885" elapsed="0.066691"/>
</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-04-17T03:21:36.258149" elapsed="0.000158"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:36.257756" elapsed="0.000628"/>
</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-04-17T03:21:36.272156" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:21:36.286617" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:21:36.286970" 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-04-17T03:21:36.271956" elapsed="0.015081"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:36.288369" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:36.287513" elapsed="0.001002"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:21:36.290039" 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-04-17T03:21:36.288919" elapsed="0.001310">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-04-17T03:21:36.271499" elapsed="0.019006">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:21:37.307251" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:21:37.320474" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:21:37.320858" 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-04-17T03:21:37.307020" elapsed="0.014061"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:37.322584" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:37.321687" elapsed="0.001001"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:21:37.324100" 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-04-17T03:21:37.323165" elapsed="0.001186">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-04-17T03:21:37.306395" elapsed="0.018304">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:21:38.343393" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:21:38.356850" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:21:38.357077" 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-04-17T03:21:38.343191" elapsed="0.013926"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:38.357973" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:38.357464" elapsed="0.000578"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:21:38.358872" 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-04-17T03:21:38.358287" elapsed="0.000717">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-04-17T03:21:38.342692" elapsed="0.016483">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:21:39.376759" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:21:39.389328" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:21:39.389516" 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-04-17T03:21:39.376539" elapsed="0.013013"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:39.390345" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:39.389831" elapsed="0.000581"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:21:39.391328" 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-04-17T03:21:39.390691" elapsed="0.000807">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-04-17T03:21:39.376036" elapsed="0.015722">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:21:40.407243" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:21:40.420482" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:21:40.420608" 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-04-17T03:21:40.407026" elapsed="0.013610"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:40.421253" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:40.420847" elapsed="0.000461"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:21:40.421984" 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-04-17T03:21:40.421522" elapsed="0.000670">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-04-17T03:21:40.406470" elapsed="0.015857">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:21:41.442346" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:21:41.455534" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:21:41.455820" 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-04-17T03:21:41.442090" elapsed="0.013797"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:41.457199" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:41.456411" elapsed="0.000908"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:21:41.458721" 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-04-17T03:21:41.457736" elapsed="0.001157">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-04-17T03:21:41.441225" elapsed="0.018042">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:21:42.476445" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:21:42.489339" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:21:42.489587" 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-04-17T03:21:42.476244" elapsed="0.013400"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:42.491007" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:42.490197" elapsed="0.000920"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:21:42.492530" 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-04-17T03:21:42.491477" elapsed="0.001209">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-04-17T03:21:42.475724" elapsed="0.017273">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:21:43.510055" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:21:43.523025" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:21:43.523313" 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-04-17T03:21:43.509826" elapsed="0.013551"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:43.524668" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:43.523902" elapsed="0.000833"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:21:43.525497" 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-04-17T03:21:43.524977" elapsed="0.000616">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-04-17T03:21:43.509290" elapsed="0.016461">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:21:44.547285" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:21:44.560403" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:21:44.560783" 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-04-17T03:21:44.547069" elapsed="0.013782"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:44.562233" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:44.561395" elapsed="0.000952"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:21:44.563643" 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-04-17T03:21:44.562720" elapsed="0.001083">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-04-17T03:21:44.546487" elapsed="0.017612">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:21:45.582813" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:21:45.595311" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:21:45.595468" 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-04-17T03:21:45.582611" elapsed="0.012897"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:45.596648" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:45.595919" elapsed="0.000838"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:21:45.598050" 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-04-17T03:21:45.597158" elapsed="0.001097">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-04-17T03:21:45.582105" elapsed="0.016407">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:21:46.618978" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:21:46.631846" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:21:46.632178" 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-04-17T03:21:46.618720" elapsed="0.013532"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:46.633446" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:46.632722" elapsed="0.000827"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:21:46.635005" 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-04-17T03:21:46.633891" elapsed="0.001290">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-04-17T03:21:46.618060" elapsed="0.017445">0 != 3</status>
</kw>
<msg time="2026-04-17T03:21:46.635830" 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-04-17T03:21:36.258586" elapsed="10.377568">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-04-17T03:21:46.650522" elapsed="0.000050"/>
</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-04-17T03:21:46.664842" elapsed="0.000045"/>
</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-04-17T03:21:46.676991" elapsed="0.000037"/>
</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-04-17T03:21:46.688638" elapsed="0.000031"/>
</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-04-17T03:21:46.690254" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:21:46.689886" elapsed="0.000421"/>
</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-04-17T03:21:46.689440" elapsed="0.000922"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-04-17T03:21:46.689066" elapsed="0.001357"/>
</kw>
<doc>Check incomming updates for new routes</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:21:36.190231" elapsed="10.500234">Keyword 'Check_File_For_Word_Count' failed after retrying for 10 seconds. The last error was: 0 != 3</status>
</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-04-17T03:21:46.694289" elapsed="0.000239"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:21:46.693993" elapsed="0.000594"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:21:46.695878" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:46.695708" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:46.695682" elapsed="0.000302"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:21:46.701460" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:46.701344" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:46.701323" elapsed="0.000209"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:21:46.702814" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:21:46.702286" elapsed="0.000561"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:21:46.703436" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:21:46.703061" elapsed="0.000406"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:21:46.703514" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:21:46.703694" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:21:46.701777" elapsed="0.001942"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:21:46.711597" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:46.711460" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:46.711438" 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-04-17T03:21:46.713077" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:46.712957" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:46.712908" elapsed="0.000243"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:21:46.713735" level="INFO">${karaf_connection_index} = 31</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:21:46.713398" elapsed="0.000366"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:21:46.714192" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:21:46.713953" elapsed="0.000281"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:21:46.715102" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:21:46.714802" elapsed="0.001039">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:21:46.716059" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:21:46.716109" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:46.714414" elapsed="0.001719"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:21:46.716950" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:21:46.716679" elapsed="0.000981">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:21:46.717854" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:21:46.717903" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:46.716321" elapsed="0.001628"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:21:46.718999" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_BGP_Application_Peer_Delete_All_Routes"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:21:46.718265" elapsed="0.000801">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_BGP_Application_Peer_Delete_All_Routes"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:21:46.718030" elapsed="0.001165">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_BGP_Application_Peer_Delete_All_Routes"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:21:46.718011" elapsed="0.001223">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_BGP_Application_Peer_Delete_All_Routes"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:46.719402" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:46.719637" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:46.719491" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:46.719473" elapsed="0.000242"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:21:46.719747" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:21:46.722425" elapsed="0.000155"/>
</kw>
<msg time="2026-04-17T03:21:46.722672" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:21:46.721264" 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-04-17T03:21:46.723145" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:46.723488" 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-04-17T03:21:46.720606" 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-04-17T03:21:46.720052" 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="FAIL" start="2026-04-17T03:21:46.712583" elapsed="0.011253">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_BGP_Application_Peer_Delete_All_Routes"</status>
</kw>
<msg time="2026-04-17T03:21:46.723961" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:21:46.724008" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_BGP_Application_Peer_Delete_All_Routes"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:46.711846" elapsed="0.012187"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:21:46.724227" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:46.724115" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:46.724095" elapsed="0.000199"/>
</if>
<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-04-17T03:21:46.725336" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:46.725221" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:46.725199" elapsed="0.000245"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:21:46.725743" level="INFO">index=15
host=10.30.171.238
alias=bgp_peer_console
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-04-17T03:21:46.725856" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=bgp_peer_console
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=st...</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:21:46.725610" elapsed="0.000275"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:46.726388" level="INFO">{1: 31}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:46.726112" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:46.726921" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:46.726597" elapsed="0.000387"/>
</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-04-17T03:21:46.727571" elapsed="0.000294"/>
</kw>
<msg time="2026-04-17T03:21:46.728059" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:21:46.728112" level="INFO">${old_connection_index} = 31</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:46.727150" elapsed="0.000987"/>
</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-04-17T03:21:46.729068" elapsed="0.000253"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:21:46.730483" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:21:46.730061" elapsed="0.001473">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:46.729540" elapsed="0.002095"/>
</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-04-17T03:21:46.732402" elapsed="0.000376"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:46.731814" elapsed="0.001081"/>
</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-04-17T03:21:46.728447" elapsed="0.004533"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:46.728216" elapsed="0.004834"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:46.728197" elapsed="0.004888"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:21:46.734319" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:21:46.733871" elapsed="0.000485"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:21:46.734426" elapsed="0.000050"/>
</return>
<msg time="2026-04-17T03:21:46.734650" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:21:46.733389" elapsed="0.001295"/>
</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-04-17T03:21:46.734991" elapsed="0.000571"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:21:46.736136" level="INFO">index=32
host=10.30.170.120
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-04-17T03:21:46.736283" level="INFO">${karaf_connection_object} = index=32
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:21:46.735803" elapsed="0.000519"/>
</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-04-17T03:21:46.736533" elapsed="0.002862"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:21:46.739874" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:21:46.742578" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:21:46.739566" elapsed="0.003560">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:21:46.760480" elapsed="0.000659"/>
</kw>
<msg time="2026-04-17T03:21:46.761245" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:21:46.758945" elapsed="0.002462"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:46.761577" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:46.761808" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:21:46.744293" elapsed="0.017603"/>
</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-04-17T03:21:46.743476" elapsed="0.018487"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:21:46.724707" elapsed="0.037349">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:46.762461" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:21:46.762540" elapsed="0.000024"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:21:46.711008" elapsed="0.051654">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:21:46.762781" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:21:46.762827" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:46.704158" elapsed="0.058715"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:46.763254" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:46.762981" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:46.762956" elapsed="0.000382"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:21:46.703988" elapsed="0.059376"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:21:46.703779" elapsed="0.059621"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:21:46.700900" elapsed="0.062561"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:21:46.695364" elapsed="0.068155"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:46.694808" elapsed="0.068760"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:21:46.691675" elapsed="0.071950"/>
</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-04-17T03:21:46.764311" elapsed="0.000119"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:46.763772" elapsed="0.000717"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:21:46.774106" level="INFO">${start_cmd} = python3 bgp_app_peer.py --host 10.30.170.120 --port 8181 --command delete-all --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-type...</msg>
<var>${start_cmd}</var>
<arg>${command} ${tool_opt}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:21:46.773697" elapsed="0.000439"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:46.774570" level="INFO">python3 bgp_app_peer.py --host 10.30.170.120 --port 8181 --command delete-all --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:21:46.774306" elapsed="0.000316"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:21:46.779750" level="INFO">python3 bgp_app_peer.py --host 10.30.170.120 --port 8181 --command delete-all --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family &amp;&gt;/dev/null</msg>
<msg time="2026-04-17T03:21:46.779860" level="INFO">${output} =  python3 bgp_app_peer.py --host 10.30.170.120 --port 8181 --command delete-all --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:21:46.775035" elapsed="0.004852"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:46.780368" level="INFO"> python3 bgp_app_peer.py --host 10.30.170.120 --port 8181 --command delete-all --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:21:46.780087" elapsed="0.000333"/>
</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-04-17T03:21:46.773245" elapsed="0.007236"/>
</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-04-17T03:21:46.913258" level="INFO">[?2004l[?2004h[jenkins@releng-26932-188-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-04-17T03:21:46.785630" elapsed="0.127770"/>
</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-04-17T03:21:46.785094" elapsed="0.128382"/>
</kw>
<arg>${BGP_APP_PEER_TIMEOUT}</arg>
<doc>Wait ${timeout} for the tool exit.</doc>
<status status="PASS" start="2026-04-17T03:21:46.784679" elapsed="0.128975"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:21:46.925285" level="INFO">Executing command 'cat bgp_app_peer.log'.</msg>
<msg time="2026-04-17T03:21:46.937914" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:21:46.938069" level="INFO">${output_log} = 2026-04-17 03:21:46,870 INFO: Delete all prefixes from 10.30.170.120:8181/rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:21:46.925066" elapsed="0.013041"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:46.938731" level="INFO">2026-04-17 03:21:46,870 INFO: Delete all prefixes from 10.30.170.120:8181/rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:46.938354" elapsed="0.000429"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-04-17T03:21:46.939605" 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-04-17T03:21:46.939083" elapsed="0.000602"/>
</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-04-17T03:21:46.924480" elapsed="0.015293"/>
</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-04-17T03:21:46.940640" elapsed="0.000496"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-04-17T03:21:46.940191" elapsed="0.001070"/>
</kw>
<doc>Start BGP application peer tool and give him 30s</doc>
<tag>critical</tag>
<status status="PASS" start="2026-04-17T03:21:46.691042" elapsed="0.250295"/>
</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-04-17T03:21:46.946913" elapsed="0.000337"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:21:46.946517" 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-04-17T03:21:46.949481" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:46.949240" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:46.949192" 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-04-17T03:21:46.956696" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:46.956581" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:46.956562" elapsed="0.000203"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:21:46.957881" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:21:46.957458" elapsed="0.000453"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:21:46.958429" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:21:46.958110" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:21:46.958505" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:21:46.958686" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:21:46.957039" elapsed="0.001681"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:21:46.965323" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:46.965209" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:46.965189" elapsed="0.000205"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:21:46.966827" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:46.966704" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:46.966681" elapsed="0.000220"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:21:46.967445" level="INFO">${karaf_connection_index} = 32</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:21:46.967117" elapsed="0.000356"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:21:46.967946" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:21:46.967689" elapsed="0.000286"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:21:46.968779" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:21:46.968489" elapsed="0.001402">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:21:46.970254" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:21:46.970320" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:46.968142" elapsed="0.002210"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:21:46.971325" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:21:46.971055" elapsed="0.001072">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:21:46.972327" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:21:46.972375" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:46.970590" elapsed="0.001811"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:21:46.973391" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_Check_Example-IPv4-Topology_Is_Empty"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:21:46.972726" elapsed="0.000730">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_Check_Example-IPv4-Topology_Is_Empty"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:21:46.972485" elapsed="0.001045">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_Check_Example-IPv4-Topology_Is_Empty"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:21:46.972463" elapsed="0.001101">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_Check_Example-IPv4-Topology_Is_Empty"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:46.973738" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:46.973995" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:46.973830" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:46.973811" elapsed="0.000265"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:21:46.974111" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:21:46.977026" elapsed="0.000158"/>
</kw>
<msg time="2026-04-17T03:21:46.977254" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:21:46.975806" elapsed="0.001588"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:46.977683" elapsed="0.000080"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:46.978051" elapsed="0.000137"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:21:46.975004" elapsed="0.003315"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:21:46.974416" elapsed="0.003972"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:21:46.966322" elapsed="0.012158">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_Check_Example-IPv4-Topology_Is_Empty"</status>
</kw>
<msg time="2026-04-17T03:21:46.978607" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:21:46.978659" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_Check_Example-IPv4-Topology_Is_Empty"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:46.965551" elapsed="0.013134"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:21:46.978915" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:46.978785" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:46.978763" elapsed="0.000250"/>
</if>
<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-04-17T03:21:46.980109" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:46.979993" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:46.979909" elapsed="0.000269"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:21:46.980472" level="INFO">index=16
host=10.30.171.238
alias=bgp_app_peer_console
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-04-17T03:21:46.980645" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.238
alias=bgp_app_peer_console
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_error...</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:21:46.980340" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:46.981198" level="INFO">{1: 32}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:46.980869" elapsed="0.000376"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:46.981737" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:46.981478" elapsed="0.000306"/>
</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-04-17T03:21:46.982388" elapsed="0.000298"/>
</kw>
<msg time="2026-04-17T03:21:46.982791" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:21:46.982840" level="INFO">${old_connection_index} = 32</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:46.981990" elapsed="0.000874"/>
</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-04-17T03:21:46.983833" elapsed="0.000307"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:21:46.985459" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:21:46.984809" elapsed="0.001699">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:46.984315" elapsed="0.002302"/>
</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-04-17T03:21:46.987361" elapsed="0.000290"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:46.986810" elapsed="0.000956"/>
</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-04-17T03:21:46.983223" elapsed="0.004593"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:46.982970" elapsed="0.004899"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:46.982949" elapsed="0.004961"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:21:46.988920" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:21:46.988580" elapsed="0.000385"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:21:46.989026" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:21:46.989192" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:21:46.988203" elapsed="0.001015"/>
</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-04-17T03:21:46.989379" elapsed="0.000457"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:21:46.990149" level="INFO">index=33
host=10.30.170.120
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-04-17T03:21:46.990254" level="INFO">${karaf_connection_object} = index=33
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:21:46.990031" elapsed="0.000251"/>
</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-04-17T03:21:46.990436" elapsed="0.002443"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:21:46.993365" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:21:46.994739" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:21:46.993070" elapsed="0.002080">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:21:47.009750" elapsed="0.000462"/>
</kw>
<msg time="2026-04-17T03:21:47.010318" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:21:47.007724" elapsed="0.002755"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:47.010650" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:47.010818" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:21:46.996112" elapsed="0.014790"/>
</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-04-17T03:21:46.995449" elapsed="0.015701"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:21:46.979479" elapsed="0.031767">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:47.011727" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:21:47.011826" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:21:46.964837" elapsed="0.047120">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:21:47.012079" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:21:47.012123" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:46.959264" elapsed="0.052883"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:47.012502" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:47.012236" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:47.012214" elapsed="0.000377"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:21:46.959058" elapsed="0.053580"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:21:46.958798" elapsed="0.053882"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:21:46.956200" elapsed="0.056552"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:21:46.948635" elapsed="0.064177"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:46.947717" elapsed="0.065155"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:21:46.942777" elapsed="0.070167"/>
</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-04-17T03:21:47.069288" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:21:47.068836" elapsed="0.000489"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:47.070572" 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-04-17T03:21:47.070119" elapsed="0.000541">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-04-17T03:21:47.070809" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:47.069508" elapsed="0.001331"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:21:47.071547" 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-04-17T03:21:47.071068" elapsed="0.000511"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:21:47.071946" 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-04-17T03:21:47.072148" 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-04-17T03:21:47.071765" elapsed="0.000411"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:47.072599" 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-04-17T03:21:47.072343" 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-04-17T03:21:47.073917" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:47.073458" elapsed="0.000542"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:21:47.074588" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:21:47.074186" elapsed="0.000444"/>
</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-04-17T03:21:47.075165" elapsed="0.000064"/>
</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-04-17T03:21:47.076073" elapsed="0.000057"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:21:47.076619" elapsed="0.000064"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:21:47.074879" elapsed="0.001971"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:21:47.074700" elapsed="0.002246"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:21:47.077017" elapsed="0.000050"/>
</return>
<msg time="2026-04-17T03:21:47.077258" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:21:47.073098" elapsed="0.004188"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:47.072729" elapsed="0.004592"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:47.077504" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:47.077348" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:47.072702" elapsed="0.004882"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:21:47.078309" 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-04-17T03:21:47.077733" elapsed="0.000619"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:21:47.078404" 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-04-17T03:21:47.067915" elapsed="0.010634"/>
</kw>
<msg time="2026-04-17T03:21:47.078606" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:21:47.053842" elapsed="0.024818"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:21:47.092813" elapsed="0.000042"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:21:47.106201" 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/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-04-17T03:21:47.123060" elapsed="0.000035"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:47.123311" 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-04-17T03:21:47.123500" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:47.123949" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:47.123774" elapsed="0.000234"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:47.123755" elapsed="0.000281"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:47.124217" 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-04-17T03:21:47.124395" 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-04-17T03:21:47.124581" elapsed="0.000036"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:21:47.123715" elapsed="0.000948"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:21:47.123588" elapsed="0.001187"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:47.124958" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:47.125043" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:21:47.125207" 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-04-17T03:21:47.049165" elapsed="0.076071"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:47.126694" 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-04-17T03:21:47.126396" elapsed="0.000377">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-04-17T03:21:47.126872" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:47.125990" elapsed="0.000907"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:47.127264" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:47.126989" elapsed="0.000336"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:21:47.127845" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:21:47.127536" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:47.127350" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:47.126969" elapsed="0.000980"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:21:47.130400" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:21:47.128109" elapsed="0.002319"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:21:47.130481" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:21:47.130650" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:21:47.125596" elapsed="0.005080"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:47.131959" 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-04-17T03:21:47.131697" elapsed="0.000330">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-04-17T03:21:47.132125" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:47.131345" elapsed="0.000805"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:21:47.132507" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:21:47.132355" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:47.132332" elapsed="0.000263"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:47.132747" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:47.132921" elapsed="0.000047"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:21:47.133015" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:21:47.135156" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:21:47.131013" elapsed="0.004171"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:47.136728" 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-04-17T03:21:47.136459" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:47.137204" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:47.136950" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:21:47.142414" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:47.344149" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:47.746739" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:47.749659" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:21:47.139443" elapsed="0.616112">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:21:47.137317" elapsed="0.618474">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:47.756372" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:47.755885" elapsed="0.000651"/>
</branch>
<status status="FAIL" start="2026-04-17T03:21:47.137299" elapsed="0.619294">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:47.757992" elapsed="0.000100"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:47.758470" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:47.758304" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:47.758256" elapsed="0.000380"/>
</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-04-17T03:21:47.759172" elapsed="0.000057"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:21:47.759411" elapsed="0.000055"/>
</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-04-17T03:21:47.135517" elapsed="0.624157">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:47.759757" 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-04-17T03:21:47.025457" elapsed="0.734405">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:47.760183" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:47.759984" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:47.759964" elapsed="0.000322"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:47.760321" elapsed="0.000015"/>
</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="FAIL" start="2026-04-17T03:21:47.018918" elapsed="0.741509">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:21:47.014208" elapsed="0.746381">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:21:48.835306" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:21:48.834808" elapsed="0.000535"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:48.836454" 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-04-17T03:21:48.835969" elapsed="0.000575">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-04-17T03:21:48.836648" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:48.835530" elapsed="0.001145"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:21:48.837382" 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-04-17T03:21:48.836849" elapsed="0.000569"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:21:48.837886" 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-04-17T03:21:48.838125" 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-04-17T03:21:48.837634" elapsed="0.000527"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:48.838725" 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-04-17T03:21:48.838385" 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-04-17T03:21:48.840403" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:48.839883" elapsed="0.000589"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:21:48.841233" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:21:48.840694" elapsed="0.000569"/>
</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-04-17T03:21:48.841702" elapsed="0.000055"/>
</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-04-17T03:21:48.842785" elapsed="0.000067"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:21:48.843191" elapsed="0.000056"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:21:48.841499" elapsed="0.001919"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:21:48.841322" elapsed="0.002195"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:21:48.843591" elapsed="0.000062"/>
</return>
<msg time="2026-04-17T03:21:48.843838" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:21:48.839380" elapsed="0.004493"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:48.838893" elapsed="0.005026"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:48.844199" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:48.843980" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:48.838863" elapsed="0.005447"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:21:48.845280" 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-04-17T03:21:48.844531" elapsed="0.000787"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:21:48.845407" 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//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-04-17T03:21:48.833623" elapsed="0.011969"/>
</kw>
<msg time="2026-04-17T03:21:48.845765" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:21:48.816973" elapsed="0.028937"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:21:48.863685" elapsed="0.000080"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:48.877612" elapsed="0.000071"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:21:48.890305" elapsed="0.000062"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:48.890614" 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-04-17T03:21:48.890802" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:48.891260" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:48.891094" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:48.891076" 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-04-17T03:21:48.891492" 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-04-17T03:21:48.891662" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:48.891828" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:21:48.891038" elapsed="0.000842"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:21:48.890888" elapsed="0.001018"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:48.892071" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:48.892152" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:21:48.892313" 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-04-17T03:21:48.809591" elapsed="0.082750"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:48.893781" 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-04-17T03:21:48.893492" elapsed="0.000364">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-04-17T03:21:48.894052" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:48.893092" elapsed="0.001002"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:48.894446" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:48.894174" elapsed="0.000401"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:21:48.895149" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:21:48.894820" elapsed="0.000355"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:48.894606" elapsed="0.000605"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:48.894155" elapsed="0.001077"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:21:48.897623" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:21:48.895384" elapsed="0.002266"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:21:48.897705" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:21:48.897870" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:21:48.892715" elapsed="0.005181"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:48.899231" 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-04-17T03:21:48.898972" elapsed="0.000328">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-04-17T03:21:48.899396" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:48.898612" elapsed="0.000809"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:21:48.899633" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:21:48.899493" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:48.899475" elapsed="0.000243"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:48.899865" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:48.900056" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:21:48.900124" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:21:48.902364" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:21:48.898270" elapsed="0.004123"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:48.903816" 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-04-17T03:21:48.903557" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:48.904280" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:48.904032" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:21:48.909246" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:49.111087" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:49.513543" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:49.516348" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:21:48.906472" elapsed="0.615113">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:21:48.904390" elapsed="0.617347">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:49.522135" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:49.521800" elapsed="0.000513"/>
</branch>
<status status="FAIL" start="2026-04-17T03:21:48.904372" elapsed="0.617979">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:49.523002" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:49.523210" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:49.523151" elapsed="0.000122"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:49.523123" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:49.523519" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:21:49.523622" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:21:48.902712" elapsed="0.621073">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:49.523959" elapsed="0.000038"/>
</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-04-17T03:21:48.782491" elapsed="0.741647">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:49.524544" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:49.524276" elapsed="0.000375"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:49.524252" elapsed="0.000441"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:49.524749" 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="FAIL" start="2026-04-17T03:21:48.774907" elapsed="0.749991">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:21:48.761311" elapsed="0.763757">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:21:50.587308" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:21:50.586858" elapsed="0.000487"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:50.588398" 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-04-17T03:21:50.587880" elapsed="0.000625">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-04-17T03:21:50.588634" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:50.587525" elapsed="0.001135"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:21:50.589348" 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-04-17T03:21:50.588834" elapsed="0.000543"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:21:50.589809" 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-04-17T03:21:50.589992" 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-04-17T03:21:50.589628" elapsed="0.000391"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:50.590451" 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-04-17T03:21:50.590182" elapsed="0.000316"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:50.592248" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:50.591705" elapsed="0.000629"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:21:50.593098" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:21:50.592503" elapsed="0.000626"/>
</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-04-17T03:21:50.593557" 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-04-17T03:21:50.594328" 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-04-17T03:21:50.594705" elapsed="0.000047"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:21:50.593362" elapsed="0.001517"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:21:50.593185" elapsed="0.001778"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:21:50.595018" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:21:50.595198" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:21:50.591247" elapsed="0.003977"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:50.590577" elapsed="0.004687"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:50.595444" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:50.595291" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:50.590554" elapsed="0.004967"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:21:50.596181" 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-04-17T03:21:50.595669" elapsed="0.000541"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:21:50.596279" elapsed="0.000035"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:21:50.586064" elapsed="0.010355"/>
</kw>
<msg time="2026-04-17T03:21:50.596475" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:21:50.572652" elapsed="0.023875"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:21:50.609785" elapsed="0.000044"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:21:50.622915" elapsed="0.000067"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:21:50.636347" elapsed="0.000040"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:50.636692" 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-04-17T03:21:50.636879" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:50.637323" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:50.637169" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:50.637151" 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-04-17T03:21:50.637554" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:50.637731" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:50.637900" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:21:50.637113" elapsed="0.000858"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:21:50.636985" elapsed="0.001014"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:50.638149" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:50.638228" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:21:50.638408" 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-04-17T03:21:50.567945" elapsed="0.070494"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:50.639981" 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-04-17T03:21:50.639666" elapsed="0.000394">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-04-17T03:21:50.640156" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:50.639245" elapsed="0.000937"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:50.640539" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:50.640253" elapsed="0.000345"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:21:50.641192" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:21:50.640814" elapsed="0.000405"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:50.640624" elapsed="0.000631"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:50.640235" elapsed="0.001041"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:21:50.643842" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:21:50.641458" elapsed="0.002412"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:21:50.643923" elapsed="0.000051"/>
</return>
<msg time="2026-04-17T03:21:50.644103" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:21:50.638858" elapsed="0.005270"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:50.645470" 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-04-17T03:21:50.645201" elapsed="0.000342">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-04-17T03:21:50.645643" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:50.644806" elapsed="0.000861"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:21:50.645960" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-04-17T03:21:50.645778" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:50.645752" elapsed="0.000307"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:50.646292" elapsed="0.000025"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:50.646494" elapsed="0.000023"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:21:50.646571" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:21:50.648796" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:21:50.644468" elapsed="0.004356"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:50.650322" 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-04-17T03:21:50.650054" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:50.650814" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:50.650526" elapsed="0.000334"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:21:50.655951" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:50.857438" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:51.260036" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:51.262761" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:21:50.653010" elapsed="0.614816">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:21:50.650926" elapsed="0.617199">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:51.268799" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:51.268297" elapsed="0.000606"/>
</branch>
<status status="FAIL" start="2026-04-17T03:21:50.650908" elapsed="0.618049">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:51.269570" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:51.269778" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:51.269716" elapsed="0.000134"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:51.269686" elapsed="0.000195"/>
</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-04-17T03:21:51.270118" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:21:51.270217" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:21:50.649194" elapsed="0.621189">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:51.270500" elapsed="0.000027"/>
</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-04-17T03:21:50.543544" elapsed="0.727109">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:51.271139" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:51.270863" elapsed="0.000377"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:51.270837" elapsed="0.000443"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:51.271332" elapsed="0.000023"/>
</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="FAIL" start="2026-04-17T03:21:50.537026" elapsed="0.734459">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:21:50.525755" elapsed="0.745897">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:21:52.335101" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:21:52.334500" elapsed="0.000637"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:52.336159" 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-04-17T03:21:52.335671" 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-04-17T03:21:52.336339" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:52.335320" elapsed="0.001051"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:21:52.337071" 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-04-17T03:21:52.336606" elapsed="0.000493"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:21:52.337509" 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-04-17T03:21:52.337724" 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-04-17T03:21:52.337312" elapsed="0.000452"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:52.338337" 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-04-17T03:21:52.338008" elapsed="0.000377"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:52.339897" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:52.339308" elapsed="0.000686"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:21:52.340622" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:21:52.340167" 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-04-17T03:21:52.341099" elapsed="0.000048"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:52.341881" elapsed="0.000065"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:21:52.342244" elapsed="0.000047"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:21:52.340876" elapsed="0.001542"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:21:52.340706" elapsed="0.001783"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:21:52.342580" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:21:52.342834" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:21:52.338837" elapsed="0.004024"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:52.338468" elapsed="0.004424"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:52.343088" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:52.342917" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:52.338443" elapsed="0.004722"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:21:52.343873" 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-04-17T03:21:52.343314" elapsed="0.000591"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:21:52.343988" 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//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-04-17T03:21:52.333735" elapsed="0.010396"/>
</kw>
<msg time="2026-04-17T03:21:52.344205" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:21:52.320220" elapsed="0.024068"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:21:52.359798" 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-04-17T03:21:52.373361" elapsed="0.000041"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:21:52.386573" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:52.386865" 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-04-17T03:21:52.387084" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:52.387542" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:52.387373" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:52.387353" elapsed="0.000276"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:52.387790" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:52.387977" 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-04-17T03:21:52.388146" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:21:52.387306" elapsed="0.000894"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:21:52.387171" elapsed="0.001057"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:52.388376" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:52.388455" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:21:52.388621" 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-04-17T03:21:52.315610" elapsed="0.073108"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:52.390209" 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-04-17T03:21:52.389899" elapsed="0.000394">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-04-17T03:21:52.390404" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:52.389491" 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-04-17T03:21:52.390836" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:52.390506" elapsed="0.000400"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:21:52.391452" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:21:52.391149" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:52.390947" elapsed="0.000567"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:52.390487" elapsed="0.001048"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:21:52.395102" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:21:52.391687" elapsed="0.003455"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:21:52.395215" elapsed="0.000045"/>
</return>
<msg time="2026-04-17T03:21:52.395437" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:21:52.389099" elapsed="0.006373"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:52.397319" 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-04-17T03:21:52.396977" elapsed="0.000450">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-04-17T03:21:52.397565" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:52.396475" elapsed="0.001125"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:21:52.397909" elapsed="0.000072"/>
</return>
<status status="PASS" start="2026-04-17T03:21:52.397700" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:52.397675" elapsed="0.000407"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:52.398294" 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-04-17T03:21:52.398544" elapsed="0.000030"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:21:52.398637" elapsed="0.000075"/>
</return>
<msg time="2026-04-17T03:21:52.401250" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:21:52.395963" elapsed="0.005320"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:52.402860" 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-04-17T03:21:52.402550" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:52.403392" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:52.403110" elapsed="0.000330"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:21:52.408660" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:52.610173" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:53.012856" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:53.015517" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:21:52.405650" elapsed="0.616177">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:21:52.403510" elapsed="0.618552">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:53.022544" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:53.022153" elapsed="0.000514"/>
</branch>
<status status="FAIL" start="2026-04-17T03:21:52.403491" elapsed="0.619213">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:53.023393" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:53.023598" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:53.023543" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:53.023515" 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-04-17T03:21:53.023952" elapsed="0.000036"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:21:53.024060" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:21:52.401641" elapsed="0.622583">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:53.024339" 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-04-17T03:21:52.289825" elapsed="0.734701">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:53.024974" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:53.024678" elapsed="0.000402"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:53.024652" elapsed="0.000464"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:53.025163" elapsed="0.000020"/>
</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="FAIL" start="2026-04-17T03:21:52.280955" elapsed="0.744354">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:21:52.272523" elapsed="0.752934">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:21:54.087213" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:21:54.086756" elapsed="0.000500"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:54.088335" 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-04-17T03:21:54.087791" 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-04-17T03:21:54.088530" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:54.087444" elapsed="0.001111"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:21:54.089165" 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-04-17T03:21:54.088724" elapsed="0.000469"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:21:54.089512" 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-04-17T03:21:54.089762" 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-04-17T03:21:54.089358" elapsed="0.000431"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:54.090246" 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-04-17T03:21:54.089985" 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-04-17T03:21:54.091571" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:54.091100" elapsed="0.000533"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:21:54.092196" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:21:54.091803" elapsed="0.000419"/>
</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-04-17T03:21:54.092695" elapsed="0.000054"/>
</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-04-17T03:21:54.093494" 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-04-17T03:21:54.093888" elapsed="0.000066"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:21:54.092470" elapsed="0.001611"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:21:54.092289" elapsed="0.001867"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:21:54.094215" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:21:54.094405" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:21:54.090729" elapsed="0.003701"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:54.090385" elapsed="0.004078"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:54.094667" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:54.094490" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:54.090353" elapsed="0.004402"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:21:54.095391" 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-04-17T03:21:54.094903" elapsed="0.000517"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:21:54.095470" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:21:54.086067" elapsed="0.009528"/>
</kw>
<msg time="2026-04-17T03:21:54.095652" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:21:54.072588" elapsed="0.023134"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:21:54.111128" elapsed="0.000105"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:21:54.124447" 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/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-04-17T03:21:54.139263" elapsed="0.000105"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:54.139743" 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-04-17T03:21:54.139966" 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-04-17T03:21:54.140537" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:54.140366" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:54.140344" 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-04-17T03:21:54.140773" 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-04-17T03:21:54.140991" 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-04-17T03:21:54.141173" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:21:54.140288" elapsed="0.000950"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:21:54.140082" elapsed="0.001190"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:54.141427" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:54.141514" elapsed="0.000022"/>
</return>
<msg time="2026-04-17T03:21:54.141750" 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-04-17T03:21:54.068238" elapsed="0.073544"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:54.143781" 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-04-17T03:21:54.143358" elapsed="0.000524">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-04-17T03:21:54.144010" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:54.142782" elapsed="0.001259"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:54.144449" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:54.144126" elapsed="0.000383"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:21:54.145096" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:21:54.144759" elapsed="0.000363"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:54.144534" elapsed="0.000728"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:54.144100" elapsed="0.001184"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:21:54.147823" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:21:54.145456" elapsed="0.002397"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:21:54.147918" elapsed="0.000059"/>
</return>
<msg time="2026-04-17T03:21:54.148109" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:21:54.142343" elapsed="0.005791"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:54.149437" 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-04-17T03:21:54.149193" elapsed="0.000321">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-04-17T03:21:54.149616" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:54.148826" elapsed="0.000815"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:21:54.149875" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:21:54.149714" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:54.149695" elapsed="0.000335"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:54.150182" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:54.150357" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:21:54.150422" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:21:54.152611" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:21:54.148459" elapsed="0.004179"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:54.154194" 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-04-17T03:21:54.153858" elapsed="0.000387"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:54.154659" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:54.154402" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:21:54.160358" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:54.362231" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:54.765305" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:54.768675" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:21:54.156906" elapsed="0.616967">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:21:54.154771" elapsed="0.619379">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:54.774712" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:54.774264" elapsed="0.000567"/>
</branch>
<status status="FAIL" start="2026-04-17T03:21:54.154751" elapsed="0.620141">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:54.775889" elapsed="0.000073"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:54.776150" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:54.776087" elapsed="0.000133"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:54.776056" elapsed="0.000195"/>
</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-04-17T03:21:54.776465" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:21:54.776563" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:21:54.153009" elapsed="0.623755">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:54.776912" elapsed="0.000062"/>
</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-04-17T03:21:54.045150" elapsed="0.731972">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:54.777541" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:54.777267" elapsed="0.000379"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:54.777239" elapsed="0.000442"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:54.777758" 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="FAIL" start="2026-04-17T03:21:54.038675" elapsed="0.739293">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:21:54.027090" elapsed="0.751061">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:21:55.841118" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:21:55.840602" elapsed="0.000564"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:55.842518" 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-04-17T03:21:55.841748" elapsed="0.000892">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-04-17T03:21:55.842747" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:55.841380" elapsed="0.001393"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:21:55.843431" 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-04-17T03:21:55.842974" elapsed="0.000486"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:21:55.843842" 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-04-17T03:21:55.844261" 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-04-17T03:21:55.843658" elapsed="0.000632"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:55.844780" 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-04-17T03:21:55.844471" 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-04-17T03:21:55.846272" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:55.845768" elapsed="0.000570"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:21:55.846955" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:21:55.846510" elapsed="0.000475"/>
</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-04-17T03:21:55.847514" elapsed="0.000062"/>
</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-04-17T03:21:55.848345" elapsed="0.000055"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:21:55.848789" elapsed="0.000060"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:21:55.847262" elapsed="0.001740"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:21:55.847060" elapsed="0.002021"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:21:55.849147" elapsed="0.000050"/>
</return>
<msg time="2026-04-17T03:21:55.849350" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:21:55.845388" elapsed="0.003988"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:55.844945" elapsed="0.004465"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:55.849593" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:55.849439" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:55.844896" elapsed="0.004776"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:21:55.850336" 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-04-17T03:21:55.849825" elapsed="0.000540"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:21:55.850414" 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-04-17T03:21:55.839909" elapsed="0.010633"/>
</kw>
<msg time="2026-04-17T03:21:55.850602" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:21:55.826368" elapsed="0.024286"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:21:55.865968" 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-04-17T03:21:55.878812" 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//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-04-17T03:21:55.891679" elapsed="0.000052"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:55.892323" 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-04-17T03:21:55.892521" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:55.893049" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:55.892866" elapsed="0.000244"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:55.892846" elapsed="0.000293"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:55.893287" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:55.893459" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:55.893627" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:21:55.892797" elapsed="0.000885"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:21:55.892618" elapsed="0.001094"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:55.893888" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:55.893992" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:21:55.894170" 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-04-17T03:21:55.821588" elapsed="0.072611"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:55.895764" 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-04-17T03:21:55.895425" elapsed="0.000434">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-04-17T03:21:55.895979" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:55.894971" elapsed="0.001043"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:55.896378" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:55.896089" elapsed="0.000351"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:21:55.897068" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:21:55.896692" elapsed="0.000404"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:55.896465" elapsed="0.000667"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:55.896070" elapsed="0.001083"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:21:55.899538" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:21:55.897308" elapsed="0.002257"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:21:55.899618" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:21:55.899787" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:21:55.894568" elapsed="0.005265"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:55.901443" 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-04-17T03:21:55.901119" elapsed="0.000417">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-04-17T03:21:55.901644" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:55.900605" elapsed="0.001065"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:21:55.901884" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:21:55.901743" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:55.901723" elapsed="0.000267"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:55.902150" 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-04-17T03:21:55.902380" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:21:55.902448" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:21:55.905137" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:21:55.900229" elapsed="0.004951"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:55.907211" 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-04-17T03:21:55.906850" elapsed="0.000416"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:55.907677" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:55.907426" 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="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:21:55.913602" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:56.115773" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:56.519588" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:56.523058" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:21:55.910111" elapsed="0.619342">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:21:55.907803" elapsed="0.621985">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:56.530603" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:56.529920" elapsed="0.000852"/>
</branch>
<status status="FAIL" start="2026-04-17T03:21:55.907778" elapsed="0.623054">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:56.531672" elapsed="0.000044"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:56.531898" elapsed="0.000048"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:56.531837" elapsed="0.000156"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:56.531804" elapsed="0.000219"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:56.532260" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:21:56.532374" 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-04-17T03:21:55.905698" elapsed="0.626898">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:56.532732" 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-04-17T03:21:55.797872" elapsed="0.735010">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:56.533433" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:56.533150" elapsed="0.000387"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:56.533124" elapsed="0.000447"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:56.533617" elapsed="0.000020"/>
</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="FAIL" start="2026-04-17T03:21:55.790068" elapsed="0.743736">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:21:55.779179" elapsed="0.754821">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:21:57.598117" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:21:57.597585" elapsed="0.000576"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:57.599362" 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-04-17T03:21:57.598743" elapsed="0.000714">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-04-17T03:21:57.599559" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:57.598360" elapsed="0.001224"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:21:57.600173" 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-04-17T03:21:57.599755" elapsed="0.000446"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:21:57.600551" 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-04-17T03:21:57.600818" 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-04-17T03:21:57.600367" elapsed="0.000477"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:57.601287" 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-04-17T03:21:57.601027" 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-04-17T03:21:57.602829" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:57.602298" elapsed="0.000603"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:21:57.603536" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:21:57.603092" elapsed="0.000471"/>
</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-04-17T03:21:57.604043" elapsed="0.000051"/>
</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-04-17T03:21:57.604868" 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-04-17T03:21:57.605239" elapsed="0.000048"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:21:57.603818" elapsed="0.001593"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:21:57.603631" elapsed="0.001851"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:21:57.605542" elapsed="0.000052"/>
</return>
<msg time="2026-04-17T03:21:57.605736" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:21:57.601853" elapsed="0.003909"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:57.601431" elapsed="0.004642"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:57.606273" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:57.606109" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:57.601398" elapsed="0.004955"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:21:57.607174" 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-04-17T03:21:57.606505" elapsed="0.000700"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:21:57.607256" 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-04-17T03:21:57.596802" elapsed="0.010588"/>
</kw>
<msg time="2026-04-17T03:21:57.607451" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:21:57.582665" elapsed="0.024853"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:21:57.620508" 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-04-17T03:21:57.633961" 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//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-04-17T03:21:57.647463" elapsed="0.000049"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:57.647761" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:57.647994" 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-04-17T03:21:57.648475" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:57.648299" elapsed="0.000239"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:57.648278" 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-04-17T03:21:57.648720" 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-04-17T03:21:57.648903" 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-04-17T03:21:57.649117" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:21:57.648233" elapsed="0.000942"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:21:57.648092" elapsed="0.001116"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:57.649363" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:57.649450" elapsed="0.000021"/>
</return>
<msg time="2026-04-17T03:21:57.649644" 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-04-17T03:21:57.578059" elapsed="0.071720"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:57.651763" 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-04-17T03:21:57.651332" elapsed="0.000538">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-04-17T03:21:57.652040" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:57.650706" elapsed="0.001362"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:57.652544" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:57.652166" elapsed="0.000450"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:21:57.653352" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:21:57.652896" elapsed="0.000491"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:57.652646" elapsed="0.000785"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:57.652137" elapsed="0.001321"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:21:57.656336" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:21:57.653654" elapsed="0.002719"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:21:57.656443" elapsed="0.000047"/>
</return>
<msg time="2026-04-17T03:21:57.656638" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:21:57.650237" elapsed="0.006426"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:21:57.658174" 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-04-17T03:21:57.657864" elapsed="0.000387">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-04-17T03:21:57.658349" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:21:57.657466" elapsed="0.000907"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:21:57.658604" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:21:57.658451" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:57.658429" elapsed="0.000261"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:57.658843" 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-04-17T03:21:57.659035" elapsed="0.000024"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:21:57.659119" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:21:57.661423" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:21:57.657077" elapsed="0.004374"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:57.663223" 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-04-17T03:21:57.662825" elapsed="0.000454"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:57.663724" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:57.663461" 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-04-17T03:21:57.670254" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:57.872126" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:58.274622" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:58.276672" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:21:57.666387" elapsed="0.616416">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:21:57.663859" elapsed="0.619337">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:58.284116" elapsed="0.000081"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:58.283317" elapsed="0.000998"/>
</branch>
<status status="FAIL" start="2026-04-17T03:21:57.663838" elapsed="0.620539">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:58.285253" elapsed="0.000033"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:58.285437" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:58.285387" elapsed="0.000108"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:58.285359" elapsed="0.000158"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:58.285693" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:21:58.285768" elapsed="0.000017"/>
</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-04-17T03:21:57.661825" elapsed="0.624089">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:58.286019" 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-04-17T03:21:57.553855" elapsed="0.732278">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:58.286446" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:58.286239" elapsed="0.000283"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:58.286219" elapsed="0.000329"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:21:58.286580" elapsed="0.000014"/>
</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="FAIL" start="2026-04-17T03:21:57.547212" elapsed="0.739476">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:21:57.535094" elapsed="0.751707">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:21:58.286959" level="FAIL">Keyword 'Compare_Topology' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-17T03:21:47.013460" elapsed="11.273725">Keyword 'Compare_Topology' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>empty_topology</arg>
<doc>Wait until Compare_Topology matches expected result.</doc>
<status status="FAIL" start="2026-04-17T03:21:47.013102" elapsed="11.274204">Keyword 'Compare_Topology' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:21:58.289248" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:21:58.288825" elapsed="0.000474"/>
</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-04-17T03:21:58.288227" elapsed="0.001125"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-04-17T03:21:58.287728" elapsed="0.001682"/>
</kw>
<doc>See new routes are deleted.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:21:46.941891" elapsed="11.347564">Keyword 'Compare_Topology' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:21:58.293951" elapsed="0.000244"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:21:58.293650" elapsed="0.000601"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:21:58.295397" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:58.295255" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:58.295236" 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-04-17T03:21:58.300648" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:58.300536" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:58.300517" elapsed="0.000200"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:21:58.301830" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:21:58.301372" elapsed="0.000486"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:21:58.302351" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:21:58.302044" elapsed="0.000333"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:21:58.302448" elapsed="0.000053"/>
</return>
<msg time="2026-04-17T03:21:58.302648" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:21:58.300977" elapsed="0.001696"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:21:58.308545" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:58.308434" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:58.308415" 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-04-17T03:21:58.309867" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:58.309759" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:58.309741" elapsed="0.000225"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:21:58.310443" level="INFO">${karaf_connection_index} = 33</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:21:58.310118" elapsed="0.000353"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:21:58.310900" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:21:58.310655" elapsed="0.000289"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:21:58.312022" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:21:58.311455" elapsed="0.001399">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:21:58.313084" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:21:58.313132" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:58.311110" elapsed="0.002242"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:21:58.314236" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:21:58.313961" elapsed="0.001029">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:21:58.315182" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:21:58.315229" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:58.313547" elapsed="0.001705"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:21:58.316317" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_BGP_Peer_Check_Incomming_Updates_For_3_Withdrawn_Prefixes"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:21:58.315565" elapsed="0.000817">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_BGP_Peer_Check_Incomming_Updates_For_3_Withdrawn_Prefixes"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:21:58.315332" elapsed="0.001127">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_BGP_Peer_Check_Incomming_Updates_For_3_Withdrawn_Prefixes"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:21:58.315312" elapsed="0.001182">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_BGP_Peer_Check_Incomming_Updates_For_3_Withdrawn_Prefixes"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:58.316683" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:58.316918" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:58.316776" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:21:58.316759" elapsed="0.000252"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:21:58.317054" 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-04-17T03:21:58.319992" elapsed="0.000193"/>
</kw>
<msg time="2026-04-17T03:21:58.320265" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:21:58.318735" 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-04-17T03:21:58.320695" elapsed="0.000082"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:58.321067" 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-04-17T03:21:58.318061" elapsed="0.003201"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:21:58.317417" elapsed="0.003913"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:21:58.309441" elapsed="0.011978">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_BGP_Peer_Check_Incomming_Updates_For_3_Withdrawn_Prefixes"</status>
</kw>
<msg time="2026-04-17T03:21:58.321527" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:21:58.321572" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_BGP_Peer_Check_Incomming_Updates_For_3_Withdrawn_Prefixes"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:58.308770" elapsed="0.012825"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:21:58.321785" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:58.321674" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:58.321655" elapsed="0.000199"/>
</if>
<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-04-17T03:21:58.322707" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:21:58.322600" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:58.322582" elapsed="0.000192"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:21:58.323132" level="INFO">index=16
host=10.30.171.238
alias=bgp_app_peer_console
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-04-17T03:21:58.323241" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.238
alias=bgp_app_peer_console
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_error...</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:21:58.322983" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:58.323701" level="INFO">{1: 33}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:58.323419" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:58.324257" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:58.323900" elapsed="0.000451"/>
</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-04-17T03:21:58.324900" elapsed="0.000306"/>
</kw>
<msg time="2026-04-17T03:21:58.325308" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:21:58.325354" level="INFO">${old_connection_index} = 33</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:58.324515" elapsed="0.000863"/>
</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-04-17T03:21:58.326232" elapsed="0.000198"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:21:58.327813" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:21:58.327202" elapsed="0.001548">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:58.326601" elapsed="0.002249"/>
</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-04-17T03:21:58.329520" elapsed="0.000290"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:58.329043" elapsed="0.000854"/>
</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-04-17T03:21:58.325682" elapsed="0.004285"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:58.325454" elapsed="0.004564"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:58.325435" elapsed="0.004609"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:21:58.330921" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:21:58.330591" elapsed="0.000422"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:21:58.331064" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:21:58.331221" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:21:58.330260" elapsed="0.000986"/>
</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-04-17T03:21:58.331407" elapsed="0.000484"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:21:58.332258" level="INFO">index=34
host=10.30.170.120
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-04-17T03:21:58.332360" level="INFO">${karaf_connection_object} = index=34
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:21:58.332142" elapsed="0.000244"/>
</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-04-17T03:21:58.332540" elapsed="0.002450"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:21:58.335435" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:21:58.336770" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:21:58.335164" elapsed="0.002032">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:21:58.352755" elapsed="0.000448"/>
</kw>
<msg time="2026-04-17T03:21:58.353319" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:21:58.351107" elapsed="0.002388"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:58.353663" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:58.353869" elapsed="0.000026"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:21:58.338073" elapsed="0.016290"/>
</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-04-17T03:21:58.337508" elapsed="0.016913"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:21:58.322301" elapsed="0.032226">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:58.355168" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:21:58.355265" elapsed="0.000029"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:21:58.308067" elapsed="0.047333">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:21:58.355533" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:21:58.355578" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:58.303122" elapsed="0.052480"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:21:58.355994" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:21:58.355701" elapsed="0.000405"/>
</branch>
<status status="PASS" start="2026-04-17T03:21:58.355675" elapsed="0.000468"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:21:58.302968" elapsed="0.053203"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:21:58.302747" elapsed="0.053468"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:21:58.300159" elapsed="0.056128"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:21:58.294910" elapsed="0.061442"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:21:58.294411" elapsed="0.061992"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:21:58.290426" elapsed="0.066037"/>
</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-04-17T03:21:58.356947" elapsed="0.000115"/>
</kw>
<status status="PASS" start="2026-04-17T03:21:58.356641" elapsed="0.000477"/>
</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-04-17T03:21:58.371088" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:21:58.386634" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:21:58.387022" 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-04-17T03:21:58.370842" elapsed="0.016245"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:58.388510" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:58.387611" elapsed="0.001005"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:21:58.389998" 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-04-17T03:21:58.388995" elapsed="0.001191">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-04-17T03:21:58.370203" elapsed="0.020266">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:21:59.407753" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:21:59.421707" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:21:59.422181" 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-04-17T03:21:59.407512" elapsed="0.014737"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:21:59.423742" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:21:59.422842" elapsed="0.001018"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:21:59.425464" 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-04-17T03:21:59.424338" elapsed="0.001342">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-04-17T03:21:59.406816" elapsed="0.019196">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:22:00.441951" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:22:00.455532" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:22:00.456153" 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-04-17T03:22:00.441700" elapsed="0.014528"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:00.458022" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:00.456915" elapsed="0.001228"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:22:00.459410" 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-04-17T03:22:00.458613" elapsed="0.000925">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-04-17T03:22:00.441039" elapsed="0.018699">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:22:01.480034" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:22:01.493156" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:22:01.493655" 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-04-17T03:22:01.479725" elapsed="0.013998"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:01.495311" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:01.494374" elapsed="0.001043"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:22:01.496602" 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-04-17T03:22:01.495847" elapsed="0.000930">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-04-17T03:22:01.479056" elapsed="0.018043">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:22:02.515610" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:22:02.528255" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:22:02.528498" 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-04-17T03:22:02.515335" elapsed="0.013206"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:02.529553" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:02.528852" elapsed="0.000803"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:22:02.531258" 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-04-17T03:22:02.530200" elapsed="0.001231">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-04-17T03:22:02.514614" elapsed="0.017063">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:22:03.548976" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:22:03.562356" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:22:03.562716" 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-04-17T03:22:03.548764" elapsed="0.014040"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:03.564421" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:03.563461" elapsed="0.001112"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:22:03.566256" 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-04-17T03:22:03.565123" elapsed="0.001240">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-04-17T03:22:03.548276" elapsed="0.018265">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:22:04.585550" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:22:04.598751" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:22:04.598973" 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-04-17T03:22:04.585342" elapsed="0.013674"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:04.599774" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:04.599287" elapsed="0.000586"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:22:04.600773" 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-04-17T03:22:04.600135" elapsed="0.000740">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-04-17T03:22:04.584792" elapsed="0.016273">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:22:05.619893" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:22:05.632968" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:22:05.633259" 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-04-17T03:22:05.619640" elapsed="0.013716"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:05.634644" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:05.633851" elapsed="0.000903"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:22:05.636193" 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-04-17T03:22:05.635197" elapsed="0.001181">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-04-17T03:22:05.618869" elapsed="0.017873">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:22:06.657561" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:22:06.670609" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:22:06.670809" 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-04-17T03:22:06.657326" elapsed="0.013522"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:06.671893" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:06.671343" elapsed="0.000643"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:22:06.672787" 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-04-17T03:22:06.672209" elapsed="0.000703">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-04-17T03:22:06.656641" elapsed="0.016561">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:22:07.695051" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:22:07.709035" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:22:07.709601" 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-04-17T03:22:07.694823" elapsed="0.014869"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:07.711666" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:07.710485" elapsed="0.001338"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:22:07.713099" 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-04-17T03:22:07.712325" elapsed="0.000939">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-04-17T03:22:07.694277" elapsed="0.019242">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:22:08.733435" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:22:08.747557" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:22:08.748113" 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-04-17T03:22:08.733185" elapsed="0.015018"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:08.750025" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:08.748972" elapsed="0.001183"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:22:08.751780" 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-04-17T03:22:08.750539" elapsed="0.001528">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-04-17T03:22:08.732427" elapsed="0.019974">0 != 3</status>
</kw>
<msg time="2026-04-17T03:22:08.752634" 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-04-17T03:21:58.357271" elapsed="10.395572">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-04-17T03:22:08.768540" elapsed="0.000130"/>
</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-04-17T03:22:08.782556" elapsed="0.000102"/>
</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-04-17T03:22:08.795206" elapsed="0.000072"/>
</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-04-17T03:22:08.808138" elapsed="0.000070"/>
</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-04-17T03:22:08.811313" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:22:08.810724" elapsed="0.000665"/>
</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-04-17T03:22:08.809753" elapsed="0.001713"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-04-17T03:22:08.809113" elapsed="0.002435"/>
</kw>
<doc>Check incomming updates for new routes</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:21:58.289772" elapsed="10.521834">Keyword 'Check_File_For_Word_Count' failed after retrying for 10 seconds. The last error was: 0 != 3</status>
</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-04-17T03:22:08.816843" elapsed="0.000468"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:22:08.816458" elapsed="0.000962"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:22:08.819316" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:08.819089" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:08.819049" elapsed="0.000382"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:22:08.825106" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:08.824995" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:08.824976" elapsed="0.000360"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:22:08.826435" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:22:08.826010" elapsed="0.000453"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:22:08.826955" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:22:08.826632" elapsed="0.000351"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:22:08.827030" elapsed="0.000045"/>
</return>
<msg time="2026-04-17T03:22:08.827208" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:22:08.825596" elapsed="0.001637"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:22:08.833442" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:08.833315" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:08.833293" elapsed="0.000225"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:22:08.835052" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:08.834889" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:08.834866" elapsed="0.000387"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:22:08.835811" level="INFO">${karaf_connection_index} = 34</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:22:08.835460" elapsed="0.000379"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:22:08.836282" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:22:08.836042" elapsed="0.000269"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:22:08.837258" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:22:08.836888" elapsed="0.001326">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:22:08.838423" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:22:08.838469" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:08.836533" elapsed="0.001959"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:22:08.839300" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:22:08.839031" elapsed="0.001036">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:22:08.840322" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:22:08.840372" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:08.838664" elapsed="0.001731"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:22:08.841500" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_Stop_BGP_Peer"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:22:08.840748" elapsed="0.000817">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_Stop_BGP_Peer"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:22:08.840477" elapsed="0.001175">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_Stop_BGP_Peer"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:22:08.840456" elapsed="0.001245">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_Stop_BGP_Peer"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:08.841885" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:08.842205" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:08.842016" elapsed="0.000258"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:08.841993" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:22:08.842352" elapsed="0.000021"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:22:08.845788" elapsed="0.000214"/>
</kw>
<msg time="2026-04-17T03:22:08.846081" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:22:08.844207" elapsed="0.002016"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:08.846520" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:08.846974" elapsed="0.000083"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:22:08.843436" elapsed="0.003745"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:22:08.842758" elapsed="0.004494"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:22:08.834538" elapsed="0.012813">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_Stop_BGP_Peer"</status>
</kw>
<msg time="2026-04-17T03:22:08.847470" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:22:08.847516" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC2_Stop_BGP_Peer"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:08.833689" elapsed="0.013850"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:22:08.847736" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:08.847622" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:08.847602" elapsed="0.000203"/>
</if>
<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-04-17T03:22:08.849029" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:08.848896" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:08.848876" elapsed="0.000220"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:22:08.849416" level="INFO">index=15
host=10.30.171.238
alias=bgp_peer_console
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-04-17T03:22:08.849527" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=bgp_peer_console
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=st...</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:22:08.849263" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:08.850088" level="INFO">{1: 34}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:08.849705" elapsed="0.000428"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:08.850576" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:08.850290" elapsed="0.000331"/>
</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-04-17T03:22:08.851189" elapsed="0.000274"/>
</kw>
<msg time="2026-04-17T03:22:08.851562" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:22:08.851609" level="INFO">${old_connection_index} = 34</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:08.850785" elapsed="0.000846"/>
</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-04-17T03:22:08.852498" elapsed="0.000201"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:22:08.853809" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:22:08.853381" elapsed="0.001427">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:08.852869" elapsed="0.002038"/>
</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-04-17T03:22:08.855634" elapsed="0.000434"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:08.855101" elapsed="0.001066"/>
</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-04-17T03:22:08.851973" elapsed="0.004248"/>
</kw>
<status status="PASS" start="2026-04-17T03:22:08.851706" elapsed="0.004574"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:08.851688" elapsed="0.004619"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:22:08.857349" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:22:08.856914" elapsed="0.000471"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:22:08.857448" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:22:08.857627" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:22:08.856545" elapsed="0.001106"/>
</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-04-17T03:22:08.857815" elapsed="0.000507"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:22:08.858627" level="INFO">index=35
host=10.30.170.120
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-04-17T03:22:08.858794" level="INFO">${karaf_connection_object} = index=35
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:22:08.858510" elapsed="0.000321"/>
</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-04-17T03:22:08.859036" elapsed="0.005317"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:22:08.864803" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:22:08.868123" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:22:08.864528" elapsed="0.004701">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:22:08.891892" elapsed="0.000497"/>
</kw>
<msg time="2026-04-17T03:22:08.892520" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:22:08.890112" elapsed="0.002596"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:08.892887" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:08.893078" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:22:08.871693" elapsed="0.021478"/>
</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-04-17T03:22:08.870065" elapsed="0.023159"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:22:08.848519" elapsed="0.044818">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:08.893836" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:22:08.894199" 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="FAIL" start="2026-04-17T03:22:08.832893" elapsed="0.061477">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:22:08.894516" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:22:08.894563" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:08.827663" elapsed="0.066925"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:08.895015" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:08.894696" elapsed="0.000376"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:08.894667" elapsed="0.000435"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:22:08.827509" elapsed="0.067623"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:22:08.827306" elapsed="0.067870"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:22:08.824585" elapsed="0.070663"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:22:08.818452" elapsed="0.076861"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:08.817676" elapsed="0.077705"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:22:08.813293" elapsed="0.082154"/>
</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-04-17T03:22:08.895985" elapsed="0.000120"/>
</kw>
<status status="PASS" start="2026-04-17T03:22:08.895621" elapsed="0.000543"/>
</kw>
<kw name="Stop_Console_Tool" owner="BGPcliKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:22:08.897314" 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-04-17T03:22:08.896972" elapsed="0.000370"/>
</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-04-17T03:22:08.897685" elapsed="0.000677"/>
</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-04-17T03:22:08.896678" elapsed="0.001759"/>
</kw>
<kw name="Read" owner="SSHLibrary">
<msg time="2026-04-17T03:22:10.899582" level="INFO">^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-188-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-04-17T03:22:10.900180" level="INFO">${output} = ^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.ser...</msg>
<var>${output}</var>
<arg>delay=1s</arg>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-04-17T03:22:08.898710" elapsed="2.001545"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:10.901846" level="INFO">^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-188-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-04-17T03:22:10.900968" elapsed="0.001036"/>
</kw>
<doc>Stop the tool if still running.</doc>
<status status="PASS" start="2026-04-17T03:22:08.896349" elapsed="2.005812"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:22:10.916602" level="INFO">Executing command 'cat bgp_peer.log'.</msg>
<msg time="2026-04-17T03:22:10.930620" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:22:10.930979" level="INFO">${output_log} = 2026-04-17 03:21:14,582 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:21:14,582 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.238
2026-04-17 03:21:14,582 DEBUG BGP-Thr...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-17T03:22:10.916326" elapsed="0.014728"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:10.932436" level="INFO">2026-04-17 03:21:14,582 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:21:14,582 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.238
2026-04-17 03:21:14,582 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-04-17 03:21:14,583 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.120
2026-04-17 03:21:14,583 DEBUG BGP-Thread-1 (job): Remote port: 1790</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:10.931594" elapsed="0.000979"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-04-17T03:22:10.934122" 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-04-17T03:22:10.933117" elapsed="0.001141"/>
</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-04-17T03:22:10.915766" elapsed="0.018655"/>
</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-04-17T03:22:10.936109" elapsed="0.000458"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-04-17T03:22:10.935202" elapsed="0.001456"/>
</kw>
<doc>Stop BGP peer tool</doc>
<tag>critical</tag>
<status status="PASS" start="2026-04-17T03:22:08.812470" elapsed="2.124243"/>
</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-04-17T03:22:10.942650" elapsed="0.000345"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:22:10.942260" elapsed="0.000828"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:22:10.944709" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:10.944494" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:10.944454" elapsed="0.000364"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:22:10.951297" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:10.951118" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:10.951093" elapsed="0.000309"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:22:10.952878" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:22:10.952341" elapsed="0.000583"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:22:10.953493" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:22:10.953155" elapsed="0.000365"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:22:10.953567" elapsed="0.000054"/>
</return>
<msg time="2026-04-17T03:22:10.953784" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:22:10.951836" elapsed="0.001977"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:22:10.962093" elapsed="0.000050"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:10.961680" elapsed="0.000576"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:10.961592" elapsed="0.000922"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:22:10.966482" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:10.966191" elapsed="0.000413"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:10.966144" elapsed="0.000515"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:22:10.967736" level="INFO">${karaf_connection_index} = 35</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:22:10.967117" elapsed="0.000663"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:22:10.968379" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:22:10.968048" elapsed="0.000370"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:22:10.969598" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:22:10.969165" elapsed="0.002042">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:22:10.971554" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:22:10.971625" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:10.968648" elapsed="0.003013"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:22:10.972903" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:22:10.972522" elapsed="0.001336">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:22:10.974169" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:22:10.974234" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:10.971970" elapsed="0.002296"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:22:10.975687" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC3_BGP_Application_Peer_Put_3_Routes"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:22:10.974695" elapsed="0.001083">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC3_BGP_Application_Peer_Put_3_Routes"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:22:10.974374" elapsed="0.001506">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC3_BGP_Application_Peer_Put_3_Routes"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:22:10.974346" elapsed="0.001605">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC3_BGP_Application_Peer_Put_3_Routes"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:10.976191" elapsed="0.000031"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:10.976512" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:10.976315" elapsed="0.000269"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:10.976289" elapsed="0.000330"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:22:10.976664" elapsed="0.000022"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:22:10.980312" elapsed="0.000157"/>
</kw>
<msg time="2026-04-17T03:22:10.980540" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:22:10.979030" elapsed="0.001647"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:10.980973" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:10.981310" 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-04-17T03:22:10.977884" elapsed="0.003628"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:22:10.977097" 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="FAIL" start="2026-04-17T03:22:10.965319" elapsed="0.016357">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC3_BGP_Application_Peer_Put_3_Routes"</status>
</kw>
<msg time="2026-04-17T03:22:10.981785" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:22:10.981830" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC3_BGP_Application_Peer_Put_3_Routes"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:10.963272" elapsed="0.018582"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:22:10.982122" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:10.981977" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:10.981915" elapsed="0.000355"/>
</if>
<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-04-17T03:22:10.983275" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:10.983165" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:10.983147" elapsed="0.000197"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:22:10.983647" level="INFO">index=15
host=10.30.171.238
alias=bgp_peer_console
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-04-17T03:22:10.983756" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=bgp_peer_console
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=st...</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:22:10.983507" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:10.984225" level="INFO">{1: 35}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:10.983952" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:10.984668" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:10.984422" elapsed="0.000290"/>
</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-04-17T03:22:10.985273" elapsed="0.000318"/>
</kw>
<msg time="2026-04-17T03:22:10.985696" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:22:10.985743" level="INFO">${old_connection_index} = 35</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:10.984876" elapsed="0.000890"/>
</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-04-17T03:22:10.986654" elapsed="0.000205"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:22:10.988080" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:22:10.987645" elapsed="0.001551">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:10.987150" elapsed="0.002165"/>
</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-04-17T03:22:10.990052" elapsed="0.000285"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:10.989520" elapsed="0.000930"/>
</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-04-17T03:22:10.986103" elapsed="0.004402"/>
</kw>
<status status="PASS" start="2026-04-17T03:22:10.985846" elapsed="0.004711"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:10.985825" elapsed="0.004758"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:22:10.991492" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:22:10.991172" elapsed="0.000347"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:22:10.991569" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:22:10.991726" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:22:10.990801" elapsed="0.000950"/>
</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-04-17T03:22:10.991910" elapsed="0.000483"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:22:10.992699" level="INFO">index=36
host=10.30.170.120
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-04-17T03:22:10.992800" level="INFO">${karaf_connection_object} = index=36
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:22:10.992585" elapsed="0.000242"/>
</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-04-17T03:22:10.992995" elapsed="0.002567"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:22:10.996019" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:22:10.997379" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:22:10.995733" elapsed="0.002033">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:22:11.012648" elapsed="0.000510"/>
</kw>
<msg time="2026-04-17T03:22:11.013377" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:22:11.010678" elapsed="0.002882"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:11.013742" elapsed="0.000058"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:11.014037" elapsed="0.000027"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:22:10.998692" elapsed="0.015461"/>
</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-04-17T03:22:10.998103" elapsed="0.016113"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:22:10.982791" elapsed="0.031543">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:11.014807" elapsed="0.000031"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:22:11.014895" elapsed="0.000367"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:22:10.960490" elapsed="0.054886">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:22:11.015514" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:22:11.015560" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:10.954429" elapsed="0.061155"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:11.015999" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:11.015678" elapsed="0.000379"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:11.015654" elapsed="0.000431"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:22:10.954257" elapsed="0.061855"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:22:10.953952" elapsed="0.062202"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:22:10.950580" elapsed="0.065643"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:22:10.944025" elapsed="0.072261"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:10.943313" elapsed="0.073023"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:22:10.938271" elapsed="0.078125"/>
</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-04-17T03:22:11.016867" elapsed="0.000126"/>
</kw>
<status status="PASS" start="2026-04-17T03:22:11.016556" elapsed="0.000493"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:22:11.026619" level="INFO">${start_cmd} = python3 bgp_app_peer.py --host 10.30.170.120 --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.120/tables=bgp-t...</msg>
<var>${start_cmd}</var>
<arg>${command} ${tool_opt}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:22:11.026198" elapsed="0.000452"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:11.027086" level="INFO">python3 bgp_app_peer.py --host 10.30.170.120 --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.120/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-04-17T03:22:11.026816" elapsed="0.000318"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:22:11.032206" level="INFO">python3 bgp_app_peer.py --host 10.30.170.120 --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.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family &amp;&gt;/dev/null</msg>
<msg time="2026-04-17T03:22:11.032311" level="INFO">${output} =  python3 bgp_app_peer.py --host 10.30.170.120 --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.120/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-04-17T03:22:11.027288" elapsed="0.005050"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:11.032773" level="INFO"> python3 bgp_app_peer.py --host 10.30.170.120 --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.120/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-04-17T03:22:11.032504" elapsed="0.000318"/>
</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-04-17T03:22:11.025653" elapsed="0.007225"/>
</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-04-17T03:22:11.170451" level="INFO">[?2004l[?2004h[jenkins@releng-26932-188-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-04-17T03:22:11.038049" elapsed="0.132618"/>
</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-04-17T03:22:11.037485" elapsed="0.133297"/>
</kw>
<arg>${BGP_APP_PEER_TIMEOUT}</arg>
<doc>Wait ${timeout} for the tool exit.</doc>
<status status="PASS" start="2026-04-17T03:22:11.037059" elapsed="0.133856"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:22:11.183101" level="INFO">Executing command 'cat bgp_app_peer.log'.</msg>
<msg time="2026-04-17T03:22:11.196208" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:22:11.196360" level="INFO">${output_log} = 2026-04-17 03:22:11,124 INFO: Put 3 prefix(es) in a single request (starting from 8.0.1.0/28) into 10.30.170.120:8181/rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:22:11.182923" elapsed="0.013473"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:11.197238" level="INFO">2026-04-17 03:22:11,124 INFO: Put 3 prefix(es) in a single request (starting from 8.0.1.0/28) into 10.30.170.120:8181/rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:11.196672" elapsed="0.000654"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-04-17T03:22:11.198292" 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-04-17T03:22:11.197685" elapsed="0.000709"/>
</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-04-17T03:22:11.182489" elapsed="0.016020"/>
</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-04-17T03:22:11.199618" elapsed="0.000386"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-04-17T03:22:11.199075" elapsed="0.001020"/>
</kw>
<doc>Start BGP application peer tool and give him 30s</doc>
<tag>critical</tag>
<status status="PASS" start="2026-04-17T03:22:10.937383" elapsed="0.262769"/>
</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-04-17T03:22:11.205780" elapsed="0.000277"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:22:11.205507" elapsed="0.000624"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:22:11.207375" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:11.207219" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:11.207184" elapsed="0.000277"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:22:11.212906" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:11.212797" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:11.212778" elapsed="0.000224"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:22:11.214117" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:22:11.213674" elapsed="0.000472"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:22:11.214705" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:22:11.214329" elapsed="0.000409"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:22:11.214795" elapsed="0.000048"/>
</return>
<msg time="2026-04-17T03:22:11.215028" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:22:11.213247" elapsed="0.001813"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:22:11.220707" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:11.220598" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:11.220579" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:22:11.222004" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:11.221862" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:11.221844" elapsed="0.000227"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:22:11.222526" level="INFO">${karaf_connection_index} = 36</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:22:11.222218" elapsed="0.000335"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:22:11.223011" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:22:11.222713" elapsed="0.000324"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:22:11.223810" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:22:11.223538" elapsed="0.000973">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:22:11.224701" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:22:11.224748" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:11.223199" elapsed="0.001572"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:22:11.225547" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:22:11.225308" elapsed="0.000914">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:22:11.226409" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:22:11.226455" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:11.224962" elapsed="0.001515"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:22:11.227568" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC3_Check_Example-IPv4-Topology_Is_Filled_With_3_Routes"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:22:11.226773" elapsed="0.000858">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC3_Check_Example-IPv4-Topology_Is_Filled_With_3_Routes"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:22:11.226551" elapsed="0.001153">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC3_Check_Example-IPv4-Topology_Is_Filled_With_3_Routes"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:22:11.226533" elapsed="0.001205">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC3_Check_Example-IPv4-Topology_Is_Filled_With_3_Routes"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:11.227901" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:11.228174" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:11.228026" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:11.227988" elapsed="0.000263"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:22:11.228284" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:22:11.231089" elapsed="0.000147"/>
</kw>
<msg time="2026-04-17T03:22:11.231304" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:22:11.229748" elapsed="0.001683"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:11.231699" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:11.232055" 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-04-17T03:22:11.229125" 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-04-17T03:22:11.228564" elapsed="0.003781"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:22:11.221559" elapsed="0.010874">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC3_Check_Example-IPv4-Topology_Is_Filled_With_3_Routes"</status>
</kw>
<msg time="2026-04-17T03:22:11.232534" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:22:11.232577" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC3_Check_Example-IPv4-Topology_Is_Filled_With_3_Routes"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:11.220951" elapsed="0.011651"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:22:11.232782" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:11.232676" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:11.232658" elapsed="0.000189"/>
</if>
<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-04-17T03:22:11.233654" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:11.233551" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:11.233534" elapsed="0.000186"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:22:11.234032" level="INFO">index=16
host=10.30.171.238
alias=bgp_app_peer_console
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-04-17T03:22:11.234176" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.238
alias=bgp_app_peer_console
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_error...</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:22:11.233871" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:11.234622" level="INFO">{1: 36}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:11.234358" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:11.235137" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:11.234819" elapsed="0.000361"/>
</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-04-17T03:22:11.235708" elapsed="0.000300"/>
</kw>
<msg time="2026-04-17T03:22:11.236108" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:22:11.236154" level="INFO">${old_connection_index} = 36</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:11.235340" elapsed="0.000837"/>
</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-04-17T03:22:11.236990" elapsed="0.000191"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:22:11.238253" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:22:11.237820" elapsed="0.001358">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:11.237348" elapsed="0.001929"/>
</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-04-17T03:22:11.239969" elapsed="0.000274"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:11.239453" elapsed="0.000873"/>
</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-04-17T03:22:11.236472" elapsed="0.003899"/>
</kw>
<status status="PASS" start="2026-04-17T03:22:11.236252" elapsed="0.004168"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:11.236235" elapsed="0.004209"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:22:11.241301" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:22:11.240995" elapsed="0.000333"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:22:11.241376" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:22:11.241531" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:22:11.240649" elapsed="0.000905"/>
</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-04-17T03:22:11.241707" elapsed="0.000455"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:22:11.242605" level="INFO">index=37
host=10.30.170.120
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-04-17T03:22:11.242707" level="INFO">${karaf_connection_object} = index=37
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:22:11.242335" elapsed="0.000399"/>
</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-04-17T03:22:11.242884" elapsed="0.002308"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:22:11.245621" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:22:11.247116" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:22:11.245356" elapsed="0.002136">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:22:11.261276" elapsed="0.000387"/>
</kw>
<msg time="2026-04-17T03:22:11.261752" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:22:11.259938" elapsed="0.001962"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:11.262295" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:11.262460" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:22:11.248323" elapsed="0.014218"/>
</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-04-17T03:22:11.247785" elapsed="0.014839"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:22:11.233260" elapsed="0.029447">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:11.263094" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:22:11.263171" 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="FAIL" start="2026-04-17T03:22:11.220256" elapsed="0.043020">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:22:11.263381" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:22:11.263424" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:11.215526" elapsed="0.047921"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:11.263776" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:11.263524" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:11.263506" elapsed="0.000349"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:22:11.215375" elapsed="0.048503"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:22:11.215140" elapsed="0.048769"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:22:11.212406" elapsed="0.051586"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:22:11.206874" elapsed="0.057175"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:11.206330" elapsed="0.057765"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:22:11.201640" elapsed="0.062507"/>
</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-04-17T03:22:11.316623" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:22:11.316232" elapsed="0.000424"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:22:11.317563" 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-04-17T03:22:11.317179" elapsed="0.000490">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-04-17T03:22:11.317782" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:22:11.316825" elapsed="0.000987"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:22:11.318442" 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-04-17T03:22:11.318045" elapsed="0.000425"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:22:11.318771" 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-04-17T03:22:11.318953" 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-04-17T03:22:11.318632" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:11.319382" 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-04-17T03:22:11.319135" 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-04-17T03:22:11.320613" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:11.320173" elapsed="0.000500"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:22:11.321272" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:22:11.320835" elapsed="0.000463"/>
</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-04-17T03:22:11.321767" elapsed="0.000047"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:11.322517" 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-04-17T03:22:11.322855" elapsed="0.000045"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:22:11.321540" elapsed="0.001504"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:22:11.321354" elapsed="0.001757"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:22:11.323162" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:22:11.323334" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:22:11.319810" elapsed="0.003549"/>
</kw>
<status status="PASS" start="2026-04-17T03:22:11.319500" elapsed="0.003890"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:11.323561" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:11.323414" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:11.319477" elapsed="0.004158"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:22:11.324235" 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-04-17T03:22:11.323776" elapsed="0.000487"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:22:11.324310" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:22:11.315591" elapsed="0.008842"/>
</kw>
<msg time="2026-04-17T03:22:11.324487" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:22:11.302634" elapsed="0.021899"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:22:11.337527" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:11.349940" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:11.362469" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:11.362673" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:11.362852" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:11.363246" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:11.363098" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:11.363082" 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-04-17T03:22:11.363465" 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-04-17T03:22:11.363681" 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-04-17T03:22:11.363847" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:22:11.363051" elapsed="0.000848"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:22:11.362945" elapsed="0.000994"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:11.364088" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:11.364164" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:22:11.364289" 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-04-17T03:22:11.298317" elapsed="0.065999"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:22:11.365714" 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-04-17T03:22:11.365447" elapsed="0.000341">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-04-17T03:22:11.365880" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:22:11.365085" elapsed="0.000819"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:11.366240" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:11.365990" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:22:11.366797" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:22:11.366505" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-04-17T03:22:11.366321" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:11.365972" elapsed="0.000905"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:22:11.369294" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:22:11.367043" elapsed="0.002277"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:22:11.369371" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:22:11.369526" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:22:11.364721" elapsed="0.004830"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:22:11.370771" 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-04-17T03:22:11.370542" elapsed="0.000291">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-04-17T03:22:11.370940" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:22:11.370207" elapsed="0.000759"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:22:11.371170" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:22:11.371036" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:11.371018" elapsed="0.000235"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:11.371399" 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-04-17T03:22:11.371569" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:22:11.371633" elapsed="0.000014"/>
</return>
<msg time="2026-04-17T03:22:11.373904" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:22:11.369866" elapsed="0.004088"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:11.375509" 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-04-17T03:22:11.375259" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:11.375983" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:11.375719" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:22:11.381105" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:11.582891" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:11.985574" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:11.987962" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:22:11.378220" elapsed="0.613657">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:22:11.376094" elapsed="0.616011">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:22:11.992532" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:11.992180" elapsed="0.000485"/>
</branch>
<status status="FAIL" start="2026-04-17T03:22:11.376076" elapsed="0.616638">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:22:11.993448" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:11.993683" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:11.993600" elapsed="0.000155"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:11.993572" elapsed="0.000225"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:11.994089" elapsed="0.000036"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:22:11.994198" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:22:11.374352" elapsed="0.620047">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:11.994537" elapsed="0.000026"/>
</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-04-17T03:22:11.275706" elapsed="0.718982">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:22:11.995121" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:11.994822" elapsed="0.000404"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:11.994799" elapsed="0.000518"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:11.995371" elapsed="0.000022"/>
</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="FAIL" start="2026-04-17T03:22:11.269391" elapsed="0.726134">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:22:11.265139" elapsed="0.730533">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:22:13.056023" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:22:13.055587" elapsed="0.000472"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:22:13.057018" 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-04-17T03:22:13.056583" elapsed="0.000513">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-04-17T03:22:13.057193" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:22:13.056237" elapsed="0.000981"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:22:13.057778" 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-04-17T03:22:13.057385" elapsed="0.000420"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:22:13.058127" 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-04-17T03:22:13.058289" 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-04-17T03:22:13.057984" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:13.058735" 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-04-17T03:22:13.058475" 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-04-17T03:22:13.060065" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:13.059594" elapsed="0.000535"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:22:13.060653" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:22:13.060294" elapsed="0.000386"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:13.061105" 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-04-17T03:22:13.061835" 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-04-17T03:22:13.062277" elapsed="0.000050"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:22:13.060900" elapsed="0.001552"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:22:13.060736" elapsed="0.001784"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:22:13.062573" elapsed="0.000053"/>
</return>
<msg time="2026-04-17T03:22:13.062813" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:22:13.059232" elapsed="0.003614"/>
</kw>
<status status="PASS" start="2026-04-17T03:22:13.058858" elapsed="0.004024"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:13.063088" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:13.062907" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:13.058835" elapsed="0.004330"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:22:13.063780" 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-04-17T03:22:13.063308" elapsed="0.000500"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:22:13.063943" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:22:13.054860" elapsed="0.009278"/>
</kw>
<msg time="2026-04-17T03:22:13.064216" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:22:13.041865" elapsed="0.022420"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:22:13.079787" 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-04-17T03:22:13.092333" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:22:13.104891" elapsed="0.000047"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:13.105151" 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-04-17T03:22:13.105335" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:13.105780" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:13.105599" elapsed="0.000245"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:13.105582" elapsed="0.000289"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:13.106045" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:13.106214" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:13.106380" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:22:13.105542" elapsed="0.000890"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:22:13.105421" elapsed="0.001043"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:13.106816" elapsed="0.000031"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:13.106921" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:22:13.107100" 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-04-17T03:22:13.037477" elapsed="0.069654"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:22:13.108800" 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-04-17T03:22:13.108476" elapsed="0.000422">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-04-17T03:22:13.109053" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:22:13.107968" elapsed="0.001122"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:13.109473" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:13.109184" elapsed="0.000359"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:22:13.110156" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:22:13.109802" elapsed="0.000381"/>
</kw>
<status status="PASS" start="2026-04-17T03:22:13.109569" elapsed="0.000651"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:13.109162" elapsed="0.001079"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:22:13.112745" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:22:13.110397" elapsed="0.002376"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:22:13.112828" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:22:13.113006" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:22:13.107524" elapsed="0.005507"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:22:13.114463" 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-04-17T03:22:13.114176" elapsed="0.000360">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-04-17T03:22:13.114632" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:22:13.113752" elapsed="0.000904"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:22:13.114875" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:22:13.114734" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:13.114712" 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-04-17T03:22:13.115162" 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-04-17T03:22:13.115381" elapsed="0.000024"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:22:13.115455" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:22:13.117835" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:22:13.113356" elapsed="0.004507"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:13.119369" 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-04-17T03:22:13.119102" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:13.119821" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:13.119573" 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-04-17T03:22:13.125047" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:13.326801" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:13.730152" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:13.732578" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:22:13.122155" elapsed="0.615536">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:22:13.119993" elapsed="0.618088">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:22:13.738615" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:13.738176" elapsed="0.000595"/>
</branch>
<status status="FAIL" start="2026-04-17T03:22:13.119963" elapsed="0.618865">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:22:13.739789" elapsed="0.000063"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:13.740148" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:13.740063" elapsed="0.000184"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:13.740021" elapsed="0.000274"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:13.740626" elapsed="0.000048"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:22:13.740783" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:22:13.118220" elapsed="0.622844">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:13.741246" elapsed="0.000035"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:22:13.014768" elapsed="0.726694">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:22:13.742216" elapsed="0.000058"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:13.741672" elapsed="0.000716"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:13.741636" elapsed="0.000805"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:13.742492" elapsed="0.000019"/>
</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="FAIL" start="2026-04-17T03:22:13.006449" elapsed="0.736150">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:22:12.996452" elapsed="0.746250">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:22:14.824000" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:22:14.823564" elapsed="0.000473"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:22:14.825014" 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-04-17T03:22:14.824570" elapsed="0.000527">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-04-17T03:22:14.825271" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:22:14.824220" elapsed="0.001077"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:22:14.825866" 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-04-17T03:22:14.825470" elapsed="0.000424"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:22:14.826225" 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-04-17T03:22:14.826385" 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-04-17T03:22:14.826079" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:14.826831" 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-04-17T03:22:14.826575" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:14.828189" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:14.827705" elapsed="0.000547"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:22:14.828780" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:22:14.828416" elapsed="0.000392"/>
</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-04-17T03:22:14.829279" elapsed="0.000048"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:14.830066" 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-04-17T03:22:14.830415" elapsed="0.000046"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:22:14.829077" elapsed="0.001514"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:22:14.828866" elapsed="0.001794"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:22:14.830712" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:22:14.830889" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:22:14.827338" elapsed="0.003577"/>
</kw>
<status status="PASS" start="2026-04-17T03:22:14.826977" elapsed="0.003997"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:14.831239" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:14.831008" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:14.826951" elapsed="0.004373"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:22:14.832002" 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-04-17T03:22:14.831477" elapsed="0.000562"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:22:14.832098" 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//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-04-17T03:22:14.822859" elapsed="0.009374"/>
</kw>
<msg time="2026-04-17T03:22:14.832291" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:22:14.808731" elapsed="0.023614"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:22:14.846724" 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//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-04-17T03:22:14.861458" elapsed="0.000048"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:22:14.874441" elapsed="0.000054"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:14.874706" 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-04-17T03:22:14.874889" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:14.875345" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:14.875170" elapsed="0.000235"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:14.875152" elapsed="0.000282"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:14.875596" 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-04-17T03:22:14.875786" 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-04-17T03:22:14.875992" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:22:14.875113" elapsed="0.000939"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:22:14.874996" elapsed="0.001086"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:14.876252" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:14.876338" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:22:14.876504" 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-04-17T03:22:14.801945" elapsed="0.074590"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:22:14.878077" 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-04-17T03:22:14.877753" elapsed="0.000403">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-04-17T03:22:14.878258" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:22:14.877320" elapsed="0.000965"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:14.878697" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:14.878363" elapsed="0.000397"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:22:14.879338" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:22:14.879017" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-04-17T03:22:14.878787" elapsed="0.000616"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:14.878343" elapsed="0.001083"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:22:14.882143" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:22:14.879602" elapsed="0.002569"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:22:14.882229" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:22:14.882449" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:22:14.876913" elapsed="0.005562"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:22:14.883843" 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-04-17T03:22:14.883576" elapsed="0.000336">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-04-17T03:22:14.884146" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:22:14.883204" elapsed="0.000969"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:22:14.884400" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-17T03:22:14.884252" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:14.884232" elapsed="0.000259"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:14.884658" 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-04-17T03:22:14.884848" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:22:14.884919" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:22:14.887212" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:22:14.882820" elapsed="0.004419"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:14.888678" 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-04-17T03:22:14.888418" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:14.889144" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:14.888877" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:22:14.894247" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:15.102995" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:15.505342" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:15.508033" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:22:14.891373" elapsed="0.621855">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:22:14.889252" elapsed="0.624201">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:22:15.513859" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:15.513540" elapsed="0.000439"/>
</branch>
<status status="FAIL" start="2026-04-17T03:22:14.889235" elapsed="0.624780">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:22:15.514659" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:15.514863" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:15.514807" elapsed="0.000143"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:15.514778" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:15.515193" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:22:15.515291" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:22:14.887567" elapsed="0.627888">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:15.515648" elapsed="0.000037"/>
</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-04-17T03:22:14.756169" elapsed="0.759661">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:22:15.516253" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:15.515990" elapsed="0.000368"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:15.515964" elapsed="0.000427"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:15.516437" elapsed="0.000021"/>
</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="FAIL" start="2026-04-17T03:22:14.749828" elapsed="0.766751">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:22:14.743217" elapsed="0.773518">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:22:16.577840" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:22:16.577349" elapsed="0.000528"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:22:16.578950" 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-04-17T03:22:16.578485" elapsed="0.000558">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-04-17T03:22:16.579145" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:22:16.578078" elapsed="0.001092"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:22:16.579852" 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-04-17T03:22:16.579410" elapsed="0.000471"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:22:16.580277" 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-04-17T03:22:16.580463" 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-04-17T03:22:16.580122" elapsed="0.000382"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:16.581011" 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-04-17T03:22:16.580702" 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-04-17T03:22:16.582448" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:16.581956" elapsed="0.000563"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:22:16.583129" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:22:16.582689" elapsed="0.000468"/>
</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-04-17T03:22:16.583643" elapsed="0.000049"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:16.584433" elapsed="0.000059"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:22:16.584983" elapsed="0.000066"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:22:16.583393" elapsed="0.001810"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:22:16.583214" elapsed="0.002070"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:22:16.585353" elapsed="0.000048"/>
</return>
<msg time="2026-04-17T03:22:16.585579" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:22:16.581575" elapsed="0.004042"/>
</kw>
<status status="PASS" start="2026-04-17T03:22:16.581180" elapsed="0.004480"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:16.585894" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:16.585694" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:16.581142" elapsed="0.004872"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:22:16.586848" 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-04-17T03:22:16.586210" elapsed="0.000674"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:22:16.586969" 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//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-04-17T03:22:16.576576" elapsed="0.010554"/>
</kw>
<msg time="2026-04-17T03:22:16.587201" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:22:16.563101" elapsed="0.024165"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:22:16.600921" 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/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-04-17T03:22:16.615755" 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//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-04-17T03:22:16.628967" elapsed="0.000058"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:16.629277" 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-04-17T03:22:16.629488" 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-04-17T03:22:16.630004" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:16.629820" elapsed="0.000244"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:16.629760" elapsed="0.000332"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:16.630239" 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-04-17T03:22:16.630521" 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-04-17T03:22:16.630692" elapsed="0.000024"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:22:16.629718" elapsed="0.001129"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:22:16.629587" elapsed="0.001298"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:16.631117" elapsed="0.000028"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:16.631242" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:22:16.631433" 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-04-17T03:22:16.558310" elapsed="0.073153"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:22:16.633004" 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-04-17T03:22:16.632686" elapsed="0.000398">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-04-17T03:22:16.633181" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:22:16.632251" elapsed="0.000955"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:16.633547" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:16.633279" elapsed="0.000327"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:22:16.634241" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:22:16.633868" elapsed="0.000400"/>
</kw>
<status status="PASS" start="2026-04-17T03:22:16.633631" elapsed="0.000674"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:16.633260" elapsed="0.001066"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:22:16.636802" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:22:16.634479" elapsed="0.002351"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:22:16.636882" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:22:16.637061" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:22:16.631826" elapsed="0.005261"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:22:16.638409" 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-04-17T03:22:16.638142" elapsed="0.000335">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-04-17T03:22:16.638572" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:22:16.637772" elapsed="0.000842"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:22:16.638893" elapsed="0.000056"/>
</return>
<status status="PASS" start="2026-04-17T03:22:16.638721" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:16.638696" elapsed="0.000338"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:16.639240" 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-04-17T03:22:16.639480" elapsed="0.000030"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:22:16.639569" elapsed="0.000021"/>
</return>
<msg time="2026-04-17T03:22:16.641855" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:22:16.637401" elapsed="0.004484"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:16.643363" 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-04-17T03:22:16.643100" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:16.643807" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:16.643562" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:22:16.648815" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:16.850484" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:17.253194" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:17.255913" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:22:16.646072" elapsed="0.615167">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:22:16.643916" elapsed="0.617554">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:22:17.261952" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:17.261562" elapsed="0.000522"/>
</branch>
<status status="FAIL" start="2026-04-17T03:22:16.643898" elapsed="0.618225">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:22:17.262853" elapsed="0.000042"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:17.263104" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:17.263038" elapsed="0.000136"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:17.263006" elapsed="0.000203"/>
</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-04-17T03:22:17.263453" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:22:17.263565" elapsed="0.000024"/>
</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-04-17T03:22:16.642233" elapsed="0.621515">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:17.263873" elapsed="0.000026"/>
</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-04-17T03:22:16.534718" elapsed="0.729339">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:22:17.264513" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:17.264211" elapsed="0.000421"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:17.264184" elapsed="0.000485"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:17.264720" elapsed="0.000023"/>
</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="FAIL" start="2026-04-17T03:22:16.528126" elapsed="0.736757">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:22:16.517438" elapsed="0.747702">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:22:18.326042" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:22:18.325552" elapsed="0.000527"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:22:18.327119" 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-04-17T03:22:18.326643" elapsed="0.000559">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-04-17T03:22:18.327302" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:22:18.326261" elapsed="0.001068"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:22:18.327919" 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-04-17T03:22:18.327499" elapsed="0.000474"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:22:18.328298" 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-04-17T03:22:18.328471" 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-04-17T03:22:18.328145" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:18.328945" 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-04-17T03:22:18.328663" elapsed="0.000339"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:18.330652" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:18.330057" elapsed="0.000664"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:22:18.331303" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:22:18.330891" elapsed="0.000449"/>
</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-04-17T03:22:18.331820" elapsed="0.000048"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:18.332641" elapsed="0.000057"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:22:18.333018" elapsed="0.000048"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:22:18.331616" elapsed="0.001574"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:22:18.331416" elapsed="0.001845"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:22:18.333315" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:22:18.333508" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:22:18.329579" elapsed="0.003955"/>
</kw>
<status status="PASS" start="2026-04-17T03:22:18.329107" elapsed="0.004460"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:18.333768" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:18.333593" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:18.329075" elapsed="0.004776"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:22:18.334526" 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-04-17T03:22:18.334021" elapsed="0.000564"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:22:18.334636" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:22:18.324821" elapsed="0.009947"/>
</kw>
<msg time="2026-04-17T03:22:18.334887" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:22:18.311263" elapsed="0.023696"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:22:18.348751" elapsed="0.000049"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:22:18.362243" elapsed="0.000065"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:22:18.375820" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:18.376114" 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-04-17T03:22:18.376305" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:18.376730" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:18.376575" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:18.376557" 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-04-17T03:22:18.376974" 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-04-17T03:22:18.377144" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:18.377352" elapsed="0.000029"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:22:18.376516" elapsed="0.000906"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:22:18.376393" elapsed="0.001057"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:18.377602" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:18.377683" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:22:18.377844" 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-04-17T03:22:18.306328" elapsed="0.071545"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:22:18.379469" 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-04-17T03:22:18.379156" elapsed="0.000395">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-04-17T03:22:18.379651" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:22:18.378719" 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-04-17T03:22:18.380126" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:18.379766" elapsed="0.000421"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:22:18.380708" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:22:18.380400" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-04-17T03:22:18.380214" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:18.379748" elapsed="0.001046"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:22:18.383203" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:22:18.380965" elapsed="0.002264"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:22:18.383282" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:22:18.383441" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:22:18.378325" elapsed="0.005141"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:22:18.384688" 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-04-17T03:22:18.384455" elapsed="0.000297">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-04-17T03:22:18.384849" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:22:18.384118" elapsed="0.000756"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:22:18.385103" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:22:18.384966" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:18.384948" elapsed="0.000240"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:18.385339" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:18.385514" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:22:18.385579" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:22:18.387652" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:22:18.383777" elapsed="0.003902"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:18.389537" 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-04-17T03:22:18.389158" elapsed="0.000447"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:18.390249" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:18.389824" elapsed="0.000490"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:22:18.396730" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:18.598530" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:19.001343" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:19.004777" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:22:18.393366" elapsed="0.617724">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:22:18.390408" elapsed="0.620972">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:22:19.012148" elapsed="0.000066"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:19.011493" elapsed="0.000964"/>
</branch>
<status status="FAIL" start="2026-04-17T03:22:18.390381" elapsed="0.622137">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:22:19.013353" elapsed="0.000049"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:19.013609" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:19.013537" elapsed="0.000154"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:19.013501" elapsed="0.000220"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:19.013969" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:22:19.014075" elapsed="0.000025"/>
</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-04-17T03:22:18.388086" elapsed="0.626191">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:19.014395" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:22:18.281446" elapsed="0.733109">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:22:19.015022" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:19.014710" elapsed="0.000426"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:19.014683" elapsed="0.000495"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:19.015233" elapsed="0.000024"/>
</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="FAIL" start="2026-04-17T03:22:18.274307" elapsed="0.741093">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:22:18.265913" elapsed="0.749660">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:22:20.084990" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:22:20.084530" elapsed="0.000495"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:22:20.086088" 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-04-17T03:22:20.085605" elapsed="0.000561">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-04-17T03:22:20.086263" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:22:20.085246" elapsed="0.001042"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:22:20.086874" 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-04-17T03:22:20.086455" elapsed="0.000541"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:22:20.087314" 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-04-17T03:22:20.087472" 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-04-17T03:22:20.087167" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:20.087922" 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-04-17T03:22:20.087664" elapsed="0.000322"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:20.089318" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:20.088837" elapsed="0.000545"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:22:20.089957" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:22:20.089577" 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-04-17T03:22:20.090390" elapsed="0.000051"/>
</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-04-17T03:22:20.091245" 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-04-17T03:22:20.091628" elapsed="0.000054"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:22:20.090201" elapsed="0.001659"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:22:20.090039" elapsed="0.001944"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:22:20.092056" elapsed="0.000052"/>
</return>
<msg time="2026-04-17T03:22:20.092309" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:22:20.088426" elapsed="0.003920"/>
</kw>
<status status="PASS" start="2026-04-17T03:22:20.088067" elapsed="0.004325"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:20.092711" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:20.092433" elapsed="0.000366"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:20.088042" elapsed="0.004789"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:22:20.093773" 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-04-17T03:22:20.093082" elapsed="0.000732"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:22:20.093887" elapsed="0.000062"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:22:20.083733" elapsed="0.010361"/>
</kw>
<msg time="2026-04-17T03:22:20.094175" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:22:20.066374" elapsed="0.027877"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:22:20.112261" elapsed="0.000059"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:22:20.125060" 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/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-04-17T03:22:20.137867" elapsed="0.000073"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:20.138264" 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-04-17T03:22:20.138514" 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-04-17T03:22:20.138996" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:20.138801" elapsed="0.000260"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:20.138782" 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-04-17T03:22:20.139257" elapsed="0.000030"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:20.139484" 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-04-17T03:22:20.139683" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:22:20.138742" elapsed="0.000998"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:22:20.138610" elapsed="0.001159"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:20.139919" elapsed="0.000050"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:20.140042" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:22:20.140206" 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-04-17T03:22:20.060910" elapsed="0.079325"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:22:20.141772" 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-04-17T03:22:20.141464" elapsed="0.000385">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-04-17T03:22:20.141962" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:22:20.141033" elapsed="0.000963"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:20.142361" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:20.142086" elapsed="0.000369"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:22:20.143057" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:22:20.142687" elapsed="0.000401"/>
</kw>
<status status="PASS" start="2026-04-17T03:22:20.142488" elapsed="0.000636"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:20.142067" elapsed="0.001078"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:22:20.145632" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:22:20.143300" elapsed="0.002360"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:22:20.145716" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:22:20.145879" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:22:20.140627" elapsed="0.005278"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:22:20.147340" 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-04-17T03:22:20.147050" elapsed="0.000362">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-04-17T03:22:20.147534" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:22:20.146674" elapsed="0.000886"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:22:20.147863" elapsed="0.000048"/>
</return>
<status status="PASS" start="2026-04-17T03:22:20.147706" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:20.147685" elapsed="0.000314"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:20.148174" 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-04-17T03:22:20.148394" elapsed="0.000024"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:22:20.148485" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:22:20.150798" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:22:20.146271" elapsed="0.004557"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:20.152399" 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-04-17T03:22:20.152108" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:20.152858" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:20.152606" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:22:20.158097" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:20.359768" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:20.761689" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:20.764430" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:22:20.155135" elapsed="0.613487">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:22:20.153017" elapsed="0.615755">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:22:20.769170" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:20.768836" elapsed="0.000436"/>
</branch>
<status status="FAIL" start="2026-04-17T03:22:20.152995" elapsed="0.616312">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:22:20.770091" elapsed="0.000051"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:20.770350" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:20.770281" elapsed="0.000137"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:20.770247" elapsed="0.000200"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:20.770658" elapsed="0.000038"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:22:20.770780" elapsed="0.000025"/>
</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-04-17T03:22:20.151226" elapsed="0.619756">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:20.771160" 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-04-17T03:22:20.033299" elapsed="0.738008">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:22:20.771761" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:20.771441" elapsed="0.000430"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:20.771417" elapsed="0.000487"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:20.771978" elapsed="0.000023"/>
</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="FAIL" start="2026-04-17T03:22:20.023293" elapsed="0.748832">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:22:20.016183" elapsed="0.756086">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:22:21.833456" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//filled_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:22:21.832901" elapsed="0.000599"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:22:21.834716" 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-04-17T03:22:21.834203" elapsed="0.000596">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-04-17T03:22:21.834900" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:22:21.833737" elapsed="0.001212"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:22:21.835639" 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-04-17T03:22:21.835127" elapsed="0.000542"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:22:21.836012" 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-04-17T03:22:21.836179" 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-04-17T03:22:21.835840" elapsed="0.000367"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:21.836627" 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-04-17T03:22:21.836371" 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-04-17T03:22:21.838000" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:21.837508" elapsed="0.000556"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:22:21.838690" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:22:21.838231" 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-04-17T03:22:21.839157" 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-04-17T03:22:21.839899" elapsed="0.000081"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:22:21.840310" elapsed="0.000048"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:22:21.838963" elapsed="0.001601"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:22:21.838777" elapsed="0.001859"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:22:21.840690" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:22:21.840869" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:22:21.837115" elapsed="0.003779"/>
</kw>
<status status="PASS" start="2026-04-17T03:22:21.836757" elapsed="0.004187"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:21.841123" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:21.840972" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:21.836729" elapsed="0.004470"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:22:21.841804" 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-04-17T03:22:21.841344" elapsed="0.000488"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:22:21.841882" 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-04-17T03:22:21.832072" elapsed="0.009958"/>
</kw>
<msg time="2026-04-17T03:22:21.842086" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:22:21.818615" elapsed="0.023522"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:22:21.856299" 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//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-04-17T03:22:21.869631" elapsed="0.000042"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:22:21.882725" elapsed="0.000038"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:21.883010" 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-04-17T03:22:21.883201" elapsed="0.000019"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:21.883623" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:21.883468" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:21.883450" 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-04-17T03:22:21.883853" 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-04-17T03:22:21.884038" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:21.884205" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:22:21.883409" elapsed="0.000848"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:22:21.883287" elapsed="0.000998"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:21.884433" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:21.884583" elapsed="0.000021"/>
</return>
<msg time="2026-04-17T03:22:21.884746" 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-04-17T03:22:21.814191" elapsed="0.070583"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:22:21.886224" 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-04-17T03:22:21.885885" elapsed="0.000416">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-04-17T03:22:21.886396" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:22:21.885490" elapsed="0.000931"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:21.886753" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:21.886491" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:22:21.887331" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:22:21.887031" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-17T03:22:21.886834" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:21.886474" elapsed="0.000940"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:22:21.889763" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:22:21.887565" elapsed="0.002225"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:22:21.889842" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:22:21.890025" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:22:21.885127" elapsed="0.004923"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:22:21.891303" 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-04-17T03:22:21.891045" elapsed="0.000323">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-04-17T03:22:21.891462" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:22:21.890684" elapsed="0.000803"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:22:21.891725" elapsed="0.000047"/>
</return>
<status status="PASS" start="2026-04-17T03:22:21.891556" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:21.891538" elapsed="0.000330"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:21.892067" elapsed="0.000026"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:21.892250" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:22:21.892314" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:22:21.894411" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:22:21.890360" elapsed="0.004078"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:21.895922" 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-04-17T03:22:21.895663" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:21.896385" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:21.896139" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:22:21.901492" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:22.102966" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:22.505114" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:22.507438" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:22:21.898584" elapsed="0.612144">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:22:21.896494" elapsed="0.614390">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:22:22.511277" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:22.510968" elapsed="0.000409"/>
</branch>
<status status="FAIL" start="2026-04-17T03:22:21.896476" elapsed="0.614934">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:22:22.512089" elapsed="0.000042"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:22.512302" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:22.512244" elapsed="0.000122"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:22.512214" elapsed="0.000183"/>
</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-04-17T03:22:22.512607" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:22:22.512707" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:22:21.894755" elapsed="0.618116">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:22.513014" 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-04-17T03:22:21.790724" elapsed="0.722436">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:22:22.513560" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:22.513296" elapsed="0.000369"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:22.513271" elapsed="0.000427"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:22.513744" elapsed="0.000020"/>
</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="FAIL" start="2026-04-17T03:22:21.781747" elapsed="0.732139">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:22:21.772829" elapsed="0.741227">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:22:22.514297" level="FAIL">Keyword 'Compare_Topology' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-17T03:22:11.264634" elapsed="11.249805">Keyword 'Compare_Topology' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>filled_topology</arg>
<doc>Wait until Compare_Topology matches expected result.</doc>
<status status="FAIL" start="2026-04-17T03:22:11.264295" elapsed="11.250302">Keyword 'Compare_Topology' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:22:22.516626" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:22:22.516164" elapsed="0.000525"/>
</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-04-17T03:22:22.515572" elapsed="0.001191"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-04-17T03:22:22.515087" elapsed="0.001760"/>
</kw>
<doc>See new routes in example-ipv4-topology as a proof that synchronization was correct.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:22:11.200594" elapsed="11.316310">Keyword 'Compare_Topology' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:22:22.521219" elapsed="0.000221"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:22:22.520941" elapsed="0.000557"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:22:22.522557" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:22.522431" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:22.522410" elapsed="0.000216"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:22:22.528607" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:22.528469" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:22.528450" elapsed="0.000225"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:22:22.529803" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:22:22.529331" elapsed="0.000503"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:22:22.530425" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:22:22.530075" elapsed="0.000380"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:22:22.530506" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:22:22.530697" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:22:22.528920" elapsed="0.001805"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:22:22.536412" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:22.536300" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:22.536281" 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-04-17T03:22:22.537681" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:22.537572" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:22.537555" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:22:22.538280" level="INFO">${karaf_connection_index} = 37</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:22:22.537904" elapsed="0.000405"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:22:22.538795" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:22:22.538475" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:22:22.539810" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:22:22.539357" elapsed="0.001186">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:22:22.540739" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:22:22.540786" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:22.539010" elapsed="0.001801"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:22:22.541605" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:22:22.541349" elapsed="0.001177">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:22:22.542771" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:22:22.542827" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:22.541000" elapsed="0.001851"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:22:22.543993" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC3_Reconnect_BGP_Peer_And_Check_Incomming_Updates_For_3_Introduced_Prefixes"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:22:22.543298" elapsed="0.000762">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC3_Reconnect_BGP_Peer_And_Check_Incomming_Updates_For_3_Introduced_Prefixes"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:22:22.542987" elapsed="0.001151">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC3_Reconnect_BGP_Peer_And_Check_Incomming_Updates_For_3_Introduced_Prefixes"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:22:22.542954" elapsed="0.001220">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC3_Reconnect_BGP_Peer_And_Check_Incomming_Updates_For_3_Introduced_Prefixes"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:22.544346" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:22.544577" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:22.544434" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:22.544417" elapsed="0.000235"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:22:22.544689" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:22:22.547569" elapsed="0.000157"/>
</kw>
<msg time="2026-04-17T03:22:22.547801" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:22:22.546256" elapsed="0.001698"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:22.548242" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:22.548584" 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-04-17T03:22:22.545566" elapsed="0.003205"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:22:22.545006" elapsed="0.003830"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:22:22.537269" elapsed="0.011668">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC3_Reconnect_BGP_Peer_And_Check_Incomming_Updates_For_3_Introduced_Prefixes"</status>
</kw>
<msg time="2026-04-17T03:22:22.549048" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:22:22.549092" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC3_Reconnect_BGP_Peer_And_Check_Incomming_Updates_For_3_Introduced_Prefixes"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:22.536639" elapsed="0.012478"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:22:22.549308" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:22.549196" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:22.549177" elapsed="0.000197"/>
</if>
<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-04-17T03:22:22.550273" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:22.550153" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:22.550135" elapsed="0.000205"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:22:22.550632" level="INFO">index=16
host=10.30.171.238
alias=bgp_app_peer_console
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-04-17T03:22:22.550807" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.238
alias=bgp_app_peer_console
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_error...</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:22:22.550499" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:22.551417" level="INFO">{1: 37}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:22.551129" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:22.551868" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:22.551617" elapsed="0.000295"/>
</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-04-17T03:22:22.552481" elapsed="0.000269"/>
</kw>
<msg time="2026-04-17T03:22:22.552850" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:22:22.552896" level="INFO">${old_connection_index} = 37</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:22.552092" elapsed="0.000826"/>
</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-04-17T03:22:22.553841" elapsed="0.000330"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:22:22.555687" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:22:22.555040" elapsed="0.001590">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:22.554406" elapsed="0.002325"/>
</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-04-17T03:22:22.557394" elapsed="0.000282"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:22.556907" elapsed="0.000854"/>
</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-04-17T03:22:22.553279" elapsed="0.004531"/>
</kw>
<status status="PASS" start="2026-04-17T03:22:22.553012" elapsed="0.004881"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:22.552993" elapsed="0.004928"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:22:22.558843" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:22:22.558500" elapsed="0.000371"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:22:22.559016" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:22:22.559191" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:22:22.558161" elapsed="0.001055"/>
</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-04-17T03:22:22.559380" elapsed="0.000473"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:22:22.560160" level="INFO">index=38
host=10.30.170.120
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-04-17T03:22:22.560261" level="INFO">${karaf_connection_object} = index=38
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:22:22.560043" elapsed="0.000245"/>
</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-04-17T03:22:22.560438" elapsed="0.002311"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:22:22.563265" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:22:22.564399" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:22:22.562986" elapsed="0.001799">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:22:22.579780" elapsed="0.000531"/>
</kw>
<msg time="2026-04-17T03:22:22.580415" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:22:22.578235" elapsed="0.002346"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:22.580744" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:22.580909" elapsed="0.000038"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:22:22.565667" elapsed="0.015353"/>
</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-04-17T03:22:22.565108" elapsed="0.016034"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:22:22.549800" elapsed="0.031437">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:22.581650" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:22:22.581766" elapsed="0.000023"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:22:22.535948" elapsed="0.045939">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:22:22.582478" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:22:22.582537" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:22.531178" elapsed="0.051388"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:22.583054" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:22.582680" elapsed="0.000444"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:22.582652" elapsed="0.000506"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:22:22.531007" elapsed="0.052182"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:22:22.530791" elapsed="0.052441"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:22:22.527898" elapsed="0.055412"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:22:22.522126" elapsed="0.061263"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:22.521652" elapsed="0.061800"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:22:22.518114" elapsed="0.065409"/>
</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-04-17T03:22:22.584009" elapsed="0.000117"/>
</kw>
<status status="PASS" start="2026-04-17T03:22:22.583693" elapsed="0.000491"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:22:22.593354" level="INFO">${start_cmd} = python3 play.py --amount 0 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --peerport=1790 --debug </msg>
<var>${start_cmd}</var>
<arg>${command} ${tool_opt}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:22:22.592978" elapsed="0.000405"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:22.593839" level="INFO">python3 play.py --amount 0 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --peerport=1790 --debug </msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:22.593543" elapsed="0.000341"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:22:22.605483" level="INFO">python3 play.py --amount 0 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --peerport=1790 --debug  [A[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[K</msg>
<msg time="2026-04-17T03:22:22.605775" level="INFO">${output} = python3 play.py --amount 0 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --peerport=1790 --debug  [A[C[C[C[C[C[C[C...</msg>
<var>${output}</var>
<arg>${start_cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-17T03:22:22.594057" elapsed="0.011766"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:22.606430" level="INFO">python3 play.py --amount 0 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --peerport=1790 --debug  [A[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[C[K 
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:22.606075" elapsed="0.000540"/>
</kw>
<arg>${BGP_PEER_COMMAND}</arg>
<arg>${BGP_PEER_OPTIONS}</arg>
<doc>Start the tool ${command} ${tool_opt}</doc>
<status status="PASS" start="2026-04-17T03:22:22.592548" elapsed="0.014150"/>
</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-04-17T03:22:32.609531" level="FAIL">No match found for '&gt;' in 10 seconds
Output:
[?2004l2026-04-17 03:22:22,667 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:22:22,668 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.238
2026-04-17 03:22:22,668 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-04-17 03:22:22,668 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.120
2026-04-17 03:22:22,668 DEBUG BGP-Thread-1 (job): Remote port: 1790
Exception in thread Thread-1 (job):
Traceback (most recent call last):
  File "/usr/lib/python3.10/threading.py", line 1016, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.10/threading.py", line 953, in run
    self._target(*self._args, **self._kwargs)
  File "/home/jenkins/play.py", line 2406, in job
    bgp_socket = establish_connection(arguments)
  File "/home/jenkins/play.py", line 284, in establish_connection
    talking_socket.connect((str(arguments.peerip), arguments.peerport))
ConnectionRefusedError: [Errno 111] Connection refused
.</msg>
<var>${text}</var>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="FAIL" start="2026-04-17T03:22:22.608871" elapsed="10.001637">No match found for '&gt;' in 10 seconds
Output:
[?2004l2026-04-17 03:22:22,667 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:22:22,668 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.238
2026-04-17 03:22:22,668 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-04-17 03:22:22,668 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.120
2026-04-17 03:22:22,668 DEBUG BGP-Thread-1 (job): Remote port: 1790
Exception in thread Thread-1 (job):
Traceback (most recent call last):
  File "/usr/lib/python3.10/threading.py", line 1016, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.10/threading.py", line 953, in run
    self._target(*self._args, **self._kwargs)
  File "/home/jenkins/play.py", line 2406, in job
    bgp_socket = establish_connection(arguments)
  File "/home/jenkins/play.py", line 284, in establish_connection
    talking_socket.connect((str(arguments.peerip), arguments.peerport))
ConnectionRefusedError: [Errno 111] Connection refused
.</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-04-17T03:22:32.610843" 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-04-17T03:22:22.608522" elapsed="10.002515">No match found for '&gt;' in 10 seconds
Output:
[?2004l2026-04-17 03:22:22,667 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:22:22,668 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.238
2026-04-17 03:22:22,668 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-04-17 03:22:22,668 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.120
2026-04-17 03:22:22,668 DEBUG BGP-Thread-1 (job): Remote port: 1790
Exception in thread Thread-1 (job):
Traceback (most recent call last):
  File "/usr/lib/python3.10/threading.py", line 1016, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.10/threading.py", line 953, in run
    self._target(*self._args, **self._kwargs)
  File "/home/jenkins/play.py", line 2406, in job
    bgp_socket = establish_connection(arguments)
  File "/home/jenkins/play.py", line 284, in establish_connection
    talking_socket.connect((str(arguments.peerip), arguments.peerport))
ConnectionRefusedError: [Errno 111] Connection refused
.</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-04-17T03:22:22.608005" elapsed="10.003241"/>
</kw>
<msg time="2026-04-17T03:22:32.611404" 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-04-17T03:22:22.607495" elapsed="10.003941"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-04-17T03:22:32.611659" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-17T03:22:32.611556" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:32.611520" elapsed="0.000239"/>
</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-04-17T03:22:32.612024" elapsed="0.000030"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was seen but it was not expected yet</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:32.612206" 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-04-17T03:22:22.607095" elapsed="10.005193"/>
</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-04-17T03:22:32.626277" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:22:32.639095" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:22:32.639336" 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-04-17T03:22:32.626056" elapsed="0.013318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:32.640390" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:32.639689" elapsed="0.000765"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:22:32.641223" 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-04-17T03:22:32.640670" elapsed="0.000652">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-04-17T03:22:32.625457" elapsed="0.016021">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:22:33.656979" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:22:33.669760" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:22:33.670095" 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-04-17T03:22:33.656762" elapsed="0.013395"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:33.671411" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:33.670600" elapsed="0.000921"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:22:33.672751" 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-04-17T03:22:33.671875" elapsed="0.001029">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-04-17T03:22:33.656261" elapsed="0.016927">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:22:34.692363" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:22:34.705682" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:22:34.705961" 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-04-17T03:22:34.692087" elapsed="0.013911"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:34.706812" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:34.706311" elapsed="0.000552"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:22:34.707440" 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-04-17T03:22:34.707043" elapsed="0.000474">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-04-17T03:22:34.691312" elapsed="0.016390">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:22:35.726890" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:22:35.739710" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:22:35.739977" 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-04-17T03:22:35.726690" elapsed="0.013348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:35.741099" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:35.740420" elapsed="0.000781"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:22:35.742460" 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-04-17T03:22:35.741552" elapsed="0.001070">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-04-17T03:22:35.726197" elapsed="0.016671">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:22:36.758468" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:22:36.771885" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:22:36.772241" 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-04-17T03:22:36.758115" elapsed="0.014177"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:36.773592" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:36.772982" elapsed="0.000695"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:22:36.774754" 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-04-17T03:22:36.774001" elapsed="0.000896">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-04-17T03:22:36.757245" elapsed="0.017912">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:22:37.792088" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:22:37.804885" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:22:37.805183" 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-04-17T03:22:37.791871" elapsed="0.013373"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:37.806599" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:37.805727" elapsed="0.000984"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:22:37.808023" 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-04-17T03:22:37.807099" elapsed="0.001084">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-04-17T03:22:37.791322" elapsed="0.017111">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:22:38.828411" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:22:38.841290" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:22:38.841444" 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-04-17T03:22:38.828165" elapsed="0.013316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:38.842163" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:38.841721" elapsed="0.000508"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:22:38.843078" 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-04-17T03:22:38.842485" elapsed="0.000704">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-04-17T03:22:38.827675" elapsed="0.015685">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:22:39.860858" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:22:39.874327" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:22:39.874486" 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-04-17T03:22:39.860573" elapsed="0.013949"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:39.875216" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:39.874769" elapsed="0.000510"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:22:39.876070" 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-04-17T03:22:39.875490" elapsed="0.000699">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-04-17T03:22:39.859964" elapsed="0.016401">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:22:40.893776" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:22:40.907180" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:22:40.907444" 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-04-17T03:22:40.893531" elapsed="0.013957"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:40.908387" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:40.907841" elapsed="0.000619"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:22:40.909274" 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-04-17T03:22:40.908698" elapsed="0.000680">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-04-17T03:22:40.892910" elapsed="0.016637">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:22:41.929622" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:22:41.942956" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:22:41.943132" 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-04-17T03:22:41.929255" elapsed="0.013905"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:41.944163" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:41.943416" elapsed="0.000855"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:22:41.945612" 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-04-17T03:22:41.944640" elapsed="0.001135">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-04-17T03:22:41.928525" elapsed="0.017557">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:22:42.965468" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:22:42.979452" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:22:42.979721" 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-04-17T03:22:42.965269" elapsed="0.014563"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:42.981036" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:42.980313" elapsed="0.000836"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:22:42.982354" 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-04-17T03:22:42.981513" elapsed="0.000996">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-04-17T03:22:42.964779" elapsed="0.018198">0 != 3</status>
</kw>
<msg time="2026-04-17T03:22:42.983185" 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-04-17T03:22:32.612449" elapsed="10.370940">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:</arg>
<arg>3</arg>
<doc>Count ${word} in ${file_name}. Expect ${expected_count} occurence(s)</doc>
<status status="NOT RUN" start="2026-04-17T03:22:42.998791" elapsed="0.000032"/>
</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-04-17T03:22:43.010068" elapsed="0.000029"/>
</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-04-17T03:22:43.021267" elapsed="0.000031"/>
</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-04-17T03:22:43.032758" elapsed="0.000031"/>
</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-04-17T03:22:43.044762" elapsed="0.000033"/>
</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-04-17T03:22:43.046352" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:22:43.046016" elapsed="0.000385"/>
</kw>
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-04-17T03:22:43.045559" elapsed="0.000898"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-04-17T03:22:43.045187" elapsed="0.001331"/>
</kw>
<doc>Start BGP peer tool</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:22:22.517259" elapsed="20.529299">Keyword 'Check_File_For_Word_Count' failed after retrying for 10 seconds. The last error was: 0 != 3</status>
</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-04-17T03:22:43.052241" elapsed="0.000259"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:22:43.051946" 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-04-17T03:22:43.053784" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:43.053643" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:43.053611" elapsed="0.000251"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:22:43.059068" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:43.058947" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:43.058911" elapsed="0.000264"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:22:43.060544" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:22:43.060068" elapsed="0.000517"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:22:43.061265" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:22:43.060814" elapsed="0.000479"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:22:43.061342" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:22:43.061516" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:22:43.059509" elapsed="0.002032"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:22:43.067413" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:43.067284" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:43.067255" elapsed="0.000241"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:22:43.068963" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:43.068824" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:43.068801" elapsed="0.000239"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:22:43.069587" level="INFO">${karaf_connection_index} = 38</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:22:43.069218" elapsed="0.000397"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:22:43.070048" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:22:43.069780" elapsed="0.000301"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:22:43.070908" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:22:43.070631" elapsed="0.001250">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:22:43.072119" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:22:43.072178" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:43.070284" elapsed="0.001928"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:22:43.073036" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:22:43.072766" elapsed="0.001059">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:22:43.074052" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:22:43.074098" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:43.072417" elapsed="0.001704"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:22:43.075112" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC3_BGP_Application_Peer_Delete_All_Routes"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:22:43.074431" elapsed="0.000744">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC3_BGP_Application_Peer_Delete_All_Routes"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:22:43.074201" elapsed="0.001049">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC3_BGP_Application_Peer_Delete_All_Routes"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:22:43.074180" elapsed="0.001105">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC3_BGP_Application_Peer_Delete_All_Routes"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:43.075452" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:43.075702" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:43.075540" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:43.075522" elapsed="0.000257"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:22:43.075978" elapsed="0.000020"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:22:43.078779" elapsed="0.000232"/>
</kw>
<msg time="2026-04-17T03:22:43.079103" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:22:43.077555" elapsed="0.001717"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:43.079550" elapsed="0.000102"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:43.079913" 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-04-17T03:22:43.076902" elapsed="0.003217"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:22:43.076290" elapsed="0.003895"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:22:43.068417" elapsed="0.011871">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC3_BGP_Application_Peer_Delete_All_Routes"</status>
</kw>
<msg time="2026-04-17T03:22:43.080425" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:22:43.080470" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC3_BGP_Application_Peer_Delete_All_Routes"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:43.067727" elapsed="0.012767"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:22:43.080682" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:43.080572" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:43.080553" elapsed="0.000194"/>
</if>
<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-04-17T03:22:43.081628" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:43.081521" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:43.081503" elapsed="0.000193"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:22:43.082005" level="INFO">index=15
host=10.30.171.238
alias=bgp_peer_console
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-04-17T03:22:43.082114" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=bgp_peer_console
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=st...</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:22:43.081848" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:43.082555" level="INFO">{1: 38}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:43.082292" elapsed="0.000494"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:43.083252" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:43.083004" elapsed="0.000290"/>
</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-04-17T03:22:43.083838" elapsed="0.000286"/>
</kw>
<msg time="2026-04-17T03:22:43.084225" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:22:43.084272" level="INFO">${old_connection_index} = 38</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:43.083450" elapsed="0.000845"/>
</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-04-17T03:22:43.085136" elapsed="0.000198"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:22:43.086435" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:22:43.086021" elapsed="0.001539">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:43.085509" elapsed="0.002196"/>
</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-04-17T03:22:43.088425" elapsed="0.000498"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:43.087882" elapsed="0.001148"/>
</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-04-17T03:22:43.084602" elapsed="0.004476"/>
</kw>
<status status="PASS" start="2026-04-17T03:22:43.084372" elapsed="0.004755"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:43.084352" elapsed="0.004800"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:22:43.090100" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:22:43.089745" elapsed="0.000382"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:22:43.090213" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:22:43.090374" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:22:43.089363" elapsed="0.001037"/>
</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-04-17T03:22:43.090561" elapsed="0.000459"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:22:43.091300" level="INFO">index=39
host=10.30.170.120
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-04-17T03:22:43.091405" level="INFO">${karaf_connection_object} = index=39
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:22:43.091192" elapsed="0.000248"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:22:43.091694" elapsed="0.002342"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:22:43.094466" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:22:43.097461" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:22:43.094204" elapsed="0.003710">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:22:43.112652" elapsed="0.000470"/>
</kw>
<msg time="2026-04-17T03:22:43.113231" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:22:43.110860" elapsed="0.002537"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:43.113565" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:43.113728" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:22:43.098862" elapsed="0.014950"/>
</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-04-17T03:22:43.098261" elapsed="0.015600"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:22:43.081220" elapsed="0.032761">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:43.114386" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:22:43.114463" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:22:43.066873" elapsed="0.047706">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:22:43.114692" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:22:43.114736" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:43.061969" elapsed="0.052791"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:43.115389" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:43.114844" elapsed="0.000599"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:43.114823" elapsed="0.000646"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:22:43.061804" elapsed="0.053689"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:22:43.061608" elapsed="0.053993"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:22:43.058532" elapsed="0.057161"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:22:43.053315" elapsed="0.062439"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:43.052824" elapsed="0.062976"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:22:43.047699" elapsed="0.068156"/>
</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-04-17T03:22:43.116372" elapsed="0.000108"/>
</kw>
<status status="PASS" start="2026-04-17T03:22:43.116090" elapsed="0.000447"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:22:43.128385" level="INFO">${start_cmd} = python3 bgp_app_peer.py --host 10.30.170.120 --port 8181 --command delete-all --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-type...</msg>
<var>${start_cmd}</var>
<arg>${command} ${tool_opt}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:22:43.127799" elapsed="0.000634"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:43.129092" level="INFO">python3 bgp_app_peer.py --host 10.30.170.120 --port 8181 --command delete-all --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:22:43.128700" elapsed="0.000462"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:22:43.134863" level="INFO">python3 bgp_app_peer.py --host 10.30.170.120 --port 8181 --command delete-all --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family &amp;&gt;/dev/null</msg>
<msg time="2026-04-17T03:22:43.135047" level="INFO">${output} =  python3 bgp_app_peer.py --host 10.30.170.120 --port 8181 --command delete-all --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:22:43.129387" elapsed="0.005696"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:43.135748" level="INFO"> python3 bgp_app_peer.py --host 10.30.170.120 --port 8181 --command delete-all --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:22:43.135324" elapsed="0.000506"/>
</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-04-17T03:22:43.126989" elapsed="0.008926"/>
</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-04-17T03:22:43.274371" level="INFO">[?2004l[?2004h[jenkins@releng-26932-188-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-04-17T03:22:43.143019" elapsed="0.131489"/>
</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-04-17T03:22:43.142243" elapsed="0.132339"/>
</kw>
<arg>${BGP_APP_PEER_TIMEOUT}</arg>
<doc>Wait ${timeout} for the tool exit.</doc>
<status status="PASS" start="2026-04-17T03:22:43.141633" elapsed="0.133039"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:22:43.286501" level="INFO">Executing command 'cat bgp_app_peer.log'.</msg>
<msg time="2026-04-17T03:22:43.299291" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:22:43.299412" level="INFO">${output_log} = 2026-04-17 03:22:43,228 INFO: Delete all prefixes from 10.30.170.120:8181/rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:22:43.286274" elapsed="0.013166"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:43.300683" level="INFO">2026-04-17 03:22:43,228 INFO: Delete all prefixes from 10.30.170.120:8181/rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:43.299828" elapsed="0.001008"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-04-17T03:22:43.302258" 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-04-17T03:22:43.301323" elapsed="0.001075"/>
</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-04-17T03:22:43.285667" elapsed="0.016872"/>
</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-04-17T03:22:43.304096" elapsed="0.000599"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-04-17T03:22:43.303247" elapsed="0.001638"/>
</kw>
<doc>Start BGP application peer tool and give him 30s</doc>
<tag>critical</tag>
<status status="PASS" start="2026-04-17T03:22:43.047058" elapsed="0.257983"/>
</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-04-17T03:22:43.309976" elapsed="0.000221"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:22:43.309688" elapsed="0.000567"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:22:43.311423" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:43.311275" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:43.311225" elapsed="0.000283"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:22:43.316906" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:43.316792" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:43.316772" elapsed="0.000223"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:22:43.318171" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:22:43.317705" elapsed="0.000496"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:22:43.318677" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:22:43.318367" elapsed="0.000336"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:22:43.318749" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:22:43.318918" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:22:43.317234" elapsed="0.001726"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:22:43.324801" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:43.324686" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:43.324666" elapsed="0.000205"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:22:43.326187" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:43.326074" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:43.326056" elapsed="0.000199"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:22:43.326717" level="INFO">${karaf_connection_index} = 39</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:22:43.326405" elapsed="0.000340"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:22:43.327190" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:22:43.326909" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:22:43.328122" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:22:43.327812" elapsed="0.001030">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:22:43.329061" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:22:43.329110" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:43.327443" elapsed="0.001692"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:22:43.329978" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:22:43.329694" elapsed="0.000983">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:22:43.330868" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:22:43.330916" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:43.329324" elapsed="0.001638"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:22:43.331960" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC3_Check_Example-IPv4-Topology_Is_Empty"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:22:43.331309" elapsed="0.000719">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC3_Check_Example-IPv4-Topology_Is_Empty"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:22:43.331043" elapsed="0.001242">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC3_Check_Example-IPv4-Topology_Is_Empty"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:22:43.331023" elapsed="0.001301">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC3_Check_Example-IPv4-Topology_Is_Empty"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:43.332513" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:43.332765" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:43.332605" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:43.332587" elapsed="0.000259"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:22:43.332882" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:22:43.335822" elapsed="0.000177"/>
</kw>
<msg time="2026-04-17T03:22:43.336069" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:22:43.334482" elapsed="0.001721"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:43.336505" elapsed="0.000081"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:43.336914" 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-04-17T03:22:43.333791" elapsed="0.003335"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:22:43.333205" elapsed="0.003988"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:22:43.325720" elapsed="0.011565">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC3_Check_Example-IPv4-Topology_Is_Empty"</status>
</kw>
<msg time="2026-04-17T03:22:43.337393" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:22:43.337440" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC3_Check_Example-IPv4-Topology_Is_Empty"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:43.325092" elapsed="0.012374"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:22:43.337659" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:43.337547" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:43.337528" elapsed="0.000202"/>
</if>
<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-04-17T03:22:43.338620" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:43.338509" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:43.338491" elapsed="0.000200"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:22:43.339054" level="INFO">index=16
host=10.30.171.238
alias=bgp_app_peer_console
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-04-17T03:22:43.339167" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.238
alias=bgp_app_peer_console
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_error...</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:22:43.338860" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:43.339696" level="INFO">{1: 39}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:43.339416" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:43.340187" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:43.339913" elapsed="0.000320"/>
</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-04-17T03:22:43.340809" elapsed="0.000288"/>
</kw>
<msg time="2026-04-17T03:22:43.341202" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:22:43.341249" level="INFO">${old_connection_index} = 39</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:43.340409" elapsed="0.000864"/>
</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-04-17T03:22:43.342186" elapsed="0.000207"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:22:43.343632" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:22:43.343193" elapsed="0.001362">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:43.342580" elapsed="0.002084"/>
</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-04-17T03:22:43.345377" elapsed="0.000292"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:43.344857" elapsed="0.000903"/>
</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-04-17T03:22:43.341593" elapsed="0.004217"/>
</kw>
<status status="PASS" start="2026-04-17T03:22:43.341353" elapsed="0.004512"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:43.341334" elapsed="0.004558"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:22:43.346870" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:22:43.346529" elapsed="0.000369"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:22:43.346976" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:22:43.347139" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:22:43.346169" elapsed="0.000995"/>
</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-04-17T03:22:43.347351" elapsed="0.000509"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:22:43.348184" level="INFO">index=40
host=10.30.170.120
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-04-17T03:22:43.348354" level="INFO">${karaf_connection_object} = index=40
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:22:43.348068" elapsed="0.000319"/>
</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-04-17T03:22:43.348544" elapsed="0.002890"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:22:43.351890" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:22:43.353111" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:22:43.351608" elapsed="0.001959">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:22:43.368415" elapsed="0.000411"/>
</kw>
<msg time="2026-04-17T03:22:43.368946" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:22:43.366780" elapsed="0.002331"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:43.369276" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:43.369442" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:22:43.354499" elapsed="0.015026"/>
</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-04-17T03:22:43.353896" elapsed="0.015679"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:22:43.338202" elapsed="0.031463">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:43.370073" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:22:43.370151" 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="FAIL" start="2026-04-17T03:22:43.324306" elapsed="0.045959">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:22:43.370379" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:22:43.370425" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:43.319431" elapsed="0.051024"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:43.370833" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:43.370557" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:43.370533" elapsed="0.000379"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:22:43.319219" elapsed="0.051917"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:22:43.319023" elapsed="0.052182"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:22:43.316391" elapsed="0.054876"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:22:43.310913" elapsed="0.060413"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:43.310440" elapsed="0.060931"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:22:43.307133" elapsed="0.064295"/>
</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-04-17T03:22:43.428415" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:22:43.428011" elapsed="0.000439"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:22:43.429403" 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-04-17T03:22:43.428994" elapsed="0.000567">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-04-17T03:22:43.429662" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:22:43.428629" elapsed="0.001059"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:22:43.430286" 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-04-17T03:22:43.429856" elapsed="0.000458"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:22:43.430628" 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-04-17T03:22:43.430799" 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-04-17T03:22:43.430481" elapsed="0.000346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:43.431292" 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-04-17T03:22:43.431008" 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-04-17T03:22:43.432573" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:43.432119" elapsed="0.000517"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:22:43.433190" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:22:43.432801" elapsed="0.000416"/>
</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-04-17T03:22:43.433631" elapsed="0.000049"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:43.434379" 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-04-17T03:22:43.434722" elapsed="0.000046"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:22:43.433441" elapsed="0.001448"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:22:43.433272" elapsed="0.001711"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:22:43.435036" elapsed="0.000102"/>
</return>
<msg time="2026-04-17T03:22:43.435319" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:22:43.431745" elapsed="0.003607"/>
</kw>
<status status="PASS" start="2026-04-17T03:22:43.431417" elapsed="0.003977"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:43.435636" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:43.435434" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:43.431393" elapsed="0.004327"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:22:43.436380" 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-04-17T03:22:43.435870" elapsed="0.000546"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:22:43.436480" 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-04-17T03:22:43.427330" elapsed="0.009315"/>
</kw>
<msg time="2026-04-17T03:22:43.436717" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:22:43.411868" elapsed="0.024919"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:22:43.450371" 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//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-04-17T03:22:43.469315" elapsed="0.000092"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:22:43.485704" elapsed="0.000049"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:43.486058" elapsed="0.000035"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:43.486335" 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-04-17T03:22:43.486921" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:43.486698" elapsed="0.000344"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:43.486674" elapsed="0.000405"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:43.487294" 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-04-17T03:22:43.487546" 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-04-17T03:22:43.487795" elapsed="0.000030"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:22:43.486622" elapsed="0.001253"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:22:43.486455" elapsed="0.001459"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:43.488154" elapsed="0.000031"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:43.488269" elapsed="0.000026"/>
</return>
<msg time="2026-04-17T03:22:43.488481" 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-04-17T03:22:43.407543" elapsed="0.080978"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:22:43.490602" 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-04-17T03:22:43.490171" elapsed="0.000540">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-04-17T03:22:43.490850" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:22:43.489564" elapsed="0.001337"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:43.491436" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:43.491046" elapsed="0.000493"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:22:43.492285" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:22:43.491841" elapsed="0.000482"/>
</kw>
<status status="PASS" start="2026-04-17T03:22:43.491580" elapsed="0.000793"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:43.491018" elapsed="0.001385"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:22:43.495889" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:22:43.492654" elapsed="0.003262"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:22:43.495995" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:22:43.496157" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:22:43.489044" elapsed="0.007137"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:22:43.497494" 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-04-17T03:22:43.497251" elapsed="0.000309">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-04-17T03:22:43.497654" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:22:43.496887" elapsed="0.000791"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:22:43.497884" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:22:43.497748" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:43.497730" elapsed="0.000257"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:43.498135" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:43.498308" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:22:43.498374" elapsed="0.000014"/>
</return>
<msg time="2026-04-17T03:22:43.500474" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:22:43.496554" elapsed="0.003947"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:43.502087" 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-04-17T03:22:43.501809" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:43.502531" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:43.502287" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:22:43.510918" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:43.712990" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:44.116158" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:44.118868" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:22:43.506237" elapsed="0.616218">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:22:43.502787" elapsed="0.619822">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:22:44.123017" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:44.122674" elapsed="0.000448"/>
</branch>
<status status="FAIL" start="2026-04-17T03:22:43.502769" elapsed="0.620388">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:22:44.123909" elapsed="0.000087"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:44.124216" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:44.124146" elapsed="0.000141"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:44.124108" elapsed="0.000212"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:44.124547" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:22:44.124721" elapsed="0.000024"/>
</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-04-17T03:22:43.500983" elapsed="0.623914">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:44.125054" elapsed="0.000032"/>
</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-04-17T03:22:43.383279" elapsed="0.741956">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:22:44.125665" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:44.125383" elapsed="0.000414"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:44.125359" elapsed="0.000484"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:44.125905" elapsed="0.000052"/>
</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="FAIL" start="2026-04-17T03:22:43.376848" elapsed="0.749331">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:22:43.372430" elapsed="0.753919">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:22:45.191640" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:22:45.191180" elapsed="0.000497"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:22:45.192874" 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-04-17T03:22:45.192353" 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-04-17T03:22:45.193095" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:22:45.191859" elapsed="0.001261"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:22:45.193731" 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-04-17T03:22:45.193313" elapsed="0.000445"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:22:45.194090" 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-04-17T03:22:45.194259" 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-04-17T03:22:45.193939" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:45.194712" 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-04-17T03:22:45.194452" 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-04-17T03:22:45.196146" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:45.195635" elapsed="0.000591"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:22:45.196947" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:22:45.196441" elapsed="0.000603"/>
</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-04-17T03:22:45.197470" 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-04-17T03:22:45.198241" elapsed="0.000054"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:22:45.198689" elapsed="0.000064"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:22:45.197275" elapsed="0.001639"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:22:45.197103" elapsed="0.001925"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:22:45.199100" elapsed="0.000047"/>
</return>
<msg time="2026-04-17T03:22:45.199329" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:22:45.195227" elapsed="0.004136"/>
</kw>
<status status="PASS" start="2026-04-17T03:22:45.194838" elapsed="0.004570"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:45.199643" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:45.199440" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:45.194813" elapsed="0.004927"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:22:45.200417" 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-04-17T03:22:45.199912" elapsed="0.000542"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:22:45.200519" 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-04-17T03:22:45.190495" elapsed="0.010198"/>
</kw>
<msg time="2026-04-17T03:22:45.200753" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:22:45.177440" elapsed="0.023367"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:22:45.214052" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:22:45.227152" elapsed="0.000056"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:22:45.241097" elapsed="0.000040"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:45.241417" elapsed="0.000040"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:45.241673" 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-04-17T03:22:45.242169" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:45.242012" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:45.241993" 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-04-17T03:22:45.242455" 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-04-17T03:22:45.242899" elapsed="0.000054"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:45.243157" elapsed="0.000024"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:22:45.241947" elapsed="0.001271"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:22:45.241777" elapsed="0.001471"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:45.243400" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:45.243505" elapsed="0.000022"/>
</return>
<msg time="2026-04-17T03:22:45.243678" 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-04-17T03:22:45.172775" elapsed="0.070931"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:22:45.245271" 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-04-17T03:22:45.244950" elapsed="0.000404">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-04-17T03:22:45.245453" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:22:45.244452" elapsed="0.001042"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:45.245887" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:45.245612" elapsed="0.000351"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:22:45.246495" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:22:45.246177" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-04-17T03:22:45.245990" elapsed="0.000578"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:45.245588" elapsed="0.001001"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:22:45.249163" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:22:45.246777" elapsed="0.002414"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:22:45.249245" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:22:45.249411" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:22:45.244082" elapsed="0.005353"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:22:45.250861" 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-04-17T03:22:45.250593" elapsed="0.000354">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-04-17T03:22:45.251083" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:22:45.250188" elapsed="0.000922"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:22:45.251332" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:22:45.251184" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:45.251165" elapsed="0.000253"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:45.251568" 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-04-17T03:22:45.251772" elapsed="0.000024"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:22:45.251843" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:22:45.255590" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:22:45.249787" elapsed="0.005832"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:45.257200" 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-04-17T03:22:45.256897" elapsed="0.000410"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:45.257711" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:45.257464" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:22:45.262918" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:45.464854" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:45.867532" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:45.870422" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:22:45.260003" elapsed="0.616016">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:22:45.257822" elapsed="0.618447">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:22:45.876750" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:45.876366" elapsed="0.000459"/>
</branch>
<status status="FAIL" start="2026-04-17T03:22:45.257804" elapsed="0.619048">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:22:45.877388" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:45.877547" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:45.877502" elapsed="0.000094"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:45.877479" elapsed="0.000141"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:45.877790" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:22:45.877869" 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-04-17T03:22:45.255962" elapsed="0.622064">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:45.878107" 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-04-17T03:22:45.148277" elapsed="0.729931">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:22:45.878498" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:45.878303" elapsed="0.000268"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:45.878286" elapsed="0.000309"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:45.878681" elapsed="0.000017"/>
</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="FAIL" start="2026-04-17T03:22:45.138307" elapsed="0.740482">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:22:45.127167" elapsed="0.751723">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:22:46.944611" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:22:46.944200" elapsed="0.000447"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:22:46.945597" 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-04-17T03:22:46.945191" elapsed="0.000484">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-04-17T03:22:46.945772" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:22:46.944828" elapsed="0.000968"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:22:46.946389" 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-04-17T03:22:46.945984" elapsed="0.000433"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:22:46.946724" 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-04-17T03:22:46.946895" 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-04-17T03:22:46.946580" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:46.947351" 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-04-17T03:22:46.947100" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:46.948613" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:46.948161" elapsed="0.000514"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:22:46.949217" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:22:46.948837" 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-04-17T03:22:46.949649" 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-04-17T03:22:46.950413" 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-04-17T03:22:46.950754" elapsed="0.000045"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:22:46.949460" elapsed="0.001459"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:22:46.949298" elapsed="0.001704"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:22:46.951053" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:22:46.951226" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:22:46.947791" elapsed="0.003459"/>
</kw>
<status status="PASS" start="2026-04-17T03:22:46.947476" 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 variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:46.951455" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:46.951308" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:46.947451" elapsed="0.004081"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:22:46.952141" 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-04-17T03:22:46.951677" elapsed="0.000492"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:22:46.952271" 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-04-17T03:22:46.943547" elapsed="0.008852"/>
</kw>
<msg time="2026-04-17T03:22:46.952454" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:22:46.930777" elapsed="0.021727"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:22:46.965148" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:22:46.978819" 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-04-17T03:22:46.992314" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:46.992523" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:46.992703" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:46.993096" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:46.992947" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:46.992917" 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-04-17T03:22:46.993317" 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-04-17T03:22:46.993483" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:46.993648" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:22:46.992885" elapsed="0.000816"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:22:46.992780" elapsed="0.000947"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:46.993871" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:46.993965" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:22:46.994094" 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-04-17T03:22:46.926090" elapsed="0.068031"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:22:46.995472" 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-04-17T03:22:46.995210" elapsed="0.000381">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-04-17T03:22:46.995694" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:22:46.994825" elapsed="0.000901"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:46.996099" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:46.995820" elapsed="0.000337"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:22:46.996663" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:22:46.996364" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-17T03:22:46.996182" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:46.995798" elapsed="0.000948"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:22:46.999180" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:22:46.996898" elapsed="0.002309"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:22:46.999259" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:22:46.999416" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:22:46.994486" elapsed="0.004955"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:22:47.000664" 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-04-17T03:22:47.000425" elapsed="0.000302">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-04-17T03:22:47.000821" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:22:47.000088" elapsed="0.000757"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:22:47.001067" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:22:47.000915" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:47.000897" elapsed="0.000255"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:47.001297" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:47.001466" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:22:47.001530" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:22:47.003617" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:22:46.999747" elapsed="0.003898"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:47.005067" 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-04-17T03:22:47.004797" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:47.005507" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:47.005266" 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-04-17T03:22:47.010612" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:47.212188" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:47.615015" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:47.617734" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:22:47.007708" elapsed="0.615548">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:22:47.005615" elapsed="0.618041">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:22:47.624237" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:47.623768" elapsed="0.000626"/>
</branch>
<status status="FAIL" start="2026-04-17T03:22:47.005597" elapsed="0.618850">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:22:47.625580" elapsed="0.000090"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:47.626030" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:47.625894" elapsed="0.000252"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:47.625839" elapsed="0.000357"/>
</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-04-17T03:22:47.626529" elapsed="0.000052"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:22:47.626714" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:22:47.003977" elapsed="0.622865">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:47.626921" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:22:46.895395" elapsed="0.731654">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:22:47.627373" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:47.627175" elapsed="0.000273"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:47.627156" elapsed="0.000316"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:47.627504" elapsed="0.000015"/>
</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="FAIL" start="2026-04-17T03:22:46.886276" elapsed="0.741332">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:22:46.879577" elapsed="0.748138">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:22:48.689063" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:22:48.688641" elapsed="0.000458"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:22:48.690047" 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-04-17T03:22:48.689616" elapsed="0.000510">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-04-17T03:22:48.690398" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:22:48.689275" elapsed="0.001149"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:22:48.691012" 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-04-17T03:22:48.690594" elapsed="0.000446"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:22:48.691348" 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-04-17T03:22:48.691505" 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-04-17T03:22:48.691204" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:48.691959" 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-04-17T03:22:48.691691" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:48.693242" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:48.692771" elapsed="0.000532"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:22:48.693829" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:22:48.693465" elapsed="0.000390"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:48.694282" 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-04-17T03:22:48.695043" 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-04-17T03:22:48.695382" elapsed="0.000048"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:22:48.694091" elapsed="0.001461"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:22:48.693910" elapsed="0.001710"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:22:48.695669" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:22:48.695842" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:22:48.692423" elapsed="0.003444"/>
</kw>
<status status="PASS" start="2026-04-17T03:22:48.692087" elapsed="0.003813"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:48.696091" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:48.695941" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:48.692063" elapsed="0.004104"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:22:48.696771" 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-04-17T03:22:48.696323" elapsed="0.000476"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:22:48.696848" 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-04-17T03:22:48.688000" elapsed="0.008990"/>
</kw>
<msg time="2026-04-17T03:22:48.697045" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:22:48.675051" elapsed="0.022044"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:22:48.709673" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:48.722092" 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-04-17T03:22:48.734712" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:48.734958" 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-04-17T03:22:48.735143" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:48.735554" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:48.735403" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:48.735385" 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-04-17T03:22:48.735776" 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-04-17T03:22:48.735956" 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-04-17T03:22:48.736123" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:22:48.735347" elapsed="0.000867"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:22:48.735228" elapsed="0.001020"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:48.736423" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:48.736504" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:22:48.736654" 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-04-17T03:22:48.670684" elapsed="0.065998"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:22:48.738079" 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-04-17T03:22:48.737784" 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-04-17T03:22:48.738248" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:22:48.737396" elapsed="0.000876"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:48.738602" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:48.738342" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:22:48.739196" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:22:48.738881" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-04-17T03:22:48.738686" elapsed="0.000573"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:48.738325" elapsed="0.000955"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:22:48.741703" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:22:48.739429" elapsed="0.002301"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:22:48.741781" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:22:48.741963" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:22:48.737039" elapsed="0.004950"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:22:48.743213" 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-04-17T03:22:48.742972" elapsed="0.000305">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-04-17T03:22:48.743421" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:22:48.742621" elapsed="0.000826"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:22:48.743654" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:22:48.743518" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:48.743500" elapsed="0.000239"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:48.743884" 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-04-17T03:22:48.744072" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:22:48.744138" elapsed="0.000045"/>
</return>
<msg time="2026-04-17T03:22:48.746229" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:22:48.742296" elapsed="0.003960"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:48.747666" 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-04-17T03:22:48.747411" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:48.748129" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:48.747870" elapsed="0.000331"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:22:48.753270" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:48.954691" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:49.357304" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:49.359516" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:22:48.750324" elapsed="0.612635">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:22:48.748268" elapsed="0.614861">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:22:49.363523" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:49.363190" elapsed="0.000430"/>
</branch>
<status status="FAIL" start="2026-04-17T03:22:48.748250" elapsed="0.615408">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:22:49.364312" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:49.364512" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:49.364455" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:49.364429" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:49.364812" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:22:49.364909" elapsed="0.000041"/>
</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-04-17T03:22:48.746573" elapsed="0.618520">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:49.365278" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:22:48.644014" elapsed="0.721406">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:22:49.365816" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:49.365553" elapsed="0.000366"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:49.365529" elapsed="0.000446"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:49.366023" elapsed="0.000021"/>
</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="FAIL" start="2026-04-17T03:22:48.637261" elapsed="0.728904">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:22:48.628475" elapsed="0.737832">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:22:50.428316" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:22:50.427894" elapsed="0.000458"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:22:50.429282" 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-04-17T03:22:50.428866" elapsed="0.000492">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-04-17T03:22:50.429455" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:22:50.428526" elapsed="0.000955"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:22:50.430068" 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-04-17T03:22:50.429652" elapsed="0.000444"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:22:50.430458" 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-04-17T03:22:50.430619" 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-04-17T03:22:50.430311" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:50.431079" 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-04-17T03:22:50.430805" 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-04-17T03:22:50.432335" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:50.431860" elapsed="0.000538"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:22:50.432918" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:22:50.432561" elapsed="0.000414"/>
</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-04-17T03:22:50.433382" elapsed="0.000047"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:50.434259" elapsed="0.000056"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:22:50.434706" elapsed="0.000048"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:22:50.433192" elapsed="0.001687"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:22:50.433028" elapsed="0.001947"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:22:50.435029" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:22:50.435206" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:22:50.431511" elapsed="0.003720"/>
</kw>
<status status="PASS" start="2026-04-17T03:22:50.431201" elapsed="0.004064"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:50.435438" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:50.435290" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:50.431177" elapsed="0.004339"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:22:50.436136" 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-04-17T03:22:50.435661" elapsed="0.000520"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:22:50.436262" 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//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-04-17T03:22:50.427267" elapsed="0.009148"/>
</kw>
<msg time="2026-04-17T03:22:50.436470" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:22:50.414238" elapsed="0.022284"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:22:50.451079" elapsed="0.000065"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:22:50.467444" 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//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-04-17T03:22:50.480393" elapsed="0.000035"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:50.480643" 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-04-17T03:22:50.480830" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:50.481268" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:50.481114" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:50.481097" 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-04-17T03:22:50.481496" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:50.481664" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:50.481830" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:22:50.481056" elapsed="0.000827"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:22:50.480917" elapsed="0.001081"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:50.482153" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:50.482320" elapsed="0.000023"/>
</return>
<msg time="2026-04-17T03:22:50.482497" 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-04-17T03:22:50.409860" elapsed="0.072665"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:22:50.483976" 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-04-17T03:22:50.483665" elapsed="0.000386">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-04-17T03:22:50.484146" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:22:50.483256" elapsed="0.000914"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:50.484504" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:50.484241" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:22:50.485081" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:22:50.484768" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-17T03:22:50.484587" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:50.484223" elapsed="0.000942"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:22:50.487610" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:22:50.485316" elapsed="0.002320"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:22:50.487688" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:22:50.487844" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:22:50.482876" elapsed="0.004992"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:22:50.489112" 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-04-17T03:22:50.488855" elapsed="0.000321">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-04-17T03:22:50.489269" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:22:50.488520" elapsed="0.000774"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:22:50.489496" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:22:50.489363" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:50.489345" elapsed="0.000235"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:50.489724" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:50.489893" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:22:50.489974" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:22:50.492042" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:22:50.488192" elapsed="0.003876"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:50.493478" 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-04-17T03:22:50.493223" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:50.493914" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:50.493676" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:22:50.499039" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:50.700611" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:51.102995" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:51.105730" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:22:50.496110" elapsed="0.614954">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:22:50.494040" elapsed="0.617240">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:22:51.111856" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:51.111367" elapsed="0.000689"/>
</branch>
<status status="FAIL" start="2026-04-17T03:22:50.494022" elapsed="0.618089">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:22:51.113036" elapsed="0.000061"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:51.113339" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:51.113257" elapsed="0.000177"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:51.113217" elapsed="0.000263"/>
</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-04-17T03:22:51.113801" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:22:51.113873" 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-04-17T03:22:50.492387" elapsed="0.621619">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:51.114086" 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-04-17T03:22:50.384089" elapsed="0.730097">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:22:51.114478" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:51.114282" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:51.114264" elapsed="0.000323"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:51.114627" elapsed="0.000016"/>
</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="FAIL" start="2026-04-17T03:22:50.375186" elapsed="0.739550">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:22:50.367042" elapsed="0.747861">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:22:52.205295" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:22:52.204837" elapsed="0.000495"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:22:52.206331" 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-04-17T03:22:52.205906" elapsed="0.000505">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-04-17T03:22:52.206515" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:22:52.205512" elapsed="0.001031"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:22:52.207165" 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-04-17T03:22:52.206718" elapsed="0.000479"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:22:52.207518" 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-04-17T03:22:52.207688" 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-04-17T03:22:52.207369" elapsed="0.000346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:52.208213" 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-04-17T03:22:52.207880" 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-04-17T03:22:52.209631" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:52.209164" elapsed="0.000531"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:22:52.210254" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:22:52.209862" elapsed="0.000419"/>
</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-04-17T03:22:52.210702" elapsed="0.000047"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:52.211453" 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-04-17T03:22:52.211831" elapsed="0.000048"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:22:52.210508" elapsed="0.001523"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:22:52.210337" elapsed="0.001763"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:22:52.212153" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:22:52.212333" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:22:52.208782" elapsed="0.003600"/>
</kw>
<status status="PASS" start="2026-04-17T03:22:52.208400" elapsed="0.004017"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:52.212596" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:52.212443" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:52.208332" elapsed="0.004343"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:22:52.213358" 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-04-17T03:22:52.212845" elapsed="0.000550"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:22:52.213454" 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//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-04-17T03:22:52.204051" elapsed="0.009544"/>
</kw>
<msg time="2026-04-17T03:22:52.213729" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:22:52.188263" elapsed="0.025538"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:22:52.229291" 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-04-17T03:22:52.241988" 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-04-17T03:22:52.254385" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:52.254609" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:52.254802" 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-04-17T03:22:52.255247" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:52.255097" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:52.255079" 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-04-17T03:22:52.255468" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:52.255632" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:52.255795" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:22:52.255037" elapsed="0.000810"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:22:52.254903" elapsed="0.000972"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:52.256033" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:52.256112" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:22:52.256261" 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-04-17T03:22:52.183689" elapsed="0.072600"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:22:52.257709" 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-04-17T03:22:52.257422" elapsed="0.000364">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-04-17T03:22:52.257880" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:22:52.257029" elapsed="0.000875"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:52.258275" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:52.257996" elapsed="0.000401"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:22:52.258976" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:22:52.258632" elapsed="0.000372"/>
</kw>
<status status="PASS" start="2026-04-17T03:22:52.258425" elapsed="0.000617"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:52.257977" elapsed="0.001088"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:22:52.261761" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:22:52.259234" elapsed="0.002556"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:22:52.261846" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:22:52.262030" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:22:52.256649" elapsed="0.005408"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:22:52.263392" 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-04-17T03:22:52.263139" elapsed="0.000322">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-04-17T03:22:52.263562" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:22:52.262750" elapsed="0.000838"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:22:52.263809" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-17T03:22:52.263664" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:52.263645" elapsed="0.000256"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:52.264083" elapsed="0.000024"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:52.264274" elapsed="0.000036"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:22:52.264360" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:22:52.268103" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:22:52.262395" elapsed="0.005737"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:52.269709" 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-04-17T03:22:52.269438" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:52.270185" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:52.269917" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:22:52.275134" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:52.476917" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:52.879134" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:52.881857" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:22:52.272420" elapsed="0.614801">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:22:52.270299" elapsed="0.617145">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:22:52.888071" elapsed="0.000092"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:52.887534" elapsed="0.000849"/>
</branch>
<status status="FAIL" start="2026-04-17T03:22:52.270280" elapsed="0.618169">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:22:52.889262" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:52.889470" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:52.889413" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:52.889385" 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-04-17T03:22:52.889834" elapsed="0.000035"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:22:52.889961" elapsed="0.000024"/>
</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-04-17T03:22:52.268543" elapsed="0.621586">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:52.890238" 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-04-17T03:22:52.134052" elapsed="0.756326">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:22:52.890777" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:52.890509" elapsed="0.000372"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:52.890485" elapsed="0.000433"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:52.890988" elapsed="0.000021"/>
</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="FAIL" start="2026-04-17T03:22:52.123778" elapsed="0.767356">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:22:52.115699" elapsed="0.775581">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:22:53.955309" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:22:53.954866" elapsed="0.000477"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:22:53.956287" 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-04-17T03:22:53.955869" elapsed="0.000495">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-04-17T03:22:53.956461" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:22:53.955520" elapsed="0.000966"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:22:53.957077" 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-04-17T03:22:53.956659" elapsed="0.000445"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:22:53.957483" 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-04-17T03:22:53.957638" 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-04-17T03:22:53.957338" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:53.958097" 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-04-17T03:22:53.957822" elapsed="0.000321"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:53.959491" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:53.958981" elapsed="0.000575"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:22:53.960116" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:22:53.959722" elapsed="0.000421"/>
</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-04-17T03:22:53.960584" 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-04-17T03:22:53.961354" elapsed="0.000057"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:22:53.961706" elapsed="0.000046"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:22:53.960379" elapsed="0.001498"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:22:53.960199" elapsed="0.001772"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:22:53.962026" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:22:53.962202" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:22:53.958572" elapsed="0.003655"/>
</kw>
<status status="PASS" start="2026-04-17T03:22:53.958223" elapsed="0.004036"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:53.962442" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:53.962284" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:53.958197" elapsed="0.004322"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:22:53.963250" 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-04-17T03:22:53.962684" elapsed="0.000596"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:22:53.963328" 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-04-17T03:22:53.954102" elapsed="0.009362"/>
</kw>
<msg time="2026-04-17T03:22:53.963520" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:22:53.940185" elapsed="0.023387"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:22:53.976608" 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-04-17T03:22:53.989173" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//empty_topology/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:54.001718" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:54.002053" 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-04-17T03:22:54.002247" 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-04-17T03:22:54.002688" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:54.002502" elapsed="0.000244"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:54.002486" 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-04-17T03:22:54.002919" elapsed="0.000037"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:54.003106" 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-04-17T03:22:54.003291" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:22:54.002450" elapsed="0.000897"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:22:54.002338" elapsed="0.001036"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:54.003521" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:54.003597" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:22:54.003743" 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-04-17T03:22:53.935295" elapsed="0.068476"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:22:54.005196" 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-04-17T03:22:54.004899" elapsed="0.000377">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-04-17T03:22:54.005467" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:22:54.004499" 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-04-17T03:22:54.005830" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:54.005566" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:22:54.006430" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:22:54.006114" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-04-17T03:22:54.005912" elapsed="0.000580"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:54.005548" elapsed="0.000965"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:22:54.008936" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:22:54.006689" elapsed="0.002277"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:22:54.009019" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:22:54.009183" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:22:54.004126" elapsed="0.005083"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:22:54.010575" 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-04-17T03:22:54.010275" elapsed="0.000369">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-04-17T03:22:54.010740" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:22:54.009911" elapsed="0.000855"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:22:54.010992" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:22:54.010836" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:54.010817" elapsed="0.000262"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:54.011288" 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-04-17T03:22:54.011481" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:22:54.011549" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:22:54.013720" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:22:54.009575" elapsed="0.004173"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:54.015249" 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-04-17T03:22:54.014986" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:54.015716" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:54.015456" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:22:54.020688" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:54.222206" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:54.624848" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:54.627520" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:22:54.017945" elapsed="0.615305">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:22:54.015826" elapsed="0.617649">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:22:54.634178" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:54.633568" elapsed="0.000773"/>
</branch>
<status status="FAIL" start="2026-04-17T03:22:54.015808" elapsed="0.618590">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:22:54.635162" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:54.635313" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:54.635272" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:54.635251" elapsed="0.000131"/>
</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-04-17T03:22:54.635533" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:22:54.635603" 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-04-17T03:22:54.014085" elapsed="0.621638">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:54.635800" 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-04-17T03:22:53.910810" elapsed="0.725089">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:22:54.636279" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:54.636089" elapsed="0.000262"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:54.636070" elapsed="0.000305"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:22:54.636407" elapsed="0.000014"/>
</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="FAIL" start="2026-04-17T03:22:53.903599" elapsed="0.732910">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>${folder_name}</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="FAIL" start="2026-04-17T03:22:53.892088" elapsed="0.744526">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:22:54.636717" level="FAIL">Keyword 'Compare_Topology' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-17T03:22:43.371939" elapsed="11.264882">Keyword 'Compare_Topology' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>empty_topology</arg>
<doc>Wait until Compare_Topology matches expected result.</doc>
<status status="FAIL" start="2026-04-17T03:22:43.371572" elapsed="11.265375">Keyword 'Compare_Topology' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:22:54.638554" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:22:54.638199" elapsed="0.000401"/>
</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-04-17T03:22:54.637633" elapsed="0.001020"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-04-17T03:22:54.637283" elapsed="0.001426"/>
</kw>
<doc>See new routes are deleted.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:22:43.305811" elapsed="11.332939">Keyword 'Compare_Topology' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:22:54.643171" elapsed="0.000302"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:22:54.642799" elapsed="0.000755"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:22:54.644780" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:54.644642" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:54.644622" elapsed="0.000247"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:22:54.650066" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:54.649885" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:54.649866" elapsed="0.000270"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:22:54.651191" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:22:54.650764" elapsed="0.000456"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:22:54.651690" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:22:54.651383" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:22:54.651824" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:22:54.652012" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:22:54.650375" elapsed="0.001663"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:22:54.658045" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:54.657874" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:54.657854" elapsed="0.000261"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:22:54.659438" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:54.659329" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:54.659310" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:22:54.659989" level="INFO">${karaf_connection_index} = 40</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:22:54.659657" elapsed="0.000360"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:22:54.660421" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:22:54.660182" elapsed="0.000281"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:22:54.661438" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:22:54.661016" elapsed="0.001177">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:22:54.662389" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:22:54.662437" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:54.660647" elapsed="0.001814"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:22:54.663247" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:22:54.662998" elapsed="0.000902">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:22:54.664111" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:22:54.664158" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:54.662632" elapsed="0.001550"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:22:54.665251" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC3_BGP_Peer_Check_Incomming_Updates_For_3_Withdrawn_Prefixes"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:22:54.664560" elapsed="0.000772">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC3_BGP_Peer_Check_Incomming_Updates_For_3_Withdrawn_Prefixes"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:22:54.664258" elapsed="0.001149">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC3_BGP_Peer_Check_Incomming_Updates_For_3_Withdrawn_Prefixes"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:22:54.664239" elapsed="0.001201">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC3_BGP_Peer_Check_Incomming_Updates_For_3_Withdrawn_Prefixes"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:54.665611" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:54.665844" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:54.665701" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:22:54.665683" elapsed="0.000295"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:22:54.666022" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:22:54.668667" elapsed="0.000147"/>
</kw>
<msg time="2026-04-17T03:22:54.668883" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:22:54.667625" 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-04-17T03:22:54.669493" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:54.669829" 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-04-17T03:22:54.666983" 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-04-17T03:22:54.666325" 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="FAIL" start="2026-04-17T03:22:54.659018" elapsed="0.011293">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC3_BGP_Peer_Check_Incomming_Updates_For_3_Withdrawn_Prefixes"</status>
</kw>
<msg time="2026-04-17T03:22:54.670417" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:22:54.670469" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC3_BGP_Peer_Check_Incomming_Updates_For_3_Withdrawn_Prefixes"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:54.658272" elapsed="0.012221"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:22:54.670677" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:54.670570" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:54.670552" elapsed="0.000191"/>
</if>
<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-04-17T03:22:54.671554" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:22:54.671451" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:54.671433" elapsed="0.000187"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:22:54.671897" level="INFO">index=16
host=10.30.171.238
alias=bgp_app_peer_console
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-04-17T03:22:54.672078" level="INFO">${current_ssh_connection_object} = index=16
host=10.30.171.238
alias=bgp_app_peer_console
port=22
timeout=10 seconds
newline=

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_error...</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:22:54.671772" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:54.672524" level="INFO">{1: 40}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:54.672260" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:54.672992" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:54.672722" elapsed="0.000314"/>
</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-04-17T03:22:54.673557" elapsed="0.000259"/>
</kw>
<msg time="2026-04-17T03:22:54.674142" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:22:54.674192" level="INFO">${old_connection_index} = 40</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:54.673194" elapsed="0.001021"/>
</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-04-17T03:22:54.675041" elapsed="0.000196"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:22:54.676708" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:22:54.675876" elapsed="0.001714">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:54.675404" elapsed="0.002286"/>
</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-04-17T03:22:54.678353" elapsed="0.000276"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:54.677863" elapsed="0.000848"/>
</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-04-17T03:22:54.674512" elapsed="0.004244"/>
</kw>
<status status="PASS" start="2026-04-17T03:22:54.674291" elapsed="0.004513"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:54.674272" elapsed="0.004558"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:22:54.679690" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:22:54.679384" elapsed="0.000332"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:22:54.679764" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:22:54.679921" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:22:54.679056" elapsed="0.000950"/>
</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-04-17T03:22:54.680170" elapsed="0.000464"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:22:54.680996" level="INFO">index=41
host=10.30.170.120
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-04-17T03:22:54.681139" level="INFO">${karaf_connection_object} = index=41
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:22:54.680819" elapsed="0.000357"/>
</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-04-17T03:22:54.681471" elapsed="0.003229"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:22:54.685321" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:22:54.686777" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:22:54.684953" elapsed="0.002275">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:22:54.703220" elapsed="0.000475"/>
</kw>
<msg time="2026-04-17T03:22:54.703835" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:22:54.701414" elapsed="0.002623"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:54.704212" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:54.704385" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:22:54.688216" elapsed="0.016257"/>
</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-04-17T03:22:54.687531" elapsed="0.016994"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:22:54.671158" elapsed="0.033459">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:54.705233" elapsed="0.000030"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:22:54.705317" 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="FAIL" start="2026-04-17T03:22:54.657458" elapsed="0.047981">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:22:54.705587" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:22:54.705640" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:54.652487" elapsed="0.053187"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:22:54.706211" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:22:54.705786" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-04-17T03:22:54.705759" elapsed="0.000559"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:22:54.652335" elapsed="0.054007"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:22:54.652099" elapsed="0.054277"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:22:54.649513" elapsed="0.056925"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:22:54.644334" elapsed="0.062163"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:22:54.643753" elapsed="0.062789"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:22:54.639770" elapsed="0.066830"/>
</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-04-17T03:22:54.707084" elapsed="0.000114"/>
</kw>
<status status="PASS" start="2026-04-17T03:22:54.706769" elapsed="0.000487"/>
</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-04-17T03:22:54.721194" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:22:54.736140" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:22:54.736426" 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-04-17T03:22:54.720923" elapsed="0.015561"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:54.738059" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:54.737037" elapsed="0.001139"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:22:54.739534" 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-04-17T03:22:54.738553" elapsed="0.001146">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-04-17T03:22:54.720398" elapsed="0.019730">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:22:55.762213" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:22:55.775525" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:22:55.775807" 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-04-17T03:22:55.761909" elapsed="0.013960"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:55.777099" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:55.776341" elapsed="0.000867"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:22:55.778407" 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-04-17T03:22:55.777556" elapsed="0.001004">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-04-17T03:22:55.761221" elapsed="0.017584">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:22:56.798400" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:22:56.811745" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:22:56.812042" 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-04-17T03:22:56.798173" elapsed="0.013944"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:56.813091" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:56.812528" elapsed="0.000634"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:22:56.813966" 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-04-17T03:22:56.813395" elapsed="0.000676">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-04-17T03:22:56.797658" elapsed="0.016581">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:22:57.828775" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:22:57.841905" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:22:57.842322" 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-04-17T03:22:57.828578" elapsed="0.013837"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:57.844099" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:57.843125" elapsed="0.001305"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:22:57.846178" 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-04-17T03:22:57.844970" elapsed="0.001426">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-04-17T03:22:57.828102" elapsed="0.018636">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:22:58.866670" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:22:58.880502" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:22:58.880706" 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-04-17T03:22:58.866405" elapsed="0.014343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:58.881747" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:58.881145" elapsed="0.000686"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:22:58.882856" 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-04-17T03:22:58.882153" 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-04-17T03:22:58.865723" elapsed="0.017595">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:22:59.902515" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:22:59.916058" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:22:59.916319" 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-04-17T03:22:59.902310" elapsed="0.014067"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:22:59.917592" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:22:59.916834" elapsed="0.000879"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:22:59.919098" 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-04-17T03:22:59.918129" elapsed="0.001127">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-04-17T03:22:59.901777" elapsed="0.017725">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:23:00.937801" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:23:00.950967" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:23:00.951267" 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-04-17T03:23:00.937608" elapsed="0.013954"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:00.952701" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:00.951997" elapsed="0.000809"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:23:00.954318" 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-04-17T03:23:00.953210" elapsed="0.001310">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-04-17T03:23:00.937138" elapsed="0.017726">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:23:01.972090" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:23:01.985111" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:23:01.985371" 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-04-17T03:23:01.971870" elapsed="0.013559"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:01.986686" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:01.985841" elapsed="0.000957"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:23:01.988159" 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-04-17T03:23:01.987242" elapsed="0.001093">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-04-17T03:23:01.971335" elapsed="0.017253">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:23:03.003093" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:23:03.016186" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:23:03.016461" 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-04-17T03:23:03.002838" elapsed="0.013705"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:03.017791" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:03.017058" elapsed="0.000834"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:23:03.019208" 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-04-17T03:23:03.018269" elapsed="0.001114">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-04-17T03:23:03.002210" elapsed="0.017426">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:23:04.039253" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:23:04.052644" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:23:04.052901" 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-04-17T03:23:04.039048" elapsed="0.013955"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:04.054360" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:04.053649" elapsed="0.000778"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:23:04.055230" 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-04-17T03:23:04.054644" elapsed="0.000703">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-04-17T03:23:04.038507" elapsed="0.016992">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:23:05.078054" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-04-17T03:23:05.091227" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:23:05.091452" 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-04-17T03:23:05.077816" elapsed="0.013682"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:05.092438" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:05.091801" elapsed="0.000716"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:23:05.093491" 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-04-17T03:23:05.092804" elapsed="0.000795">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-04-17T03:23:05.077157" elapsed="0.016607">0 != 3</status>
</kw>
<msg time="2026-04-17T03:23:05.093902" 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-04-17T03:22:54.707417" elapsed="10.386643">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-04-17T03:23:05.111243" elapsed="0.000071"/>
</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-04-17T03:23:05.123892" elapsed="0.000070"/>
</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-04-17T03:23:05.136363" elapsed="0.000045"/>
</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-04-17T03:23:05.148872" elapsed="0.000037"/>
</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-04-17T03:23:05.150695" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:23:05.150364" elapsed="0.000379"/>
</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-04-17T03:23:05.149898" elapsed="0.000898"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-04-17T03:23:05.149305" elapsed="0.001550"/>
</kw>
<doc>Check incomming updates for new routes</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:22:54.639151" elapsed="10.511744">Keyword 'Check_File_For_Word_Count' failed after retrying for 10 seconds. The last error was: 0 != 3</status>
</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-04-17T03:23:05.154689" elapsed="0.000227"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:23:05.154404" elapsed="0.000599"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:23:05.156119" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:05.155957" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:05.155915" elapsed="0.000279"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:23:05.161304" elapsed="0.000051"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:05.161178" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:05.161159" elapsed="0.000251"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:23:05.162609" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:23:05.162052" elapsed="0.000584"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:23:05.163119" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:23:05.162799" elapsed="0.000346"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:23:05.163189" elapsed="0.000045"/>
</return>
<msg time="2026-04-17T03:23:05.163363" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:23:05.161646" elapsed="0.001776"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:23:05.169396" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:05.169253" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:05.169231" 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-04-17T03:23:05.170760" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:05.170641" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:05.170623" elapsed="0.000207"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:23:05.171331" level="INFO">${karaf_connection_index} = 41</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:23:05.171013" elapsed="0.000346"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:23:05.171790" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:23:05.171523" elapsed="0.000296"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:23:05.172739" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:23:05.172452" elapsed="0.001067">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:23:05.173721" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:23:05.173770" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:05.172044" elapsed="0.001750"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:23:05.174639" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:23:05.174388" elapsed="0.001019">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:23:05.175598" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:23:05.175646" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:05.173997" elapsed="0.001762"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:23:05.176980" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC3_Stop_BGP_Peer"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:23:05.176237" elapsed="0.000809">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC3_Stop_BGP_Peer"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:23:05.175871" elapsed="0.001247">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC3_Stop_BGP_Peer"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:23:05.175843" elapsed="0.001310">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC3_Stop_BGP_Peer"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:05.177340" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:05.177584" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:05.177434" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:23:05.177417" elapsed="0.000244"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:23:05.177699" elapsed="0.000020"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:23:05.180405" elapsed="0.000154"/>
</kw>
<msg time="2026-04-17T03:23:05.180627" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:05.179234" elapsed="0.001538"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:05.181117" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:05.181476" 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-04-17T03:23:05.178583" elapsed="0.003080"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:23:05.178030" elapsed="0.003709"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:23:05.170332" elapsed="0.011500">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC3_Stop_BGP_Peer"</status>
</kw>
<msg time="2026-04-17T03:23:05.181957" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:23:05.182004" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.TC3_Stop_BGP_Peer"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:05.169660" elapsed="0.012382"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:23:05.182241" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:05.182128" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:05.182105" elapsed="0.000204"/>
</if>
<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-04-17T03:23:05.184878" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:05.184751" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:05.184732" elapsed="0.000317"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:23:05.185420" level="INFO">index=15
host=10.30.171.238
alias=bgp_peer_console
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-04-17T03:23:05.185534" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=bgp_peer_console
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=st...</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:23:05.185220" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:05.186047" level="INFO">{1: 41}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:05.185731" elapsed="0.000363"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:05.186505" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:05.186260" elapsed="0.000289"/>
</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-04-17T03:23:05.187125" elapsed="0.000279"/>
</kw>
<msg time="2026-04-17T03:23:05.187520" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:23:05.187568" level="INFO">${old_connection_index} = 41</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:05.186720" elapsed="0.000871"/>
</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-04-17T03:23:05.188559" elapsed="0.000239"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:23:05.190431" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:23:05.189837" elapsed="0.001638">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:05.189157" elapsed="0.002436"/>
</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-04-17T03:23:05.192422" elapsed="0.000332"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:05.191801" elapsed="0.001040"/>
</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-04-17T03:23:05.187912" elapsed="0.005002"/>
</kw>
<status status="PASS" start="2026-04-17T03:23:05.187668" elapsed="0.005337"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:05.187649" elapsed="0.005393"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:23:05.194122" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:23:05.193748" elapsed="0.000403"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:23:05.194202" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:23:05.194368" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:23:05.193357" elapsed="0.001036"/>
</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-04-17T03:23:05.194553" elapsed="0.000488"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:23:05.195334" level="INFO">index=42
host=10.30.170.120
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-04-17T03:23:05.195437" level="INFO">${karaf_connection_object} = index=42
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:23:05.195217" elapsed="0.000248"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:23:05.195617" elapsed="0.002568"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:23:05.198627" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:23:05.202010" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:23:05.198361" elapsed="0.004093">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:23:05.220879" elapsed="0.000742"/>
</kw>
<msg time="2026-04-17T03:23:05.221783" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:05.218659" elapsed="0.003669"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:05.222669" elapsed="0.000048"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:05.222985" elapsed="0.000033"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:23:05.203443" elapsed="0.019693"/>
</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-04-17T03:23:05.202818" elapsed="0.020417"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:23:05.184411" elapsed="0.038974">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:05.224390" elapsed="0.000043"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:23:05.224514" elapsed="0.000040"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:23:05.168837" elapsed="0.055898">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:23:05.224921" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:23:05.225012" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:05.163803" elapsed="0.061244"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:05.225691" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:05.225286" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:05.225235" elapsed="0.000586"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:23:05.163658" elapsed="0.062198"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:23:05.163481" elapsed="0.062424"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:23:05.160791" elapsed="0.065223"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:23:05.155617" elapsed="0.070483"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:05.155161" elapsed="0.071009"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:23:05.151994" elapsed="0.074275"/>
</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-04-17T03:23:05.226924" elapsed="0.000185"/>
</kw>
<status status="PASS" start="2026-04-17T03:23:05.226496" elapsed="0.000700"/>
</kw>
<kw name="Stop_Console_Tool" owner="BGPcliKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:23:05.229061" 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-04-17T03:23:05.228546" elapsed="0.000557"/>
</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-04-17T03:23:05.229376" elapsed="0.000400"/>
</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-04-17T03:23:05.227921" elapsed="0.001954"/>
</kw>
<kw name="Read" owner="SSHLibrary">
<msg time="2026-04-17T03:23:07.230894" level="INFO">^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-188-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-04-17T03:23:07.231307" level="INFO">${output} = ^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.ser...</msg>
<var>${output}</var>
<arg>delay=1s</arg>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-04-17T03:23:05.230182" elapsed="2.001195"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:07.232639" level="INFO">^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-188-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-04-17T03:23:07.231851" elapsed="0.000917"/>
</kw>
<doc>Stop the tool if still running.</doc>
<status status="PASS" start="2026-04-17T03:23:05.227473" elapsed="2.005504"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:23:07.247489" level="INFO">Executing command 'cat bgp_peer.log'.</msg>
<msg time="2026-04-17T03:23:07.261186" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:23:07.261569" level="INFO">${output_log} = 2026-04-17 03:22:22,667 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:22:22,668 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.238
2026-04-17 03:22:22,668 DEBUG BGP-Thr...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-17T03:23:07.247276" elapsed="0.014381"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:07.262917" level="INFO">2026-04-17 03:22:22,667 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:22:22,668 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.238
2026-04-17 03:22:22,668 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-04-17 03:22:22,668 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.120
2026-04-17 03:22:22,668 DEBUG BGP-Thread-1 (job): Remote port: 1790</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:07.262212" elapsed="0.000853"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-04-17T03:23:07.264318" 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-04-17T03:23:07.263501" elapsed="0.000947"/>
</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-04-17T03:23:07.246700" elapsed="0.017896"/>
</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-04-17T03:23:07.266559" elapsed="0.000641"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-04-17T03:23:07.265450" elapsed="0.001897"/>
</kw>
<doc>Stop BGP peer tool</doc>
<tag>critical</tag>
<status status="PASS" start="2026-04-17T03:23:05.151386" elapsed="2.116049"/>
</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-04-17T03:23:07.273462" elapsed="0.000343"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:23:07.273076" elapsed="0.000816"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:23:07.275550" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:07.275362" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:07.275326" elapsed="0.000331"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:23:07.282307" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:07.282177" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:07.282157" elapsed="0.000222"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:23:07.283559" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:23:07.283096" elapsed="0.000500"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:23:07.284296" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:23:07.283843" elapsed="0.000491"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:23:07.284394" elapsed="0.000050"/>
</return>
<msg time="2026-04-17T03:23:07.284622" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:23:07.282624" elapsed="0.002033"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:23:07.290537" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:07.290413" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:07.290393" elapsed="0.000215"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:23:07.291895" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:07.291730" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:07.291713" elapsed="0.000279"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:23:07.292595" level="INFO">${karaf_connection_index} = 42</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:23:07.292181" elapsed="0.000443"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:23:07.293064" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:23:07.292794" elapsed="0.000297"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:23:07.293875" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:23:07.293600" elapsed="0.001141">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:23:07.294953" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:23:07.295005" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:07.293256" elapsed="0.001773"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:23:07.295966" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:23:07.295561" elapsed="0.001403">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:23:07.297225" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:23:07.297372" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:07.295204" elapsed="0.002240"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:23:07.298785" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.Delete_Bgp_Peer_Configuration"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:23:07.297844" elapsed="0.001027">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.Delete_Bgp_Peer_Configuration"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:23:07.297572" elapsed="0.001431">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.Delete_Bgp_Peer_Configuration"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:23:07.297548" elapsed="0.001537">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.Delete_Bgp_Peer_Configuration"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:07.299408" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:07.299639" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:07.299497" elapsed="0.000263"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:23:07.299480" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:23:07.299847" elapsed="0.000019"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:23:07.303117" elapsed="0.000189"/>
</kw>
<msg time="2026-04-17T03:23:07.303381" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:07.301775" elapsed="0.001768"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:07.303894" elapsed="0.000095"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:07.304257" 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-04-17T03:23:07.300866" elapsed="0.003582"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:23:07.300209" elapsed="0.004330"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:23:07.291424" elapsed="0.013205">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.Delete_Bgp_Peer_Configuration"</status>
</kw>
<msg time="2026-04-17T03:23:07.304738" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:23:07.304784" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.Delete_Bgp_Peer_Configuration"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:07.290766" elapsed="0.014053"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:23:07.305108" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:07.304993" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:07.304915" elapsed="0.000293"/>
</if>
<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-04-17T03:23:07.306121" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:07.306012" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:07.305993" elapsed="0.000197"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:23:07.306524" level="INFO">index=15
host=10.30.171.238
alias=bgp_peer_console
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-04-17T03:23:07.306663" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=bgp_peer_console
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=st...</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:23:07.306381" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:07.307146" level="INFO">{1: 42}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:07.306851" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:07.307609" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:07.307349" elapsed="0.000303"/>
</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-04-17T03:23:07.308293" elapsed="0.000389"/>
</kw>
<msg time="2026-04-17T03:23:07.308897" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:23:07.308969" level="INFO">${old_connection_index} = 42</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:07.307834" elapsed="0.001160"/>
</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-04-17T03:23:07.309879" elapsed="0.000209"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:23:07.311226" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:23:07.310768" elapsed="0.001682">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:07.310257" elapsed="0.002296"/>
</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-04-17T03:23:07.313269" elapsed="0.000325"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:07.312731" elapsed="0.000970"/>
</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-04-17T03:23:07.309369" elapsed="0.004380"/>
</kw>
<status status="PASS" start="2026-04-17T03:23:07.309122" elapsed="0.004687"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:07.309073" elapsed="0.004762"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:23:07.315000" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:23:07.314630" elapsed="0.000441"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:23:07.315122" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:23:07.315301" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:23:07.314176" elapsed="0.001160"/>
</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-04-17T03:23:07.315566" elapsed="0.000617"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:23:07.316524" level="INFO">index=43
host=10.30.170.120
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-04-17T03:23:07.316667" level="INFO">${karaf_connection_object} = index=43
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:23:07.316375" elapsed="0.000321"/>
</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-04-17T03:23:07.316862" elapsed="0.002561"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:23:07.319914" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:23:07.321168" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:23:07.319606" elapsed="0.001962">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:23:07.336617" elapsed="0.000433"/>
</kw>
<msg time="2026-04-17T03:23:07.337153" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:07.334962" elapsed="0.002354"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:07.337480" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:07.337644" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:23:07.322676" elapsed="0.015053"/>
</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-04-17T03:23:07.321894" elapsed="0.015887"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:23:07.305665" elapsed="0.032208">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:07.338285" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:23:07.338362" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:23:07.290042" elapsed="0.048440">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:23:07.338596" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:23:07.338640" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:07.285213" elapsed="0.053450"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:07.339249" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:07.338751" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:07.338730" elapsed="0.000605"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:23:07.285006" elapsed="0.054355"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:23:07.284737" elapsed="0.054665"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:23:07.281786" elapsed="0.057678"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:23:07.274792" elapsed="0.064731"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:07.274135" elapsed="0.065436"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:23:07.268959" elapsed="0.070668"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:23:07.340960" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | BGP_NAME=example-bgp-peer | IP=10.30.171.238 | 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-04-17T03:23:07.339991" elapsed="0.001013"/>
</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-04-17T03:23:07.391896" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:23:07.391439" elapsed="0.000522"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:23:07.392784" 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-04-17T03:23:07.392506" elapsed="0.000355">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-17T03:23:07.392974" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:23:07.392152" elapsed="0.000849"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:23:07.393574" 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-04-17T03:23:07.393174" elapsed="0.000428"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:23:07.393906" 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-04-17T03:23:07.394082" 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-04-17T03:23:07.393764" elapsed="0.000345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:07.394651" 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-04-17T03:23:07.394268" elapsed="0.000428"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:07.395945" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.238', '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-04-17T03:23:07.395588" elapsed="0.000406"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:23:07.396434" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:23:07.396161" elapsed="0.000299"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:23:07.397153" 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-04-17T03:23:07.396832" elapsed="0.000346"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:23:07.397947" 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-04-17T03:23:07.397704" elapsed="0.000270"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:23:07.398030" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:23:07.398232" 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-04-17T03:23:07.397379" 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-04-17T03:23:07.398415" elapsed="0.000240"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-04-17T03:23:07.396693" elapsed="0.002005"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:23:07.399289" 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-04-17T03:23:07.398982" elapsed="0.000337"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:23:07.400401" 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-04-17T03:23:07.399938" elapsed="0.000496"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:23:07.400502" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:23:07.400672" 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-04-17T03:23:07.399525" elapsed="0.001172"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:23:07.400858" elapsed="0.000245"/>
</kw>
<var name="${key}">BGP_NAME</var>
<var name="${value}">example-bgp-peer</var>
<status status="PASS" start="2026-04-17T03:23:07.398831" elapsed="0.002368"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:23:07.401786" level="INFO">${value} = 10.30.171.238</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:23:07.401452" elapsed="0.000371"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:23:07.402821" level="INFO">${encoded} = 10.30.171.238</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:23:07.402538" elapsed="0.000319"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:23:07.402940" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:23:07.403148" level="INFO">${encoded_value} = 10.30.171.238</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:23:07.402104" elapsed="0.001079"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:23:07.403394" elapsed="0.000299"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.238</var>
<status status="PASS" start="2026-04-17T03:23:07.401316" elapsed="0.002455"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:23:07.404415" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:23:07.404110" elapsed="0.000333"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:23:07.405403" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:23:07.405125" elapsed="0.000304"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:23:07.405479" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:23:07.405632" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:23:07.404653" elapsed="0.001003"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:23:07.405810" elapsed="0.000240"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:23:07.403922" elapsed="0.002170"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:23:07.396513" elapsed="0.009613"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:23:07.406175" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:23:07.406341" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.238', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:23:07.395123" elapsed="0.011244"/>
</kw>
<status status="PASS" start="2026-04-17T03:23:07.394773" elapsed="0.011626"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:07.406574" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:07.406425" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:07.394749" elapsed="0.011900"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:23:07.407456" 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-04-17T03:23:07.406791" elapsed="0.000698"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:23:07.407554" 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//bgp_peer.vanadium/${file_name} 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-04-17T03:23:07.390729" elapsed="0.016978"/>
</kw>
<msg time="2026-04-17T03:23:07.407797" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:07.377177" elapsed="0.030671"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:23:07.420690" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:07.433545" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:23:07.446764" elapsed="0.000054"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:07.447087" 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-04-17T03:23:07.447278" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:07.447737" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:07.447558" elapsed="0.000245"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:23:07.447540" elapsed="0.000289"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:07.448057" 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-04-17T03:23:07.448237" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:07.448406" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:23:07.447500" elapsed="0.000960"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:23:07.447365" elapsed="0.001139"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:07.448695" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:23:07.448781" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:23:07.448974" 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-04-17T03:23:07.372251" elapsed="0.076754"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:07.450418" 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.238</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:07.450093" elapsed="0.000378"/>
</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-04-17T03:23:07.456185" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:23:07.658031" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:23:08.060741" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:23:08.063591" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:23:07.453038" elapsed="0.615977">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:23:07.450537" elapsed="0.618813">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:23:08.069888" elapsed="0.000085"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:08.069449" elapsed="0.000620"/>
</branch>
<status status="FAIL" start="2026-04-17T03:23:07.450520" elapsed="0.619604">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:23:08.071079" elapsed="0.000059"/>
</kw>
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:23:08.071247" elapsed="0.000100"/>
</return>
<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-04-17T03:23:07.449323" elapsed="0.622241">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:23:08.071710" elapsed="0.000033"/>
</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="FAIL" start="2026-04-17T03:23:07.341337" elapsed="0.730580">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:23:08.073620" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:23:08.073294" elapsed="0.000372"/>
</kw>
<arg>BuiltIn.Set_Suite_Variable</arg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Runs the given keyword with the given arguments, if the test failed.</doc>
<status status="PASS" start="2026-04-17T03:23:08.072856" elapsed="0.000860"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-04-17T03:23:08.072502" elapsed="0.001270"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:07.268033" elapsed="0.805778">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:23:08.077391" elapsed="0.000217"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:23:08.077120" elapsed="0.000542"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:23:08.078696" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:08.078570" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:08.078550" elapsed="0.000213"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:23:08.084337" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:08.084229" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:08.084211" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:23:08.085420" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:23:08.085026" elapsed="0.000421"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:23:08.085904" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:23:08.085607" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:23:08.085991" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:23:08.086150" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:23:08.084635" elapsed="0.001540"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:23:08.091704" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:08.091592" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:08.091573" 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-04-17T03:23:08.092968" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:08.092836" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:08.092818" elapsed="0.000219"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:23:08.093492" level="INFO">${karaf_connection_index} = 43</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:23:08.093183" elapsed="0.000335"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:23:08.093897" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:23:08.093679" elapsed="0.000244"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:23:08.094696" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:23:08.094432" elapsed="0.000965">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:23:08.095589" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:23:08.095634" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:08.094098" elapsed="0.001560"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:23:08.096489" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:23:08.096239" elapsed="0.000940">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:23:08.097362" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:23:08.097407" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:08.095851" elapsed="0.001579"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:23:08.098499" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.Delete_Bgp_Application_Peer_Configuration"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:23:08.097723" elapsed="0.000839">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.Delete_Bgp_Application_Peer_Configuration"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:23:08.097502" elapsed="0.001128">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.Delete_Bgp_Application_Peer_Configuration"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:23:08.097484" elapsed="0.001178">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.Delete_Bgp_Application_Peer_Configuration"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:08.098822" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:08.099066" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:08.098907" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:23:08.098890" elapsed="0.000250"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:23:08.099172" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:23:08.101651" elapsed="0.000144"/>
</kw>
<msg time="2026-04-17T03:23:08.101859" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:08.100636" 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-04-17T03:23:08.102291" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:08.102625" 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-04-17T03:23:08.100021" elapsed="0.002788"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:23:08.099471" 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="FAIL" start="2026-04-17T03:23:08.092528" elapsed="0.010540">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.Delete_Bgp_Application_Peer_Configuration"</status>
</kw>
<msg time="2026-04-17T03:23:08.103191" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:23:08.103235" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp App Peer Basic.Delete_Bgp_Application_Peer_Configuration"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:08.091920" elapsed="0.011408"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:23:08.103554" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:08.103430" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:08.103402" elapsed="0.000219"/>
</if>
<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-04-17T03:23:08.104438" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:08.104331" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:08.104314" elapsed="0.000190"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:23:08.104785" level="INFO">index=15
host=10.30.171.238
alias=bgp_peer_console
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-04-17T03:23:08.104894" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=bgp_peer_console
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=st...</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:23:08.104659" elapsed="0.000262"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:08.105349" level="INFO">{1: 43}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:08.105090" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:08.105808" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:08.105542" elapsed="0.000325"/>
</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-04-17T03:23:08.106494" elapsed="0.000311"/>
</kw>
<msg time="2026-04-17T03:23:08.106910" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:23:08.107006" level="INFO">${old_connection_index} = 43</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:08.106121" elapsed="0.000914"/>
</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-04-17T03:23:08.107966" elapsed="0.000207"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:23:08.109306" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:23:08.108873" elapsed="0.001429">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:08.108343" elapsed="0.002059"/>
</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-04-17T03:23:08.111115" elapsed="0.000299"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:08.110576" elapsed="0.000922"/>
</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-04-17T03:23:08.107374" elapsed="0.004169"/>
</kw>
<status status="PASS" start="2026-04-17T03:23:08.107113" elapsed="0.004478"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:08.107094" elapsed="0.004522"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:23:08.112491" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:23:08.112179" elapsed="0.000339"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:23:08.112567" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:23:08.112723" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:23:08.111824" elapsed="0.000925"/>
</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-04-17T03:23:08.112911" elapsed="0.000665"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:23:08.113862" level="INFO">index=44
host=10.30.170.120
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-04-17T03:23:08.113981" level="INFO">${karaf_connection_object} = index=44
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:23:08.113750" elapsed="0.000259"/>
</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-04-17T03:23:08.114161" elapsed="0.002383"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:23:08.116990" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:23:08.118274" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:23:08.116712" elapsed="0.001956">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:23:08.133751" elapsed="0.000501"/>
</kw>
<msg time="2026-04-17T03:23:08.134360" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:08.131802" elapsed="0.002720"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:08.134692" elapsed="0.000037"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:08.134891" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:23:08.119582" elapsed="0.015415"/>
</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-04-17T03:23:08.119026" elapsed="0.016022"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:23:08.104035" elapsed="0.031104">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:08.135586" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:23:08.135666" elapsed="0.000024"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:23:08.091228" elapsed="0.044572">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:23:08.135920" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:23:08.136023" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:08.086600" elapsed="0.049448"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:08.136406" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:08.136138" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:08.136116" elapsed="0.000368"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:23:08.086455" elapsed="0.050052"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:23:08.086275" elapsed="0.050270"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:23:08.083845" elapsed="0.052764"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:23:08.078257" elapsed="0.058411"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:08.077813" elapsed="0.058915"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:23:08.074790" elapsed="0.062008"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:23:08.137642" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | NAME=example-bgp-peer-app | IP=10.30.170.120 | 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-04-17T03:23:08.137046" 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-04-17T03:23:08.183764" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_application_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:23:08.183285" elapsed="0.000522"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:23:08.184807" 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-04-17T03:23:08.184503" elapsed="0.000384">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-04-17T03:23:08.185000" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:23:08.184056" elapsed="0.000969"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:23:08.185583" 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-04-17T03:23:08.185192" elapsed="0.000479"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:23:08.186016" 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-04-17T03:23:08.186181" 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-04-17T03:23:08.185852" elapsed="0.000356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:08.186624" 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-04-17T03:23:08.186366" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:08.187729" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer-app', 'IP': '10.30.170.120', '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-04-17T03:23:08.187450" elapsed="0.000337"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:23:08.188258" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:23:08.187977" elapsed="0.000307"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:23:08.188999" 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-04-17T03:23:08.188661" elapsed="0.000363"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:23:08.189786" 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-04-17T03:23:08.189552" elapsed="0.000260"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:23:08.189865" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:23:08.190052" 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-04-17T03:23:08.189217" 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-04-17T03:23:08.190238" elapsed="0.000243"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-04-17T03:23:08.188521" elapsed="0.002001"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:23:08.191101" 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-04-17T03:23:08.190782" elapsed="0.000347"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:23:08.191951" 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-04-17T03:23:08.191693" elapsed="0.000287"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:23:08.192033" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:23:08.192186" 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-04-17T03:23:08.191336" 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-04-17T03:23:08.192417" elapsed="0.000275"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">example-bgp-peer-app</var>
<status status="PASS" start="2026-04-17T03:23:08.190636" elapsed="0.002108"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:23:08.193353" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:23:08.193044" elapsed="0.000335"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:23:08.194138" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:23:08.193910" elapsed="0.000254"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:23:08.194214" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:23:08.194364" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:23:08.193569" elapsed="0.000819"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:23:08.194563" elapsed="0.002045"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:23:08.192880" elapsed="0.003775"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:23:08.197254" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:23:08.196943" elapsed="0.000337"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:23:08.198048" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:23:08.197810" elapsed="0.000265"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:23:08.198173" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:23:08.198334" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:23:08.197478" 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-04-17T03:23:08.198515" elapsed="0.000242"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:23:08.196783" elapsed="0.002024"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:23:08.188341" elapsed="0.010503"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:23:08.198888" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:23:08.199070" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer-app', 'IP': '10.30.170.120', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:23:08.187094" elapsed="0.012004"/>
</kw>
<status status="PASS" start="2026-04-17T03:23:08.186755" elapsed="0.012376"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:08.199351" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:08.199158" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:08.186731" elapsed="0.012699"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:23:08.200282" 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-04-17T03:23:08.199584" elapsed="0.000729"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:23:08.200365" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:23:08.182582" elapsed="0.017909"/>
</kw>
<msg time="2026-04-17T03:23:08.200548" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:08.169284" elapsed="0.031313"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:23:08.216463" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_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-04-17T03:23:08.229610" 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//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-04-17T03:23:08.242520" elapsed="0.000051"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:08.242837" 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-04-17T03:23:08.243063" 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-04-17T03:23:08.243528" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:08.243371" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:23:08.243354" 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-04-17T03:23:08.243777" 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-04-17T03:23:08.244067" 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-04-17T03:23:08.244255" elapsed="0.000039"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:23:08.243312" elapsed="0.001017"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:23:08.243155" elapsed="0.001203"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:08.244507" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:23:08.244590" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:23:08.244776" 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-04-17T03:23:08.164703" elapsed="0.080104"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:08.246232" 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.120</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:08.245899" elapsed="0.000386"/>
</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-04-17T03:23:08.251767" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:23:08.453344" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:23:08.856743" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:23:08.859705" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:23:08.248535" elapsed="0.618449">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:23:08.246353" elapsed="0.620943">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:23:08.867908" elapsed="0.000096"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:08.867424" elapsed="0.000745"/>
</branch>
<status status="FAIL" start="2026-04-17T03:23:08.246335" elapsed="0.621930">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:23:08.869466" elapsed="0.000073"/>
</kw>
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:23:08.869816" elapsed="0.000051"/>
</return>
<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-04-17T03:23:08.245172" elapsed="0.624977">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:23:08.870319" elapsed="0.000038"/>
</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="FAIL" start="2026-04-17T03:23:08.138280" elapsed="0.732278">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:23:08.872726" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:23:08.872366" elapsed="0.000410"/>
</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-04-17T03:23:08.871878" elapsed="0.000951"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-04-17T03:23:08.871451" elapsed="0.001435"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:08.074110" elapsed="0.798831">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:23:08.874818" level="INFO">Executing command 'ps -elf | egrep python | egrep 'play.py' | egrep -v grep'.</msg>
<msg time="2026-04-17T03:23:08.900337" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-17T03:23:08.900589" 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-04-17T03:23:08.874613" elapsed="0.026017"/>
</kw>
<return>
<value>${processes}</value>
<status status="PASS" start="2026-04-17T03:23:08.900741" elapsed="0.000085"/>
</return>
<msg time="2026-04-17T03:23:08.901079" 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-04-17T03:23:08.874297" elapsed="0.026822"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:08.901906" level="INFO"/>
<arg>${processes}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:08.901422" elapsed="0.000579"/>
</kw>
<kw name="Kill_Remote_Processes" owner="KillPythonTool">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-17T03:23:08.904432" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:23:08.904546" 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-04-17T03:23:08.904005" elapsed="0.000596"/>
</kw>
<if>
<branch type="IF" condition="${arg_length} == 0">
<return>
<status status="PASS" start="2026-04-17T03:23:08.904986" elapsed="0.000049"/>
</return>
<status status="PASS" start="2026-04-17T03:23:08.904721" elapsed="0.000362"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:08.904685" elapsed="0.000435"/>
</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-04-17T03:23:08.905351" elapsed="0.000031"/>
</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-04-17T03:23:08.905743" elapsed="0.000037"/>
</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-04-17T03:23:08.906068" elapsed="0.000042"/>
</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-04-17T03:23:08.902436" elapsed="0.003802"/>
</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-04-17T03:23:08.873956" elapsed="0.032385"/>
</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-04-17T03:23:08.907873" level="INFO">Executing command 'ps -elf | egrep python | egrep 'bgp_app_peer.py' | egrep -v grep'.</msg>
<msg time="2026-04-17T03:23:08.957883" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-17T03:23:08.958283" 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-04-17T03:23:08.907658" elapsed="0.050689"/>
</kw>
<return>
<value>${processes}</value>
<status status="PASS" start="2026-04-17T03:23:08.958496" elapsed="0.000097"/>
</return>
<msg time="2026-04-17T03:23:08.959013" 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-04-17T03:23:08.907225" elapsed="0.051857"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:08.960401" level="INFO"/>
<arg>${processes}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:08.959692" elapsed="0.000804"/>
</kw>
<kw name="Kill_Remote_Processes" owner="KillPythonTool">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-17T03:23:08.962533" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:23:08.962792" 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-04-17T03:23:08.961844" elapsed="0.001033"/>
</kw>
<if>
<branch type="IF" condition="${arg_length} == 0">
<return>
<status status="PASS" start="2026-04-17T03:23:08.963504" elapsed="0.000529"/>
</return>
<status status="PASS" start="2026-04-17T03:23:08.963175" elapsed="0.000915"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:08.963111" elapsed="0.001020"/>
</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-04-17T03:23:08.964380" elapsed="0.000035"/>
</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-04-17T03:23:08.964644" elapsed="0.000029"/>
</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-04-17T03:23:08.964896" elapsed="0.000050"/>
</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-04-17T03:23:08.961121" elapsed="0.003975"/>
</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-04-17T03:23:08.906670" elapsed="0.058535"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-17T03:23:08.965557" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-17T03:23:08.965433" elapsed="0.000244"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-04-17T03:23:08.965953" elapsed="0.000837"/>
</kw>
<doc>Make sure Python tool was killed.
Tear down imported Resources.</doc>
<status status="PASS" start="2026-04-17T03:23:08.873655" elapsed="0.093234"/>
</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-04-17T03:17:09.312767" elapsed="359.654198"/>
</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-04-17T03:23:09.108103" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:23:09.103096" elapsed="0.005083"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-17T03:23:09.102590" elapsed="0.005677"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-17T03:23:09.113790" 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-04-17T03:23:09.109557" elapsed="0.004272"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-17T03:23:09.114100" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:09.113956" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:09.113907" elapsed="0.000269"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:23:09.114796" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:23:09.114361" elapsed="0.000485"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-17T03:23:09.115405" 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-04-17T03:23:09.115047" elapsed="0.000387"/>
</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-04-17T03:23:09.116015" elapsed="0.000328"/>
</kw>
<msg time="2026-04-17T03:23:09.116451" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:23:09.116503" level="INFO">${possibly_int_of_members} = 1</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:09.115619" elapsed="0.000910"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:23:09.117247" 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-04-17T03:23:09.116716" elapsed="0.000564"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:23:09.118510" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:23:09.118203" elapsed="0.000338"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:23:09.119085" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:23:09.118758" elapsed="0.000355"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:23:09.119624" 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-04-17T03:23:09.119295" elapsed="0.000358"/>
</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-04-17T03:23:09.123411" elapsed="0.000245"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:23:09.124230" level="INFO">${member_ip} = 10.30.170.120</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:23:09.123837" elapsed="0.000422"/>
</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-04-17T03:23:09.124427" elapsed="0.000250"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:23:09.125580" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:23:09.125250" elapsed="0.000360"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-17T03:23:09.125662" elapsed="0.000045"/>
</return>
<msg time="2026-04-17T03:23:09.125842" 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-04-17T03:23:09.124896" elapsed="0.000972"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:23:09.126541" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.120:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a44242c74d0&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-04-17T03:23:09.126063" elapsed="0.000662"/>
</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-04-17T03:23:09.126901" elapsed="0.000234"/>
</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-04-17T03:23:09.122754" elapsed="0.004450"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:23:09.122491" elapsed="0.004761"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-04-17T03:23:09.119716" elapsed="0.007573"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:23:09.127915" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:23:09.127468" elapsed="0.000521"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:23:09.128598" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.120'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:23:09.128167" elapsed="0.000476"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:23:09.129263" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:23:09.128817" elapsed="0.000494"/>
</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-04-17T03:23:09.117664" elapsed="0.011710"/>
</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-04-17T03:23:09.109165" elapsed="0.020269"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:23:09.129639" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:09.129508" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:09.129485" elapsed="0.000227"/>
</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-04-17T03:23:09.133247" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:23:09.132787" elapsed="0.000492"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:23:09.133778" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:23:09.133456" elapsed="0.000349"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:23:09.133853" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:23:09.134053" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:23:09.132403" elapsed="0.001677"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:23:09.135316" level="INFO">${member_ip} = 10.30.170.120</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-04-17T03:23:09.135011" elapsed="0.000334"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:23:09.136185" 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-04-17T03:23:09.136300" 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-04-17T03:23:09.136000" elapsed="0.000330"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:09.141554" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:09.140862" elapsed="0.000783"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:09.140836" elapsed="0.000849"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:23:09.142363" 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-04-17T03:23:09.142628" 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-04-17T03:23:09.141893" elapsed="0.000787"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:09.143643" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.120" 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-04-17T03:23:09.142961" elapsed="0.000788"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:23:09.144947" 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-04-17T03:23:09.144037" elapsed="0.000963"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-17T03:23:09.146740" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:23:09.146990" 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-04-17T03:23:09.146360" elapsed="0.000676"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:09.147384" elapsed="0.000467"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:23:09.149090" level="INFO">Logging into '10.30.170.120:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:23:09.861303" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 17 03:23:09 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   10.4% of 77.35GB   Users logged in:       0
  Memory usage: 2%                 IPv4 address for ens3: 10.30.170.120
  Swap usage:   0%                 IPv6 address for ens3: 2607:f0d0:1002:11::2


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:17:10 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:23:09.148669" elapsed="0.712790"/>
</kw>
<msg time="2026-04-17T03:23:09.861544" 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-04-17T03:23:09.148219" elapsed="0.713492"/>
</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-04-17T03:23:09.145444" elapsed="0.716416"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:23:09.862765" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-17T03:23:09.876014" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-17T03:23:09.876315" level="INFO">${stdout} = </msg>
<msg time="2026-04-17T03:23:09.876517" 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-04-17T03:23:09.862277" elapsed="0.014341"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:23:09.877356" elapsed="0.000895"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:09.881526" 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-04-17T03:23:09.879891" elapsed="0.001992"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-17T03:23:09.883020" elapsed="0.000120"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:09.882405" elapsed="0.000918"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:09.882347" elapsed="0.001069"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:23:09.884183" elapsed="0.000153"/>
</return>
<status status="PASS" start="2026-04-17T03:23:09.883611" elapsed="0.000972"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:09.883571" elapsed="0.001152"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-17T03:23:09.884873" elapsed="0.000042"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:09.892095" elapsed="0.000557"/>
</kw>
<kw name="Open 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-04-17T03:23:09.892957" elapsed="0.000362"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:23:09.893585" elapsed="0.000226"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:23:09.886230" elapsed="0.007653"/>
</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-04-17T03:23:09.139809" elapsed="0.754333"/>
</kw>
<msg time="2026-04-17T03:23:09.894204" 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-04-17T03:23:09.139081" elapsed="0.755181"/>
</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-04-17T03:23:09.137092" elapsed="0.757252"/>
</kw>
<msg time="2026-04-17T03:23:09.894388" 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-04-17T03:23:09.136503" elapsed="0.757935"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:09.897246" elapsed="0.000355"/>
</kw>
<kw name="Open 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-04-17T03:23:09.897773" elapsed="0.000148"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:23:09.898122" 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-04-17T03:23:09.894736" elapsed="0.003538"/>
</kw>
<msg time="2026-04-17T03:23:09.898369" 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-04-17T03:23:09.135582" elapsed="0.762812"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:09.898836" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:09.898587" elapsed="0.000290"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-17T03:23:09.898919" elapsed="0.000047"/>
</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-04-17T03:23:09.134549" elapsed="0.764518"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:23:09.134344" elapsed="0.764760"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:23:09.134198" elapsed="0.764942"/>
</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-04-17T03:23:09.129971" elapsed="0.769227"/>
</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-04-17T03:23:09.899356" elapsed="0.000213"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:23:09.915032" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:09.914892" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:09.914863" elapsed="0.000240"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:23:09.915406" 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-04-17T03:23:09.915512" 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-04-17T03:23:09.915266" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:09.916068" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:09.915761" elapsed="0.000356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:09.916549" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:09.916277" elapsed="0.000328"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:23:09.917404" 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-04-17T03:23:09.917172" elapsed="0.000370">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-17T03:23:09.917682" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:23:09.917748" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:09.916773" elapsed="0.001005"/>
</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-04-17T03:23:09.918130" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:09.917858" elapsed="0.000350"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:09.917839" elapsed="0.000393"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:23:09.919012" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:23:09.918721" elapsed="0.000317"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:23:09.919088" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:23:09.919283" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:23:09.918445" elapsed="0.000865"/>
</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-04-17T03:23:09.919469" elapsed="0.000415"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:23:09.920186" level="INFO">index=4
host=10.30.170.120
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-04-17T03:23:09.920306" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.120
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-04-17T03:23:09.920079" elapsed="0.000265"/>
</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-04-17T03:23:09.920546" elapsed="0.002620"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:23:09.923601" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:23:09.925096" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:23:09.923336" elapsed="0.002254">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:09.929222" elapsed="0.000411"/>
</kw>
<kw name="Open 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-04-17T03:23:09.929844" elapsed="0.000178"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:23:09.930197" 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-04-17T03:23:09.926661" elapsed="0.003690"/>
</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-04-17T03:23:09.925976" elapsed="0.004421"/>
</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="FAIL" start="2026-04-17T03:23:09.914556" elapsed="0.015929">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:23:10.954604" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:10.954435" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:10.954407" elapsed="0.000297"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:23:10.955180" 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-04-17T03:23:10.955306" 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-04-17T03:23:10.954975" elapsed="0.000446"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:10.955923" 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-04-17T03:23:10.955594" elapsed="0.000397"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:10.956418" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:10.956154" elapsed="0.000311"/>
</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-04-17T03:23:10.957089" elapsed="0.000200"/>
</kw>
<msg time="2026-04-17T03:23:10.957413" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:23:10.957463" level="INFO">${old_connection_index} = 4</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:10.956636" elapsed="0.000852"/>
</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-04-17T03:23:10.958362" elapsed="0.000149"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:23:10.959287" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:23:10.959105" elapsed="0.000710">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:10.958684" elapsed="0.001203"/>
</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-04-17T03:23:10.960421" elapsed="0.000106"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:10.960081" elapsed="0.000495"/>
</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-04-17T03:23:10.957802" elapsed="0.002819"/>
</kw>
<status status="PASS" start="2026-04-17T03:23:10.957566" elapsed="0.003104"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:10.957547" elapsed="0.003149"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:23:10.961619" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:23:10.961248" elapsed="0.000401"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:23:10.961701" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:23:10.961871" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:23:10.960946" elapsed="0.000957"/>
</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-04-17T03:23:10.962095" elapsed="0.000429"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:23:10.962838" level="INFO">index=6
host=10.30.170.120
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-04-17T03:23:10.962981" level="INFO">${karaf_connection_object} = index=6
host=10.30.170.120
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-04-17T03:23:10.962712" elapsed="0.000302"/>
</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-04-17T03:23:10.963170" elapsed="0.002622"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:23:10.966270" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:23:10.967729" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:23:10.965991" elapsed="0.002652">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:10.976745" elapsed="0.000959"/>
</kw>
<kw name="Open 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-04-17T03:23:10.978160" elapsed="0.000308"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:23:10.978622" elapsed="0.000114"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:23:10.970627" elapsed="0.008173"/>
</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-04-17T03:23:10.969329" elapsed="0.009520"/>
</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="FAIL" start="2026-04-17T03:23:10.953988" elapsed="0.024961">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:23:12.002057" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:12.001851" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:12.001822" elapsed="0.000329"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:23:12.002603" 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-04-17T03:23:12.002755" 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-04-17T03:23:12.002381" elapsed="0.000417"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:12.003342" level="INFO">{1: 6}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:12.003017" elapsed="0.000373"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:12.003804" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:12.003548" elapsed="0.000303"/>
</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-04-17T03:23:12.004511" elapsed="0.000283"/>
</kw>
<msg time="2026-04-17T03:23:12.004917" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:23:12.004985" level="INFO">${old_connection_index} = 6</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:12.004047" elapsed="0.000962"/>
</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-04-17T03:23:12.005846" elapsed="0.000199"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:23:12.006748" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:23:12.006568" elapsed="0.000743">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:12.006222" elapsed="0.001153"/>
</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-04-17T03:23:12.007889" elapsed="0.000120"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:12.007556" elapsed="0.000501"/>
</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-04-17T03:23:12.005323" elapsed="0.002779"/>
</kw>
<status status="PASS" start="2026-04-17T03:23:12.005090" elapsed="0.003062"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:12.005070" elapsed="0.003108"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:23:12.009013" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:23:12.008694" elapsed="0.000347"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:23:12.009091" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:23:12.009255" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:23:12.008404" elapsed="0.000877"/>
</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-04-17T03:23:12.009446" elapsed="0.000525"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:23:12.010259" level="INFO">index=8
host=10.30.170.120
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-04-17T03:23:12.010363" level="INFO">${karaf_connection_object} = index=8
host=10.30.170.120
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-04-17T03:23:12.010149" elapsed="0.000241"/>
</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-04-17T03:23:12.010546" elapsed="0.002557"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:23:12.013539" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:23:12.015048" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:23:12.013269" elapsed="0.002197">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:12.019060" 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-04-17T03:23:12.019748" elapsed="0.000193"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:23:12.020122" elapsed="0.000115"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:23:12.016395" elapsed="0.003900"/>
</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-04-17T03:23:12.015785" elapsed="0.004561"/>
</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="FAIL" start="2026-04-17T03:23:12.001395" elapsed="0.019046">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:23:13.041476" elapsed="0.000055"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:13.041140" elapsed="0.000485"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:13.041068" elapsed="0.000630"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:23:13.042676" 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-04-17T03:23:13.043026" 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-04-17T03:23:13.042226" elapsed="0.000882"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:13.044392" level="INFO">{1: 8}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:13.043578" elapsed="0.000917"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:13.045446" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:13.044851" elapsed="0.000697"/>
</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-04-17T03:23:13.046829" elapsed="0.000473"/>
</kw>
<msg time="2026-04-17T03:23:13.047525" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:23:13.047650" level="INFO">${old_connection_index} = 8</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:13.045917" elapsed="0.001784"/>
</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-04-17T03:23:13.049073" elapsed="0.000152"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:23:13.049909" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:23:13.049732" elapsed="0.000727">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:13.049396" elapsed="0.001126"/>
</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-04-17T03:23:13.051045" elapsed="0.000101"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:13.050697" elapsed="0.000494"/>
</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-04-17T03:23:13.048528" elapsed="0.002706"/>
</kw>
<status status="PASS" start="2026-04-17T03:23:13.047892" elapsed="0.003390"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:13.047848" elapsed="0.003460"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:23:13.052160" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:23:13.051846" elapsed="0.000342"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:23:13.052238" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:23:13.052398" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:23:13.051544" elapsed="0.000878"/>
</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-04-17T03:23:13.052583" elapsed="0.000437"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:23:13.053302" level="INFO">index=10
host=10.30.170.120
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-04-17T03:23:13.053410" level="INFO">${karaf_connection_object} = index=10
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:23:13.053190" elapsed="0.000247"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:23:13.053587" elapsed="0.002805"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:23:13.056887" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:23:13.058240" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:23:13.056623" elapsed="0.002013">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:13.062363" elapsed="0.000441"/>
</kw>
<kw name="Open 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-04-17T03:23:13.062994" elapsed="0.000164"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:23:13.063339" elapsed="0.000107"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:23:13.059537" elapsed="0.003964"/>
</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-04-17T03:23:13.058979" elapsed="0.004570"/>
</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="FAIL" start="2026-04-17T03:23:13.040170" elapsed="0.023467">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:23:13.063730" level="FAIL">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<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="FAIL" start="2026-04-17T03:23:09.900374" elapsed="3.163460">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:09.899923" elapsed="3.163979"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:23:09.899780" elapsed="3.164188"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-04-17T03:23:09.899628" elapsed="3.164379"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-17T03:23:09.108616" elapsed="3.955471"/>
</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-04-17T03:23:13.067054" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:13.066904" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:13.066880" elapsed="0.000247"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:23:13.072641" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:13.072526" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:13.072507" elapsed="0.000206"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:23:13.073789" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:23:13.073327" elapsed="0.000489"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:23:13.074350" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:23:13.074000" elapsed="0.000376"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:23:13.074421" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:23:13.074588" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:23:13.072974" elapsed="0.001639"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:23:13.080668" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:13.080559" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:13.080541" 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-04-17T03:23:13.082017" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:13.081866" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:13.081849" elapsed="0.000237"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:23:13.082570" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:23:13.082236" elapsed="0.000361"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:23:13.083119" 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-04-17T03:23:13.082853" elapsed="0.000293"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:23:13.084325" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:23:13.083818" elapsed="0.001314">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:23:13.085277" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:23:13.085325" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:13.083311" elapsed="0.002037"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:23:13.086471" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:23:13.086060" elapsed="0.001243">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:23:13.087442" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:23:13.087489" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:13.085524" elapsed="0.001989"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:23:13.088631" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/ibgp_peers_basic.robot"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:23:13.087877" elapsed="0.000836">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/ibgp_peers_basic.robot"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:23:13.087598" elapsed="0.001255">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/ibgp_peers_basic.robot"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:23:13.087574" elapsed="0.001320">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/ibgp_peers_basic.robot"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:13.089091" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:13.089325" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:13.089181" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:23:13.089163" elapsed="0.000343"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:23:13.089543" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:13.091801" elapsed="0.000545"/>
</kw>
<kw name="Open 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-04-17T03:23:13.092709" elapsed="0.000332"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:23:13.093404" elapsed="0.000242"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:23:13.090826" elapsed="0.002913"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:23:13.089832" elapsed="0.004043"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:23:13.081578" elapsed="0.012412">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/ibgp_peers_basic.robot"</status>
</kw>
<msg time="2026-04-17T03:23:13.094103" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:23:13.094149" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/ibgp_peers_basic.robot"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:13.080895" elapsed="0.013280"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:23:13.094379" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:13.094259" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:13.094238" elapsed="0.000209"/>
</if>
<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-04-17T03:23:13.095393" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:13.095287" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:13.095270" elapsed="0.000190"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:23:13.095996" 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-04-17T03:23:13.096128" 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-04-17T03:23:13.095633" elapsed="0.000575"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:13.096649" level="INFO">{1: 10}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:13.096373" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:13.097120" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:13.096852" elapsed="0.000311"/>
</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-04-17T03:23:13.097711" elapsed="0.000302"/>
</kw>
<msg time="2026-04-17T03:23:13.098113" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:23:13.098159" level="INFO">${old_connection_index} = 10</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:13.097326" elapsed="0.000857"/>
</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-04-17T03:23:13.099431" elapsed="0.000260"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:23:13.101114" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:23:13.100777" elapsed="0.000896">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:13.099944" elapsed="0.001824"/>
</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-04-17T03:23:13.102911" elapsed="0.000300"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:13.102040" elapsed="0.001245"/>
</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-04-17T03:23:13.098481" elapsed="0.004887"/>
</kw>
<status status="PASS" start="2026-04-17T03:23:13.098257" elapsed="0.005163"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:13.098239" elapsed="0.005209"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:23:13.104476" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:23:13.103988" elapsed="0.000517"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:23:13.104556" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:23:13.104716" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:23:13.103675" elapsed="0.001065"/>
</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-04-17T03:23:13.104897" elapsed="0.000436"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:23:13.105622" level="INFO">index=13
host=10.30.170.120
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-04-17T03:23:13.105722" level="INFO">${karaf_connection_object} = index=13
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:23:13.105510" elapsed="0.000238"/>
</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-04-17T03:23:13.105899" elapsed="0.002466"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:23:13.108791" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:23:13.110152" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:23:13.108532" elapsed="0.002034">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:13.114564" elapsed="0.000706"/>
</kw>
<kw name="Open 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-04-17T03:23:13.115526" elapsed="0.000444"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:23:13.116204" elapsed="0.000180"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:23:13.111750" elapsed="0.004717"/>
</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-04-17T03:23:13.111161" elapsed="0.005355"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:23:13.094893" elapsed="0.021717">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:13.117073" elapsed="0.000032"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:23:13.117158" elapsed="0.000023"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:23:13.080258" elapsed="0.037018">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:23:13.117392" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:23:13.117437" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:13.075028" elapsed="0.042432"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:13.117814" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:13.117547" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:13.117527" elapsed="0.000368"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:23:13.074862" elapsed="0.043058"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:23:13.074671" elapsed="0.043301"/>
</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-04-17T03:23:13.072193" elapsed="0.045838"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-17T03:23:13.064715" elapsed="0.053372"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:13.064253" elapsed="0.053877"/>
</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-04-17T03:23:09.102117" elapsed="4.016066"/>
</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-04-17T03:23:13.118336" elapsed="0.000180"/>
</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-04-17T03:23:13.118672" elapsed="0.000226"/>
</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-04-17T03:23:13.120715" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:23:13.120796" 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-04-17T03:23:13.120419" elapsed="0.000401"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:13.121097" elapsed="0.000340"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:23:13.122311" level="INFO">Logging into '10.30.170.120:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:23:13.473865" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 17 03:23:09 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   10.4% of 77.35GB   Users logged in:       0
  Memory usage: 2%                 IPv4 address for ens3: 10.30.170.120
  Swap usage:   0%                 IPv6 address for ens3: 2607:f0d0:1002:11::2


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:23:09 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:23:13.121983" elapsed="0.352094"/>
</kw>
<msg time="2026-04-17T03:23:13.474185" 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-04-17T03:23:13.121608" elapsed="0.352681"/>
</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-04-17T03:23:13.119905" elapsed="0.354529"/>
</kw>
<msg time="2026-04-17T03:23:13.474506" 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-04-17T03:23:13.119479" elapsed="0.355087"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-17T03:23:13.119127" elapsed="0.355543"/>
</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-04-17T03:23:13.474998" elapsed="0.000428"/>
</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-04-17T03:23:13.478418" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:23:13.478622" 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-04-17T03:23:13.477665" elapsed="0.000992"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:13.478896" elapsed="0.000512"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:23:13.480673" level="INFO">Logging into '10.30.170.120:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:23:13.837722" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 17 03:23:09 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   10.4% of 77.35GB   Users logged in:       0
  Memory usage: 2%                 IPv4 address for ens3: 10.30.170.120
  Swap usage:   0%                 IPv6 address for ens3: 2607:f0d0:1002:11::2


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:23:13 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:23:13.480228" elapsed="0.357757"/>
</kw>
<msg time="2026-04-17T03:23:13.838102" 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-04-17T03:23:13.479658" elapsed="0.358557"/>
</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-04-17T03:23:13.477020" elapsed="0.361343"/>
</kw>
<msg time="2026-04-17T03:23:13.838425" 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-04-17T03:23:13.476365" elapsed="0.362119"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-17T03:23:13.475748" elapsed="0.362833"/>
</kw>
<kw name="Require_Python" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:23:13.840501" level="INFO">Executing command 'python3 --help'.</msg>
<msg time="2026-04-17T03:23:13.853325" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:23:13.853629" 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-04-17T03:23:13.853701" level="INFO">${stderr} = </msg>
<msg time="2026-04-17T03:23:13.853762" 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-04-17T03:23:13.840242" elapsed="0.013556"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:23:13.855395" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-04-17T03:23:13.854911" elapsed="0.000555"/>
</kw>
<msg time="2026-04-17T03:23:13.855663" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-04-17T03:23:13.855734" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:13.854203" elapsed="0.001565"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:23:13.856762" 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-04-17T03:23:13.856063" elapsed="0.000737"/>
</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-04-17T03:23:13.857556" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:13.856965" elapsed="0.000690"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:13.856902" elapsed="0.000798"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-04-17T03:23:13.857957" elapsed="0.000059"/>
</return>
<status status="PASS" start="2026-04-17T03:23:13.857783" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:13.857760" elapsed="0.000344"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-04-17T03:23:13.858248" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:13.858197" elapsed="0.000109"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:23:13.858164" elapsed="0.000173"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:13.858569" elapsed="0.000032"/>
</kw>
<msg time="2026-04-17T03:23:13.858801" 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-04-17T03:23:13.839800" elapsed="0.019039"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-04-17T03:23:13.859105" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-17T03:23:13.858965" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:13.858920" elapsed="0.000309"/>
</if>
<kw name="Fatal Error" owner="BuiltIn">
<arg>Python 3 is not installed!</arg>
<doc>Stops the whole test execution.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:13.859450" elapsed="0.000033"/>
</kw>
<doc>Verify current SSH connection leads to machine with python working. Fatal fail otherwise.</doc>
<status status="PASS" start="2026-04-17T03:23:13.839168" elapsed="0.020572"/>
</kw>
<kw name="Assure_Library_Ipaddr" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:23:13.863058" level="INFO">Executing command 'bash -c 'cd "." &amp;&amp; python -c "import ipaddr"''.</msg>
<msg time="2026-04-17T03:23:13.994103" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-17T03:23:13.994628" level="INFO">${stdout} = </msg>
<msg time="2026-04-17T03:23:13.994747" 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-04-17T03:23:13.994865" 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-04-17T03:23:13.862099" elapsed="0.132859"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:23:13.997847" level="INFO">Length is 119.</msg>
<msg time="2026-04-17T03:23:13.998137" 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-04-17T03:23:13.997039" elapsed="0.001301">'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-04-17T03:23:13.998656" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-04-17T03:23:13.998770" level="INFO">${result} = 'Traceback (most recent call last):
  File "&lt;string&gt;", line 1, in &lt;module&gt;
ModuleNotFoundError: No module named 'ipaddr'' should be empty.</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:13.995776" elapsed="0.003058"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:23:14.000572" 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-04-17T03:23:13.999353" elapsed="0.001252"/>
</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-04-17T03:23:14.002172" level="INFO"/>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:14.001839" elapsed="0.000390"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:14.002701" 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-04-17T03:23:14.002417" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:14.003241" level="INFO">1</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:14.002956" elapsed="0.000336"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-04-17T03:23:14.001304" elapsed="0.002055"/>
</kw>
<status status="PASS" start="2026-04-17T03:23:14.000736" elapsed="0.002666"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:14.000695" elapsed="0.002742"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-04-17T03:23:14.003689" elapsed="0.000052"/>
</return>
<status status="PASS" start="2026-04-17T03:23:14.003558" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:14.003536" elapsed="0.000288"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-04-17T03:23:14.003965" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:14.003904" elapsed="0.000109"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:23:14.003882" elapsed="0.000156"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:14.004220" elapsed="0.000024"/>
</kw>
<msg time="2026-04-17T03:23:14.004397" 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-04-17T03:23:13.861160" elapsed="0.143269"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="NOT RUN" start="2026-04-17T03:23:14.004656" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:14.004531" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:14.004508" elapsed="0.000218"/>
</if>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-04-17T03:23:14.039420" level="INFO">[chan 3] Opened sftp connection (server version 3)</msg>
<msg time="2026-04-17T03:23:14.054848" 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-04-17T03:23:14.004915" elapsed="0.050174"/>
</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-04-17T03:23:13.860175" elapsed="0.195103"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-04-17T03:23:14.068781" 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-04-17T03:23:14.055703" elapsed="0.013272"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:23:14.070071" level="INFO">Creating Session using : alias=session, url=http://10.30.170.120:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a4417f2d6d0&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-04-17T03:23:14.069411" elapsed="0.000971"/>
</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-04-17T03:23:14.073910" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:14.073741" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:14.073711" elapsed="0.000297"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:23:14.074453" level="INFO">${karaf_connection_index} = 13</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:23:14.074174" elapsed="0.000319"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:23:14.074869" level="INFO">${current_connection_index} = 16</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:23:14.074684" elapsed="0.000210"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:23:14.075829" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:23:14.075580" elapsed="0.000894">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:23:14.076597" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:23:14.076642" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:14.075089" elapsed="0.001576"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:23:14.077406" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:23:14.077212" elapsed="0.000785">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:23:14.078129" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:23:14.078176" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:14.076843" elapsed="0.001356"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:23:14.079127" level="FAIL">Failed to send the command: log:set INFO</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:23:14.078502" elapsed="0.000687">Failed to send the command: log:set INFO</status>
</kw>
<status status="FAIL" start="2026-04-17T03:23:14.078275" elapsed="0.000990">Failed to send the command: log:set INFO</status>
</branch>
<status status="FAIL" start="2026-04-17T03:23:14.078256" elapsed="0.001042">Failed to send the command: log:set INFO</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:14.079488" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:14.079724" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:14.079578" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:23:14.079561" elapsed="0.000239"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:23:14.079832" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:23:14.081787" elapsed="0.000189"/>
</kw>
<msg time="2026-04-17T03:23:14.082025" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:14.081146" elapsed="0.000945"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:14.082259" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:14.082430" 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-04-17T03:23:14.080790" elapsed="0.001728"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:23:14.080195" elapsed="0.002371"/>
</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="FAIL" start="2026-04-17T03:23:14.071225" elapsed="0.011422">Failed to send the command: log:set INFO</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<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="NOT RUN" start="2026-04-17T03:23:14.083020" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<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="NOT RUN" start="2026-04-17T03:23:14.083378" elapsed="0.000025"/>
</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="FAIL" start="2026-04-17T03:23:09.101523" elapsed="4.982013">Failed to send the command: log:set INFO</status>
</kw>
<test id="s1-s8-t1" name="TC1_Configure_Two_iBGP_Route_Reflector_Client_Peers" line="84">
<doc>Configure two iBGP peers as routing reflector clients.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:14.083645" elapsed="0.000635">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s8-t2" name="TC1_Connect_BGP_Peer1" line="122">
<doc>Connect BGP peer</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:14.084572" elapsed="0.000425">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s8-t3" name="TC1_Connect_BGP_Peer2" line="134">
<doc>Connect BGP peer</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:14.085284" elapsed="0.000398">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s8-t4" name="TC1_BGP_Peer1_Check_Log_For_Introduced_Prefixes" line="146">
<doc>Check incomming updates for new routes</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:14.085979" elapsed="0.000433">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s8-t5" name="TC1_BGP_Peer2_Check_Log_For_Introduced_Prefixes" line="163">
<doc>Check incomming updates for new routes</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:14.086667" elapsed="0.000457">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s8-t6" name="TC1_Disconnect_BGP_Peer1" line="180">
<doc>Stop BGP peer &amp; store logs</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:14.087395" elapsed="0.000394">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s8-t7" name="TC1_BGP_Peer2_Check_Log_For_Withdrawn_Prefixes" line="187">
<doc>Check incomming updates for withdrawn routes</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:14.088058" elapsed="0.000433">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s8-t8" name="TC1_Disconnect_BGP_Peer2" line="203">
<doc>Stop BGP peer &amp; store logs</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:14.088738" elapsed="0.000399">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s8-t9" name="TC_1_Check_for_Empty_IPv4_Topology" line="210">
<status status="FAIL" start="2026-04-17T03:23:14.089316" elapsed="0.000314">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s8-t10" name="TC1_Delete_BGP_Peers_Configuration" line="218">
<doc>Delete all previously configured BGP peers.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:14.089812" elapsed="0.000402">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s8-t11" name="TC2_Configure_One_iBGP_Route_Reflector_Client_And_One_iBGP_Non_Client" line="240">
<doc>Configure iBGP peers: 1st one as RR client, 2nd one as RR non-client.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:14.090388" elapsed="0.000480">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s8-t12" name="TC2_Connect_BGP_Peer1" line="278">
<doc>Connect BGP peer</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:14.091051" elapsed="0.000313">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s8-t13" name="TC2_Connect_BGP_Peer2" line="290">
<doc>Connect BGP peer</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:14.091575" elapsed="0.000312">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s8-t14" name="TC2_BGP_Peer1_Check_Log_For_Introduced_Prefixes" line="302">
<doc>Check incomming updates for new routes</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:14.092081" elapsed="0.000401">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s8-t15" name="TC2_BGP_Peer2_Check_Log_For_Introduced_Prefixes" line="319">
<doc>Check incomming updates for new routes</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:14.092658" elapsed="0.000412">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s8-t16" name="TC2_Disconnect_BGP_Peer1" line="336">
<doc>Stop BGP peer &amp; store logs</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:14.093253" elapsed="0.000383">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s8-t17" name="TC2_BGP_Peer2_Check_Log_For_Withdrawn_Prefixes" line="343">
<doc>Check incomming updates for withdrawn routes</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:14.093839" elapsed="0.000440">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s8-t18" name="TC2_Disconnect_BGP_Peer2" line="359">
<doc>Stop BGP peer &amp; store logs</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:14.094459" elapsed="0.000328">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s8-t19" name="TC_2_Check_for_Empty_IPv4_Topology" line="366">
<status status="FAIL" start="2026-04-17T03:23:14.094978" elapsed="0.000298">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s8-t20" name="TC2_Delete_BGP_Peers_Configuration" line="374">
<doc>Delete all previously configured BGP peers.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:14.095486" elapsed="0.000377">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s8-t21" name="TC3_Configure_Two_iBGP_Non_Client_Peers" line="396">
<doc>Configure iBGP peers: 1st one as RR client, 2nd one as RR non-client.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:14.096050" elapsed="0.002551">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s8-t22" name="TC3_Connect_BGP_Peer1" line="434">
<doc>Connect BGP peer</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:14.098780" elapsed="0.000318">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s8-t23" name="TC3_Connect_BGP_Peer2" line="446">
<doc>Connect BGP peer</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:14.099270" elapsed="0.000328">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s8-t24" name="TC3_BGP_Peer1_Check_Log_For_No_Updates" line="458">
<doc>Check for no updates received by iBGP peer No. 1</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:14.099771" elapsed="0.000384">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s8-t25" name="TC3_Disconnect_BGP_Peer1" line="472">
<doc>Stop BGP peer &amp; store logs</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:14.100323" elapsed="0.000310">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s8-t26" name="TC3_BGP_Peer2_Check_Log_For_No_Updates" line="479">
<doc>Consequent check for no updates received by iBGP peer No. 2</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:14.100805" elapsed="0.000401">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s8-t27" name="TC3_Disconnect_BGP_Peer2" line="494">
<doc>Stop BGP peer &amp; store logs</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:14.101377" elapsed="0.000318">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s8-t28" name="TC_3_Check_for_Empty_IPv4_Topology" line="501">
<status status="FAIL" start="2026-04-17T03:23:14.101864" elapsed="0.000296">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s8-t29" name="TC3_Delete_BGP_Peers_Configuration" line="509">
<doc>Delete all previously configured BGP peers.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:14.102327" elapsed="0.000356">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s8-t30" name="TC4_Configure_Two_iBGP_RR_Clients_With_Cluster_Id" line="531">
<doc>Configure two iBGP peers as routing reflector clients with cluster-id argument.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:14.102891" elapsed="0.000452">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s8-t31" name="TC4_Connect_BGP_Peers" line="557">
<doc>Connect BGP peers, each set to send 3 prefixes.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:14.103537" elapsed="0.000335">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s8-t32" name="TC4_BGP_Peer1_Check_Rib_Out_For_Introduced_Prefixes" line="579">
<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="FAIL" start="2026-04-17T03:23:14.104062" elapsed="0.000656">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s8-t33" name="TC4_BGP_Peer2_Check_Rib_Out_For_Introduced_Prefixes" line="599">
<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-04-17T03:23:14.104894" elapsed="0.000547">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s8-t34" name="TC4_Disconnect_BGP_Peers" line="618">
<doc>Stop BGP peer &amp; store logs</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:14.105618" elapsed="0.000327">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s8-t35" name="TC4_Check_for_Empty_IPv4_Topology" line="628">
<doc>Checks for empty topology after</doc>
<status status="FAIL" start="2026-04-17T03:23:14.106123" elapsed="0.000314">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s8-t36" name="TC4_Delete_BGP_Peers_Configuration" line="637">
<doc>Delete all previously configured BGP peers.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:14.106605" elapsed="0.000370">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</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-04-17T03:23:14.108687" level="INFO">Executing command 'ps -elf | egrep python | egrep 'play.py' | egrep -v grep'.</msg>
<msg time="2026-04-17T03:23:14.131750" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-17T03:23:14.132053" 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-04-17T03:23:14.108529" elapsed="0.023588"/>
</kw>
<return>
<value>${processes}</value>
<status status="PASS" start="2026-04-17T03:23:14.132249" elapsed="0.000099"/>
</return>
<msg time="2026-04-17T03:23:14.132652" 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-04-17T03:23:14.108249" elapsed="0.024459"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:14.133821" level="INFO"/>
<arg>${processes}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:14.133138" elapsed="0.000778"/>
</kw>
<kw name="Kill_Remote_Processes" owner="KillPythonTool">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-17T03:23:14.136029" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:23:14.136233" 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-04-17T03:23:14.135285" elapsed="0.001003"/>
</kw>
<if>
<branch type="IF" condition="${arg_length} == 0">
<return>
<status status="PASS" start="2026-04-17T03:23:14.136751" elapsed="0.000060"/>
</return>
<status status="PASS" start="2026-04-17T03:23:14.136463" elapsed="0.000414"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:14.136416" elapsed="0.000547"/>
</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-04-17T03:23:14.137329" elapsed="0.000049"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${commands}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:14.137717" elapsed="0.000046"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${stdout}</var>
<var>${stderr}</var>
<arg>echo 'set -exu; ${commands}' | sudo sh</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:14.138130" elapsed="0.000047"/>
</kw>
<arg>${processes}</arg>
<doc>Kill processes by PIDs from given list (no-op if the list is empty), using specified signal. Log the kill commands used.</doc>
<status status="PASS" start="2026-04-17T03:23:14.134547" elapsed="0.003773"/>
</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-04-17T03:23:14.107917" elapsed="0.030524"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-17T03:23:14.138995" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-17T03:23:14.138798" elapsed="0.000388"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-04-17T03:23:14.139557" elapsed="0.000738"/>
</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-04-17T03:23:14.107616" elapsed="0.032809"/>
</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-04-17T03:23:08.968947" elapsed="5.171552">Suite setup failed:
Failed to send the command: log:set INFO</status>
</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-04-17T03:23:14.380176" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:23:14.374999" elapsed="0.005239"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-17T03:23:14.374510" elapsed="0.005803"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-17T03:23:14.385740" 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-04-17T03:23:14.381505" elapsed="0.004264"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-17T03:23:14.386006" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:14.385860" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:14.385835" elapsed="0.000243"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:23:14.386612" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:23:14.386240" elapsed="0.000416"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-17T03:23:14.387209" 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-04-17T03:23:14.386822" elapsed="0.000419"/>
</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-04-17T03:23:14.387896" elapsed="0.000321"/>
</kw>
<msg time="2026-04-17T03:23:14.388341" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:23:14.388391" level="INFO">${possibly_int_of_members} = 1</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:14.387485" elapsed="0.000928"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:23:14.388994" 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-04-17T03:23:14.388595" elapsed="0.000426"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:23:14.390080" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:23:14.389783" elapsed="0.000324"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:23:14.390542" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:23:14.390259" elapsed="0.000313"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:23:14.391103" 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-04-17T03:23:14.390762" elapsed="0.000368"/>
</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-04-17T03:23:14.394896" elapsed="0.000246"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:23:14.395693" level="INFO">${member_ip} = 10.30.170.120</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:23:14.395360" elapsed="0.000359"/>
</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-04-17T03:23:14.395876" elapsed="0.000272"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:23:14.396968" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:23:14.396654" elapsed="0.000341"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-17T03:23:14.397043" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:23:14.397243" 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-04-17T03:23:14.396350" elapsed="0.000928"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:23:14.397918" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.120:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a442423fb50&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-04-17T03:23:14.397445" elapsed="0.000679"/>
</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-04-17T03:23:14.398316" elapsed="0.000200"/>
</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-04-17T03:23:14.394268" elapsed="0.004308"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:23:14.394060" elapsed="0.004561"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-04-17T03:23:14.391192" elapsed="0.007464"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:23:14.399283" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:23:14.398824" elapsed="0.000503"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:23:14.400006" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.120'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:23:14.399572" elapsed="0.000477"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:23:14.400603" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:23:14.400212" elapsed="0.000458"/>
</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-04-17T03:23:14.389298" elapsed="0.011448"/>
</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-04-17T03:23:14.381116" elapsed="0.019689"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:23:14.401041" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:14.400881" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:14.400859" elapsed="0.000252"/>
</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-04-17T03:23:14.404636" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:23:14.404189" elapsed="0.000480"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:23:14.405163" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:23:14.404836" elapsed="0.000354"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:23:14.405236" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:23:14.405439" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:23:14.403793" elapsed="0.001676"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:23:14.406552" level="INFO">${member_ip} = 10.30.170.120</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-04-17T03:23:14.406262" elapsed="0.000317"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:23:14.407482" 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-04-17T03:23:14.407585" 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-04-17T03:23:14.407300" elapsed="0.000311"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:14.411434" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:14.410789" elapsed="0.000738"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:14.410769" elapsed="0.000801"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:23:14.412275" 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-04-17T03:23:14.412518" 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-04-17T03:23:14.411790" elapsed="0.000783"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:14.413628" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.120" 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-04-17T03:23:14.412842" elapsed="0.000907"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:23:14.415107" 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-04-17T03:23:14.414073" elapsed="0.001088"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-17T03:23:14.416984" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:23:14.417164" 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-04-17T03:23:14.416579" elapsed="0.000629"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:14.417553" elapsed="0.000498"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:23:14.419426" level="INFO">Logging into '10.30.170.120:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:23:14.777951" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 17 03:23:09 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   10.4% of 77.35GB   Users logged in:       0
  Memory usage: 2%                 IPv4 address for ens3: 10.30.170.120
  Swap usage:   0%                 IPv6 address for ens3: 2607:f0d0:1002:11::2


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:23:13 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:23:14.418907" elapsed="0.359229"/>
</kw>
<msg time="2026-04-17T03:23:14.778230" 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-04-17T03:23:14.418409" elapsed="0.360002"/>
</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-04-17T03:23:14.415648" elapsed="0.362928"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:23:14.779621" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-17T03:23:14.792877" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-17T03:23:14.793347" level="INFO">${stdout} = </msg>
<msg time="2026-04-17T03:23:14.793592" 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-04-17T03:23:14.779083" elapsed="0.014671"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:23:14.794637" elapsed="0.001379"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:14.799263" 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-04-17T03:23:14.797507" elapsed="0.002008"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-17T03:23:14.800161" elapsed="0.000072"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:14.799765" elapsed="0.000609"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:14.799721" elapsed="0.000746"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:23:14.801064" elapsed="0.000121"/>
</return>
<status status="PASS" start="2026-04-17T03:23:14.800621" elapsed="0.000701"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:14.800588" elapsed="0.000811"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-17T03:23:14.801517" elapsed="0.000025"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:14.807797" 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="PASS" start="2026-04-17T03:23:14.808920" elapsed="0.000452"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:23:14.809752" elapsed="0.000384"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:23:14.802276" elapsed="0.007965"/>
</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-04-17T03:23:14.409804" elapsed="0.400684"/>
</kw>
<msg time="2026-04-17T03:23:14.810571" 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-04-17T03:23:14.409069" elapsed="0.401582"/>
</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-04-17T03:23:14.408330" elapsed="0.402433"/>
</kw>
<msg time="2026-04-17T03:23:14.810820" 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-04-17T03:23:14.407783" elapsed="0.403101"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:14.814137" elapsed="0.000321"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-17T03:23:14.814628" elapsed="0.000149"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:23:14.814951" elapsed="0.000145"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:23:14.811470" elapsed="0.003680"/>
</kw>
<msg time="2026-04-17T03:23:14.815313" 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-04-17T03:23:14.406834" elapsed="0.408505"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:14.815823" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:14.815564" elapsed="0.000300"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-17T03:23:14.815924" elapsed="0.000062"/>
</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-04-17T03:23:14.405860" elapsed="0.410242"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:23:14.405667" elapsed="0.410476"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:23:14.405528" elapsed="0.410655"/>
</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-04-17T03:23:14.401342" elapsed="0.414904"/>
</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-04-17T03:23:14.816426" elapsed="0.000233"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:23:14.832656" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:14.832533" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:14.832511" elapsed="0.000217"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:23:14.833068" 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-04-17T03:23:14.833178" 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-04-17T03:23:14.832899" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:14.833631" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:14.833361" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:14.834091" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:14.833828" elapsed="0.000308"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:23:14.834964" 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-04-17T03:23:14.834704" elapsed="0.000405">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-17T03:23:14.835222" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:23:14.835267" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:14.834296" elapsed="0.000994"/>
</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-04-17T03:23:14.835617" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:14.835365" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:14.835347" elapsed="0.000378"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:23:14.836495" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:23:14.836228" elapsed="0.000293"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:23:14.836567" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:23:14.836718" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:23:14.835952" elapsed="0.000790"/>
</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-04-17T03:23:14.836898" elapsed="0.000437"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:23:14.837613" level="INFO">index=4
host=10.30.170.120
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-04-17T03:23:14.837713" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.120
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-04-17T03:23:14.837508" elapsed="0.000231"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:23:14.837888" elapsed="0.003078"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:23:14.841410" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:23:14.842471" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:23:14.841141" elapsed="0.001780">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:14.846429" elapsed="0.000367"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-17T03:23:14.847010" elapsed="0.000164"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:23:14.847328" elapsed="0.000104"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:23:14.843989" elapsed="0.003495"/>
</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-04-17T03:23:14.843384" elapsed="0.004146"/>
</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="FAIL" start="2026-04-17T03:23:14.832219" elapsed="0.015400">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:23:15.875167" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:15.874966" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:15.874907" elapsed="0.000388"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:23:15.875849" 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-04-17T03:23:15.876035" 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-04-17T03:23:15.875595" elapsed="0.000479"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:15.876742" 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-04-17T03:23:15.876304" elapsed="0.000503"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:15.877395" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:15.877046" elapsed="0.000413"/>
</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-04-17T03:23:15.878313" elapsed="0.000316"/>
</kw>
<msg time="2026-04-17T03:23:15.878771" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:23:15.878837" level="INFO">${old_connection_index} = 4</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:15.877696" elapsed="0.001175"/>
</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-04-17T03:23:15.880105" elapsed="0.000197"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:23:15.881298" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:23:15.881042" elapsed="0.001049">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:15.880544" elapsed="0.001636"/>
</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-04-17T03:23:15.882925" elapsed="0.000170"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:15.882447" elapsed="0.000715"/>
</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-04-17T03:23:15.879335" elapsed="0.003892"/>
</kw>
<status status="PASS" start="2026-04-17T03:23:15.879003" elapsed="0.004295"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:15.878974" elapsed="0.004364"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:23:15.884514" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:23:15.884123" elapsed="0.000429"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:23:15.884625" elapsed="0.000053"/>
</return>
<msg time="2026-04-17T03:23:15.884858" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:23:15.883670" elapsed="0.001224"/>
</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-04-17T03:23:15.885149" elapsed="0.000599"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:23:15.886189" level="INFO">index=6
host=10.30.170.120
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-04-17T03:23:15.886455" level="INFO">${karaf_connection_object} = index=6
host=10.30.170.120
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-04-17T03:23:15.886022" elapsed="0.000473"/>
</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-04-17T03:23:15.886718" elapsed="0.003991"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:23:15.891405" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:23:15.892712" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:23:15.891006" elapsed="0.002358">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:15.898298" elapsed="0.000549"/>
</kw>
<kw name="Open 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-04-17T03:23:15.899127" elapsed="0.000244"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:23:15.899608" elapsed="0.000164"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:23:15.894739" elapsed="0.005109"/>
</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-04-17T03:23:15.893852" elapsed="0.006065"/>
</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="FAIL" start="2026-04-17T03:23:15.874348" elapsed="0.025723">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:23:16.921200" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:16.921045" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:16.921008" elapsed="0.000285"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:23:16.921701" 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-04-17T03:23:16.921865" 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-04-17T03:23:16.921503" elapsed="0.000393"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:16.922405" level="INFO">{1: 6}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:16.922083" elapsed="0.000386"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:16.923000" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:16.922683" elapsed="0.000367"/>
</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-04-17T03:23:16.923698" elapsed="0.000251"/>
</kw>
<msg time="2026-04-17T03:23:16.924059" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:23:16.924108" level="INFO">${old_connection_index} = 6</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:16.923225" elapsed="0.000906"/>
</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-04-17T03:23:16.925030" elapsed="0.000167"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:23:16.926057" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:23:16.925715" elapsed="0.000930">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:16.925372" elapsed="0.001342"/>
</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-04-17T03:23:16.927348" elapsed="0.000114"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:16.926909" elapsed="0.000601"/>
</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-04-17T03:23:16.924447" elapsed="0.003109"/>
</kw>
<status status="PASS" start="2026-04-17T03:23:16.924210" elapsed="0.003394"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:16.924190" elapsed="0.003440"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:23:16.928641" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:23:16.928308" elapsed="0.000363"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:23:16.928725" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:23:16.928914" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:23:16.927965" elapsed="0.001004"/>
</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-04-17T03:23:16.929173" elapsed="0.000470"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:23:16.929998" level="INFO">index=8
host=10.30.170.120
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-04-17T03:23:16.930106" level="INFO">${karaf_connection_object} = index=8
host=10.30.170.120
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-04-17T03:23:16.929863" elapsed="0.000274"/>
</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-04-17T03:23:16.930339" elapsed="0.002923"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:23:16.933800" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:23:16.935093" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:23:16.933470" elapsed="0.002025">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:16.939102" elapsed="0.000363"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-17T03:23:16.939633" elapsed="0.000362"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:23:16.940160" 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-04-17T03:23:16.936417" elapsed="0.003906"/>
</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-04-17T03:23:16.935808" elapsed="0.004562"/>
</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="FAIL" start="2026-04-17T03:23:16.920512" elapsed="0.019946">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:23:17.963394" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:17.963223" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:17.963189" elapsed="0.000315"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:23:17.964007" 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-04-17T03:23:17.964152" 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-04-17T03:23:17.963760" elapsed="0.000424"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:17.964776" level="INFO">{1: 8}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:17.964392" elapsed="0.000442"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:17.965380" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:17.965047" elapsed="0.000391"/>
</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-04-17T03:23:17.966213" elapsed="0.000230"/>
</kw>
<msg time="2026-04-17T03:23:17.966569" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:23:17.966625" level="INFO">${old_connection_index} = 8</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:17.965656" elapsed="0.000994"/>
</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-04-17T03:23:17.967660" elapsed="0.000187"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:23:17.968712" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:23:17.968498" elapsed="0.000883">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:17.968083" elapsed="0.001471"/>
</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-04-17T03:23:17.970253" elapsed="0.000128"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:17.969793" elapsed="0.000644"/>
</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-04-17T03:23:17.967000" elapsed="0.003490"/>
</kw>
<status status="PASS" start="2026-04-17T03:23:17.966730" elapsed="0.003820"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:17.966711" elapsed="0.003872"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:23:17.971619" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:23:17.971284" elapsed="0.000368"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:23:17.971715" elapsed="0.000045"/>
</return>
<msg time="2026-04-17T03:23:17.971912" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:23:17.970878" elapsed="0.001081"/>
</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-04-17T03:23:17.972155" elapsed="0.000456"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:23:17.973006" level="INFO">index=10
host=10.30.170.120
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-04-17T03:23:17.973174" level="INFO">${karaf_connection_object} = index=10
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:23:17.972832" elapsed="0.000376"/>
</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-04-17T03:23:17.973402" elapsed="0.003222"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:23:17.977082" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:23:17.978315" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:23:17.976795" elapsed="0.001926">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:17.982361" elapsed="0.000371"/>
</kw>
<kw name="Open 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-04-17T03:23:17.982924" elapsed="0.000176"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:23:17.983252" elapsed="0.000100"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:23:17.979779" elapsed="0.003626"/>
</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-04-17T03:23:17.979126" elapsed="0.004326"/>
</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="FAIL" start="2026-04-17T03:23:17.962680" elapsed="0.020855">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:23:17.983638" level="FAIL">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<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="FAIL" start="2026-04-17T03:23:14.817480" elapsed="3.166267">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:14.817067" elapsed="3.166749"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:23:14.816887" elapsed="3.166972"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-04-17T03:23:14.816723" elapsed="3.167175"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-17T03:23:14.380634" elapsed="3.603370"/>
</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-04-17T03:23:17.986916" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:17.986801" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:17.986780" elapsed="0.000274"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:23:17.992803" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:17.992662" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:17.992642" elapsed="0.000240"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:23:17.994075" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:23:17.993551" elapsed="0.000562"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:23:17.994727" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:23:17.994326" elapsed="0.000437"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:23:17.994822" elapsed="0.000045"/>
</return>
<msg time="2026-04-17T03:23:17.995057" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:23:17.993203" elapsed="0.001887"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:23:18.002226" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:18.002083" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:18.002056" elapsed="0.000243"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:23:18.003743" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:18.003598" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:18.003578" elapsed="0.000255"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:23:18.004454" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:23:18.004054" elapsed="0.000428"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:23:18.004878" 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-04-17T03:23:18.004647" elapsed="0.000257"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:23:18.006187" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:23:18.005634" elapsed="0.001493">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:23:18.007274" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:23:18.007322" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:18.005083" elapsed="0.002271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:23:18.008659" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:23:18.008174" elapsed="0.001591">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:23:18.009971" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:23:18.010022" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:18.007575" elapsed="0.002471"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:23:18.011202" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/ebgp_peers_basic.robot"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:23:18.010417" elapsed="0.000868">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/ebgp_peers_basic.robot"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:23:18.010133" elapsed="0.001308">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/ebgp_peers_basic.robot"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:23:18.010109" elapsed="0.001381">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/ebgp_peers_basic.robot"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:18.011674" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:18.011919" elapsed="0.000092"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:18.011763" elapsed="0.000349"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:23:18.011746" elapsed="0.000393"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:23:18.012176" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:18.014270" elapsed="0.000457"/>
</kw>
<kw name="Open 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-04-17T03:23:18.015177" elapsed="0.000315"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:23:18.015870" elapsed="0.000496"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:23:18.013447" elapsed="0.003044"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:23:18.012485" 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="FAIL" start="2026-04-17T03:23:18.003264" elapsed="0.013526">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/ebgp_peers_basic.robot"</status>
</kw>
<msg time="2026-04-17T03:23:18.016950" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:23:18.017010" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/ebgp_peers_basic.robot"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:18.002484" elapsed="0.014560"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:23:18.017337" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:18.017203" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:18.017175" elapsed="0.000244"/>
</if>
<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-04-17T03:23:18.018451" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:18.018310" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:18.018291" elapsed="0.000253"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:23:18.020543" 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-04-17T03:23:18.020666" 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-04-17T03:23:18.018771" elapsed="0.001922"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:18.021286" level="INFO">{1: 10}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:18.020902" elapsed="0.000437"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:18.021873" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:18.021539" elapsed="0.000416"/>
</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-04-17T03:23:18.022713" elapsed="0.000356"/>
</kw>
<msg time="2026-04-17T03:23:18.023172" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:23:18.023226" level="INFO">${old_connection_index} = 10</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:18.022185" elapsed="0.001071"/>
</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-04-17T03:23:18.024762" elapsed="0.000397"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:23:18.026996" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:23:18.026602" elapsed="0.001108">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:18.025497" elapsed="0.002338"/>
</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-04-17T03:23:18.029321" elapsed="0.000280"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:18.028244" elapsed="0.001464"/>
</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-04-17T03:23:18.023580" elapsed="0.006252"/>
</kw>
<status status="PASS" start="2026-04-17T03:23:18.023346" elapsed="0.006557"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:18.023320" elapsed="0.006645"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:23:18.031355" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:23:18.030705" elapsed="0.000689"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:23:18.031465" elapsed="0.000051"/>
</return>
<msg time="2026-04-17T03:23:18.031690" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:23:18.030290" elapsed="0.001435"/>
</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-04-17T03:23:18.031982" elapsed="0.000504"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:23:18.032969" level="INFO">index=13
host=10.30.170.120
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-04-17T03:23:18.033130" level="INFO">${karaf_connection_object} = index=13
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:23:18.032791" elapsed="0.000379"/>
</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-04-17T03:23:18.033383" elapsed="0.003861"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:23:18.037808" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:23:18.038958" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:23:18.037480" elapsed="0.001906">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:18.043382" 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="PASS" start="2026-04-17T03:23:18.044456" elapsed="0.000594"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:23:18.045350" elapsed="0.000191"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:23:18.040366" elapsed="0.005285"/>
</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-04-17T03:23:18.039738" elapsed="0.005978"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:23:18.017989" elapsed="0.028033">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:18.046406" elapsed="0.000034"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:23:18.046509" 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="FAIL" start="2026-04-17T03:23:18.001711" elapsed="0.044921">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:23:18.046752" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:23:18.046808" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:17.995559" elapsed="0.051280"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:18.047215" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:18.046943" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:18.046906" elapsed="0.000391"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:23:17.995407" elapsed="0.051915"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:23:17.995168" elapsed="0.052186"/>
</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-04-17T03:23:17.992283" elapsed="0.055128"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-17T03:23:17.984648" elapsed="0.062823"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:17.984193" elapsed="0.063337"/>
</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-04-17T03:23:14.374074" elapsed="3.673526"/>
</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-04-17T03:23:18.047812" elapsed="0.000254"/>
</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-04-17T03:23:18.048259" elapsed="0.000236"/>
</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-04-17T03:23:18.050526" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:23:18.050628" 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-04-17T03:23:18.050207" elapsed="0.000445"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:18.050816" elapsed="0.000375"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:23:18.052296" level="INFO">Logging into '10.30.170.120:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:23:18.414017" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 17 03:23:09 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   10.4% of 77.35GB   Users logged in:       0
  Memory usage: 2%                 IPv4 address for ens3: 10.30.170.120
  Swap usage:   0%                 IPv6 address for ens3: 2607:f0d0:1002:11::2


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:23:14 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:23:18.051856" elapsed="0.362331"/>
</kw>
<msg time="2026-04-17T03:23:18.414278" 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-04-17T03:23:18.051429" elapsed="0.362933"/>
</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-04-17T03:23:18.049739" elapsed="0.364737"/>
</kw>
<msg time="2026-04-17T03:23:18.414527" 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-04-17T03:23:18.049267" elapsed="0.365305"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-17T03:23:18.048750" elapsed="0.365897"/>
</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-04-17T03:23:18.414891" elapsed="0.000351"/>
</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-04-17T03:23:18.417434" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:23:18.417517" 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-04-17T03:23:18.416796" elapsed="0.000745"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:18.417703" elapsed="0.000359"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:23:18.418912" level="INFO">Logging into '10.30.170.120:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:23:18.727801" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 17 03:23:09 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   10.4% of 77.35GB   Users logged in:       0
  Memory usage: 2%                 IPv4 address for ens3: 10.30.170.120
  Swap usage:   0%                 IPv6 address for ens3: 2607:f0d0:1002:11::2


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:23:18 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:23:18.418587" elapsed="0.309436"/>
</kw>
<msg time="2026-04-17T03:23:18.728126" 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-04-17T03:23:18.418232" elapsed="0.309988"/>
</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-04-17T03:23:18.416347" elapsed="0.312007"/>
</kw>
<msg time="2026-04-17T03:23:18.728424" 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-04-17T03:23:18.415862" elapsed="0.312623"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-17T03:23:18.415479" elapsed="0.313107"/>
</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-04-17T03:23:18.728951" elapsed="0.000417"/>
</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-04-17T03:23:18.731422" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:23:18.731504" 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-04-17T03:23:18.731137" elapsed="0.000391"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:18.731688" elapsed="0.000356"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:23:18.733044" level="INFO">Logging into '10.30.170.120:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:23:19.055008" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 17 03:23:09 UTC 2026

  System load:  0.0                Processes:             118
  Usage of /:   10.4% of 77.35GB   Users logged in:       0
  Memory usage: 2%                 IPv4 address for ens3: 10.30.170.120
  Swap usage:   0%                 IPv6 address for ens3: 2607:f0d0:1002:11::2


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:23:18 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:23:18.732670" elapsed="0.322512"/>
</kw>
<msg time="2026-04-17T03:23:19.055287" 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-04-17T03:23:18.732308" elapsed="0.323085"/>
</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-04-17T03:23:18.730666" elapsed="0.324868"/>
</kw>
<msg time="2026-04-17T03:23:19.055606" 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-04-17T03:23:18.730179" elapsed="0.325494"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-17T03:23:18.729682" elapsed="0.326099"/>
</kw>
<kw name="Require_Python" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:23:19.057425" level="INFO">Executing command 'python3 --help'.</msg>
<msg time="2026-04-17T03:23:19.069782" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:23:19.069990" 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-04-17T03:23:19.070057" level="INFO">${stderr} = </msg>
<msg time="2026-04-17T03:23:19.070118" 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-04-17T03:23:19.057203" elapsed="0.012947"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:23:19.071439" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-04-17T03:23:19.071031" elapsed="0.000473"/>
</kw>
<msg time="2026-04-17T03:23:19.071640" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-04-17T03:23:19.071711" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:19.070427" elapsed="0.001320"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:23:19.072721" 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-04-17T03:23:19.072016" elapsed="0.000752"/>
</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-04-17T03:23:19.073431" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:19.072894" elapsed="0.000631"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:19.072860" elapsed="0.000705"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-04-17T03:23:19.073804" elapsed="0.000046"/>
</return>
<status status="PASS" start="2026-04-17T03:23:19.073646" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:19.073624" elapsed="0.000334"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-04-17T03:23:19.074088" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:19.074040" elapsed="0.000105"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:23:19.074018" elapsed="0.000157"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:19.074384" elapsed="0.000032"/>
</kw>
<msg time="2026-04-17T03:23:19.074602" 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-04-17T03:23:19.056790" elapsed="0.017849"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-04-17T03:23:19.074879" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-17T03:23:19.074737" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:19.074712" elapsed="0.000305"/>
</if>
<kw name="Fatal Error" owner="BuiltIn">
<arg>Python 3 is not installed!</arg>
<doc>Stops the whole test execution.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:19.075225" elapsed="0.000031"/>
</kw>
<doc>Verify current SSH connection leads to machine with python working. Fatal fail otherwise.</doc>
<status status="PASS" start="2026-04-17T03:23:19.056218" 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-04-17T03:23:19.077226" level="INFO">Executing command 'bash -c 'cd "." &amp;&amp; python -c "import ipaddr"''.</msg>
<msg time="2026-04-17T03:23:19.145774" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:23:19.146155" level="INFO">${stdout} = </msg>
<msg time="2026-04-17T03:23:19.146268" level="INFO">${stderr} = </msg>
<msg time="2026-04-17T03:23:19.146400" 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-04-17T03:23:19.076954" elapsed="0.069528"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:23:19.148970" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-04-17T03:23:19.148078" elapsed="0.001019"/>
</kw>
<msg time="2026-04-17T03:23:19.149344" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-04-17T03:23:19.149454" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:19.147035" elapsed="0.002489"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:23:19.151354" 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-04-17T03:23:19.150069" elapsed="0.001354"/>
</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-04-17T03:23:19.152713" elapsed="0.000073"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:19.151653" elapsed="0.001238"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:19.151576" elapsed="0.001412"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-04-17T03:23:19.153379" elapsed="0.000070"/>
</return>
<status status="PASS" start="2026-04-17T03:23:19.153125" elapsed="0.000407"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:19.153089" elapsed="0.000503"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-04-17T03:23:19.153833" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:19.153749" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:23:19.153708" elapsed="0.000317"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:19.154406" elapsed="0.000057"/>
</kw>
<msg time="2026-04-17T03:23:19.154841" 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-04-17T03:23:19.076337" elapsed="0.078581"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-04-17T03:23:19.155366" elapsed="0.000063"/>
</return>
<status status="PASS" start="2026-04-17T03:23:19.155136" elapsed="0.000365"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:19.155093" elapsed="0.000465"/>
</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-04-17T03:23:19.156004" elapsed="0.000066"/>
</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-04-17T03:23:19.075688" elapsed="0.080540"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-04-17T03:23:19.189875" level="INFO">[chan 3] Opened sftp connection (server version 3)</msg>
<msg time="2026-04-17T03:23:19.201369" 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-04-17T03:23:19.156702" elapsed="0.044763"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:23:19.202222" level="INFO">Creating Session using : alias=config-session, url=http://10.30.170.120:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a44244ea510&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-04-17T03:23:19.201736" elapsed="0.001092"/>
</kw>
<kw name="Create_Default_Session" owner="TemplatedRequests">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:23:19.210759" level="INFO">Creating Session using : alias=default, url=http://10.30.170.120:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a44244eaf50&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-04-17T03:23:19.210352" elapsed="0.000516"/>
</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-04-17T03:23:19.209851" elapsed="0.001105"/>
</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-04-17T03:23:19.213493" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:19.213369" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:19.213347" elapsed="0.000219"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:23:19.214009" level="INFO">${karaf_connection_index} = 13</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:23:19.213719" elapsed="0.000320"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:23:19.214409" level="INFO">${current_connection_index} = 17</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:23:19.214224" elapsed="0.000211"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:23:19.215277" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:23:19.215067" elapsed="0.000742">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:23:19.215925" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:23:19.215990" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:19.214657" elapsed="0.001358"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:23:19.216761" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:23:19.216570" elapsed="0.000736">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:23:19.217421" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:23:19.217468" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:19.216190" elapsed="0.001302"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:23:19.218255" level="FAIL">Failed to send the command: log:set INFO</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:23:19.217801" elapsed="0.000542">Failed to send the command: log:set INFO</status>
</kw>
<status status="FAIL" start="2026-04-17T03:23:19.217567" elapsed="0.000871">Failed to send the command: log:set INFO</status>
</branch>
<status status="FAIL" start="2026-04-17T03:23:19.217549" elapsed="0.000936">Failed to send the command: log:set INFO</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:19.218704" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:19.218979" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:19.218801" elapsed="0.000233"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:23:19.218784" elapsed="0.000274"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:23:19.219090" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:23:19.220912" elapsed="0.000161"/>
</kw>
<msg time="2026-04-17T03:23:19.221117" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:19.220354" 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-04-17T03:23:19.221337" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:19.221501" 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-04-17T03:23:19.219985" elapsed="0.001597"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:23:19.219386" elapsed="0.002242"/>
</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="FAIL" start="2026-04-17T03:23:19.211355" elapsed="0.010349">Failed to send the command: log:set INFO</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<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="NOT RUN" start="2026-04-17T03:23:19.222076" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<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="NOT RUN" start="2026-04-17T03:23:19.222638" elapsed="0.000026"/>
</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="FAIL" start="2026-04-17T03:23:14.373568" elapsed="4.849187">Failed to send the command: log:set INFO</status>
</kw>
<test id="s1-s9-t1" name="Configure_BGP_Peers" line="96">
<doc>Configure an iBGP and two eBGP peers</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:19.222829" elapsed="0.000409">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s9-t2" name="Connect_iBGP_Peer1" line="144">
<doc>Connect BGP peer</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:19.223423" elapsed="0.000298">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s9-t3" name="Connect_eBGP_Peer1" line="152">
<doc>Connect BGP peer</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:19.223891" elapsed="0.000356">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s9-t4" name="Check_IPv4_Topology_For_First_Path" line="159">
<doc>The IPv4 topology shall contain the route announced by the first eBGP</doc>
<status status="FAIL" start="2026-04-17T03:23:19.224446" elapsed="0.000382">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s9-t5" name="iBGP_Check_Log_For_Introduced_Prefixes" line="171">
<doc>Check incomming updates for introduced routes</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:19.225014" elapsed="0.000370">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s9-t6" name="Connect_eBGP_Peer2" line="194">
<doc>Connect BGP peer and check empty topology</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:19.225552" elapsed="0.000360">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s9-t7" name="Disconnect_eBGP_Peer1" line="201">
<doc>Stop BGP peer, log topology and store logs</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:19.226142" elapsed="0.000320">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s9-t8" name="Check_IPv4_Topology_For_Second_Path" line="208">
<doc>The IPv4 topology shall contain the route announced by the second eBGP now</doc>
<status status="FAIL" start="2026-04-17T03:23:19.226637" elapsed="0.000403">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s9-t9" name="iBGP_Check_Log_For_Updated_Prefixes" line="220">
<doc>Check incomming updates for updated routes</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:19.227205" elapsed="0.000350">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s9-t10" name="Disconnect_eBGP_Peer2" line="244">
<doc>Stop BGP peer, store logs and wait for empty topology</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:19.227726" elapsed="0.000359">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s9-t11" name="Check_For_Empty_IPv4_Topology" line="251">
<doc>The IPv4 topology shall be empty</doc>
<status status="FAIL" start="2026-04-17T03:23:19.228250" elapsed="0.000347">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s9-t12" name="iBGP_Check_Log_For_Withdrawn_Prefixes" line="261">
<doc>Check incomming updates for withdrawn routes</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:19.228772" elapsed="0.000375">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s9-t13" name="Disconnect_iBGP_Peer1" line="275">
<doc>Stop BGP peer, log topology and store logs</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:19.229313" elapsed="0.000317">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s9-t14" name="Delete_BGP_Peers_Configuration" line="282">
<doc>Delete all previously configured BGP peers.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:19.229842" elapsed="0.000363">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s9-t15" name="TC_LAS_Reconfigure_Odl_To_Accept_Connection" line="296">
<doc>Configure neighbors. One ibgp and one ebgp neighbor with local-as configured.</doc>
<status status="FAIL" start="2026-04-17T03:23:19.230368" elapsed="0.000463">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s9-t16" name="TC_LAS_Start_iBgp_Speaker_And_Verify_Connected" line="316">
<doc>Verify that peer is present in odl's rib. Peer is configured with local-as.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:19.231056" elapsed="0.000424">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s9-t17" name="TC_LAS_Start_eBgp_Speaker_And_Verify_Connected" line="328">
<doc>Verify that peer is present in odl's rib. Peer is configured with local-as.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:19.231646" elapsed="0.000481">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s9-t18" name="TC_LAS_Verify_iBGP_Rib_Out" line="340">
<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-04-17T03:23:19.232302" elapsed="0.000410">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s9-t19" name="TC_LAS_Verify_eBGP_Rib_Out" line="360">
<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-04-17T03:23:19.232922" elapsed="0.000408">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s9-t20" name="TC_LAS_Kill_iBgp_Speaker_After_Talking" line="380">
<doc>Abort the Python speaker. Also, attempt to stop failing fast.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:19.233496" elapsed="0.000386">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s9-t21" name="TC_LAS_Kill_eBgp_Speaker_After_Talking" line="390">
<doc>Abort the Python speaker. Also, attempt to stop failing fast.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:19.234062" elapsed="0.000387">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</test>
<test id="s1-s9-t22" name="TC_LAS_Delete_Bgp_Peer_Configurations" line="400">
<doc>Delete peer configuration.</doc>
<status status="FAIL" start="2026-04-17T03:23:19.234655" elapsed="0.000331">Parent suite setup failed:
Failed to send the command: log:set INFO</status>
</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-04-17T03:23:19.236492" level="INFO">Executing command 'ps -elf | egrep python | egrep 'play.py' | egrep -v grep'.</msg>
<msg time="2026-04-17T03:23:19.258769" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-17T03:23:19.258870" 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-04-17T03:23:19.236333" elapsed="0.022561"/>
</kw>
<return>
<value>${processes}</value>
<status status="PASS" start="2026-04-17T03:23:19.258961" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:23:19.259124" 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-04-17T03:23:19.236056" elapsed="0.023092"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:19.259581" level="INFO"/>
<arg>${processes}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:19.259311" elapsed="0.000312"/>
</kw>
<kw name="Kill_Remote_Processes" owner="KillPythonTool">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-17T03:23:19.260776" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:23:19.260853" 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-04-17T03:23:19.260484" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="${arg_length} == 0">
<return>
<status status="PASS" start="2026-04-17T03:23:19.261083" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:23:19.260965" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:19.260945" elapsed="0.000219"/>
</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-04-17T03:23:19.261321" elapsed="0.000021"/>
</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-04-17T03:23:19.261495" 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-04-17T03:23:19.261666" 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-04-17T03:23:19.260155" elapsed="0.001630"/>
</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-04-17T03:23:19.235755" elapsed="0.026081"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-17T03:23:19.262074" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-17T03:23:19.261999" elapsed="0.000164"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-04-17T03:23:19.262312" elapsed="0.000342"/>
</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-04-17T03:23:19.235481" elapsed="0.027228"/>
</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-04-17T03:23:14.142302" elapsed="5.120437">Suite setup failed:
Failed to send the command: log:set INFO</status>
</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-04-17T03:23:19.325453" elapsed="0.000339"/>
</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-04-17T03:23:19.327465" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:23:19.327547" 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-04-17T03:23:19.327192" elapsed="0.000379"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:19.327718" elapsed="0.000346"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:23:19.328911" level="INFO">Logging into '10.30.171.238:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:23:19.973306" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 17 03:23:19 UTC 2026

  System load:  0.06               Processes:             107
  Usage of /:   19.5% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.238
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:17:14 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:23:19.328591" elapsed="0.644927"/>
</kw>
<msg time="2026-04-17T03:23:19.973615" 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-04-17T03:23:19.328219" elapsed="0.645492"/>
</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-04-17T03:23:19.326748" elapsed="0.647097"/>
</kw>
<msg time="2026-04-17T03:23:19.973905" 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-04-17T03:23:19.326355" elapsed="0.647626"/>
</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-04-17T03:23:19.326005" elapsed="0.648070"/>
</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-04-17T03:23:19.981406" level="INFO">${cd_and_command} = cd '.' &amp;&amp; virtualenv /tmp/defaultvenv</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:23:19.980984" elapsed="0.000455"/>
</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-04-17T03:23:19.983123" level="INFO">Executing command 'cd '.' &amp;&amp; virtualenv /tmp/defaultvenv'.</msg>
<msg time="2026-04-17T03:23:20.249089" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:23:20.249461" 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-04-17T03:23:20.249568" level="INFO">${stderr} = </msg>
<msg time="2026-04-17T03:23:20.249662" 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-04-17T03:23:19.982888" elapsed="0.266827"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:23:20.251966" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-04-17T03:23:20.251276" elapsed="0.000802"/>
</kw>
<msg time="2026-04-17T03:23:20.252294" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-04-17T03:23:20.252393" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:20.250387" elapsed="0.002055"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:23:20.253801" 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-04-17T03:23:20.252791" elapsed="0.001070"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:20.256342" 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-04-17T03:23:20.255722" elapsed="0.000728"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:20.257335" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:20.256765" elapsed="0.000661"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:20.258292" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:20.257730" elapsed="0.000662"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-04-17T03:23:20.254871" elapsed="0.003642"/>
</kw>
<status status="PASS" start="2026-04-17T03:23:20.254087" elapsed="0.004507"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:20.254033" elapsed="0.004623"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-04-17T03:23:20.259062" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:20.258781" elapsed="0.000386"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:20.258744" elapsed="0.000471"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:23:20.259529" elapsed="0.000066"/>
</return>
<status status="PASS" start="2026-04-17T03:23:20.259330" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:20.259297" elapsed="0.000427"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:20.260134" elapsed="0.000055"/>
</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-04-17T03:23:19.982263" elapsed="0.278166"/>
</kw>
<msg time="2026-04-17T03:23:20.260566" 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-04-17T03:23:19.981616" elapsed="0.279070"/>
</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-04-17T03:23:19.980229" elapsed="0.280585"/>
</kw>
<msg time="2026-04-17T03:23:20.260872" 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-04-17T03:23:19.975263" elapsed="0.285653"/>
</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-04-17T03:23:19.974816" elapsed="0.286224"/>
</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-04-17T03:23:20.267515" level="INFO">${cd_and_command} = cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install --upgrade pip; deactivate</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:23:20.267178" elapsed="0.000367"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:23:20.269370" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install --upgrade pip; deactivate'.</msg>
<msg time="2026-04-17T03:23:22.384215" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:23:22.384757" level="INFO">${stdout} = Requirement already satisfied: pip in /tmp/defaultvenv/lib/python3.10/site-packages (22.0.2)
Collecting pip
  Using cached pip-26.0.1-py3-none-any.whl (1.8 MB)
Installing collected packages: pip
  Att...</msg>
<msg time="2026-04-17T03:23:22.385101" level="INFO">${stderr} = </msg>
<msg time="2026-04-17T03:23:22.385437" 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-04-17T03:23:20.269015" elapsed="2.116520"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:23:22.391456" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-04-17T03:23:22.390569" elapsed="0.001056"/>
</kw>
<msg time="2026-04-17T03:23:22.391869" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-04-17T03:23:22.392196" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:22.386533" elapsed="0.005730"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:23:22.394561" 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-04-17T03:23:22.392697" elapsed="0.001970"/>
</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-04-17T03:23:22.399326" level="INFO">Requirement already satisfied: pip in /tmp/defaultvenv/lib/python3.10/site-packages (22.0.2)
Collecting pip
  Using cached pip-26.0.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.0.1</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:22.398524" elapsed="0.000952"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:22.400767" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:22.400149" elapsed="0.000815"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:22.402022" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:22.401463" elapsed="0.000738"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-04-17T03:23:22.396649" elapsed="0.005703"/>
</kw>
<status status="PASS" start="2026-04-17T03:23:22.395032" elapsed="0.007466"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:22.394981" elapsed="0.007562"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-04-17T03:23:22.403027" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:22.402709" elapsed="0.000486"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:22.402668" elapsed="0.000563"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:23:22.403543" elapsed="0.000050"/>
</return>
<status status="PASS" start="2026-04-17T03:23:22.403310" elapsed="0.000425"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:22.403287" elapsed="0.000488"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:22.403919" elapsed="0.000070"/>
</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-04-17T03:23:20.268353" elapsed="2.135807"/>
</kw>
<msg time="2026-04-17T03:23:22.404222" 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-04-17T03:23:20.267692" elapsed="2.136588"/>
</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-04-17T03:23:20.266562" elapsed="2.137804"/>
</kw>
<msg time="2026-04-17T03:23:22.404421" 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-04-17T03:23:20.262919" elapsed="2.141548"/>
</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-04-17T03:23:20.262375" elapsed="2.142172"/>
</kw>
<msg time="2026-04-17T03:23:22.404597" 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-04-17T03:23:20.262001" elapsed="2.142641"/>
</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-04-17T03:23:20.261640" elapsed="2.143079"/>
</kw>
<msg time="2026-04-17T03:23:22.404762" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${upgrade_pip}</arg>
<arg>Virtual_Env_Run_Cmd_At_Cwd</arg>
<arg>pip install --upgrade pip</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:20.261186" elapsed="2.143621"/>
</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-04-17T03:23:19.974423" elapsed="2.430460"/>
</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-04-17T03:23:22.412291" level="INFO">${cd_and_command} = cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install setuptools==44.0.0; deactivate</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:23:22.411682" elapsed="0.000652"/>
</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-04-17T03:23:22.414891" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install setuptools==44.0.0; deactivate'.</msg>
<msg time="2026-04-17T03:23:23.191823" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:23:23.192567" 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-04-17T03:23:23.192687" level="INFO">${stderr} = </msg>
<msg time="2026-04-17T03:23:23.192788" 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-04-17T03:23:22.414345" elapsed="0.778504"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:23:23.198547" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-04-17T03:23:23.197037" elapsed="0.001764"/>
</kw>
<msg time="2026-04-17T03:23:23.199046" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-04-17T03:23:23.199110" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:23.193664" elapsed="0.005479"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:23:23.201020" 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-04-17T03:23:23.199476" elapsed="0.001591"/>
</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-04-17T03:23:23.204813" 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-04-17T03:23:23.203921" elapsed="0.001043"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:23.206368" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:23.205542" elapsed="0.000967"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:23.207556" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:23.207023" elapsed="0.000665"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-04-17T03:23:23.202545" elapsed="0.005281"/>
</kw>
<status status="PASS" start="2026-04-17T03:23:23.201335" elapsed="0.006765"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:23.201275" elapsed="0.006888"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-04-17T03:23:23.208575" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:23.208289" elapsed="0.000479"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:23.208253" elapsed="0.000568"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:23:23.209392" elapsed="0.000062"/>
</return>
<status status="PASS" start="2026-04-17T03:23:23.208921" elapsed="0.000656"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:23.208895" elapsed="0.000758"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:23.209952" elapsed="0.000038"/>
</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-04-17T03:23:22.413448" elapsed="0.796857"/>
</kw>
<msg time="2026-04-17T03:23:23.210436" 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-04-17T03:23:22.412542" elapsed="0.798008"/>
</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-04-17T03:23:22.411049" elapsed="0.799690"/>
</kw>
<msg time="2026-04-17T03:23:23.210853" 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-04-17T03:23:22.407241" elapsed="0.803678"/>
</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-04-17T03:23:22.406668" elapsed="0.804525"/>
</kw>
<msg time="2026-04-17T03:23:23.211250" 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-04-17T03:23:22.406266" elapsed="0.805034"/>
</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-04-17T03:23:22.405855" elapsed="0.805541"/>
</kw>
<msg time="2026-04-17T03:23:23.211445" 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-04-17T03:23:22.405468" elapsed="0.806023"/>
</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-04-17T03:23:22.405198" elapsed="0.806398"/>
</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-04-17T03:23:23.227192" level="INFO">${cd_and_command} = cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install exabgp==3.4.16; deactivate</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:23:23.226518" elapsed="0.000726"/>
</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-04-17T03:23:23.230255" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install exabgp==3.4.16; deactivate'.</msg>
<msg time="2026-04-17T03:23:25.021610" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:23:25.022224" 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-04-17T03:23:25.022395" 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-04-17T03:23:25.022542" 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-04-17T03:23:23.229521" elapsed="1.793082"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:23:25.027339" level="INFO">Length is 1821.</msg>
<msg time="2026-04-17T03:23:25.028363" 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-v30dq28l/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-v30dq28l/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-v30dq28l/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-v30dq28l/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())
        File "&lt;string&gt;", line 40
          print """\
          ^^^^^^^^^
      SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed to build 'exabgp' when getting requirements to build wheel' should be empty.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="FAIL" start="2026-04-17T03:23:25.026070" elapsed="0.002895">'  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-v30dq28l/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-v30dq28l/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-v30dq28l/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-v30dq28l/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())
        File "&lt;string&gt;", line 40
          print """\
          ^^^^^^^^^
      SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed to build 'exabgp' when getting requirements to build wheel' should be empty.</status>
</kw>
<msg time="2026-04-17T03:23:25.029556" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-04-17T03:23:25.029709" level="INFO">${result} = '  error: subprocess-exited-with-error
  
  × Getting requirements to build wheel did not run successfully.
  │ exit code: 1
  ╰─&gt; [19 lines of output]
      Traceback (most recent call last):
       ...</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:23:25.023316" elapsed="0.006483"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:23:25.031849" 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-04-17T03:23:25.030221" elapsed="0.001683"/>
</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-04-17T03:23:25.036139" 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-04-17T03:23:25.035440" elapsed="0.000853"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:25.037608" 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-v30dq28l/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-v30dq28l/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-v30dq28l/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-v30dq28l/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())
        File "&lt;string&gt;", line 40
          print """\
          ^^^^^^^^^
      SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed to build 'exabgp' when getting requirements to build wheel</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:25.036864" elapsed="0.000907"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:25.038742" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:25.038240" elapsed="0.000642"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-04-17T03:23:25.033587" elapsed="0.005582"/>
</kw>
<status status="PASS" start="2026-04-17T03:23:25.032177" elapsed="0.007153"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:25.032138" elapsed="0.007238"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-04-17T03:23:25.039735" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:25.039466" elapsed="0.000484"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:25.039441" elapsed="0.000568"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:23:25.040394" elapsed="0.000064"/>
</return>
<status status="PASS" start="2026-04-17T03:23:25.040128" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:25.040092" elapsed="0.000591"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:25.040996" 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-04-17T03:23:23.228544" elapsed="1.812805"/>
</kw>
<msg time="2026-04-17T03:23:25.041468" 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-04-17T03:23:23.227489" elapsed="1.814088"/>
</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-04-17T03:23:23.225276" elapsed="1.816479"/>
</kw>
<msg time="2026-04-17T03:23:25.041859" 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-04-17T03:23:23.216366" elapsed="1.825588"/>
</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-04-17T03:23:23.214095" elapsed="1.827974"/>
</kw>
<msg time="2026-04-17T03:23:25.042170" 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-04-17T03:23:23.213503" elapsed="1.828718"/>
</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-04-17T03:23:23.213074" elapsed="1.829237"/>
</kw>
<msg time="2026-04-17T03:23:25.042355" 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-04-17T03:23:23.212457" elapsed="1.829941"/>
</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-04-17T03:23:23.211867" elapsed="1.830610"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:23:25.043076" level="INFO">Creating Session using : alias=session, url=http://10.30.170.120:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a4424a5b790&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-04-17T03:23:25.042646" elapsed="0.000657"/>
</kw>
<kw name="Upload_Config_Files">
<kw name="Put Directory" owner="SSHLibrary">
<msg time="2026-04-17T03:23:25.069241" level="INFO">[chan 5] Opened sftp connection (server version 3)</msg>
<msg time="2026-04-17T03:23:25.085626" 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-04-17T03:23:25.085692" 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-04-17T03:23:25.043986" elapsed="0.041787"/>
</kw>
<kw name="List Files In Directory" owner="SSHLibrary">
<msg time="2026-04-17T03:23:25.095052" level="INFO">4 files:
bgp-flowspec-redirect.cfg
bgp-flowspec.cfg
exa-md5.cfg
gobgp.cfg</msg>
<msg time="2026-04-17T03:23:25.095234" 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-04-17T03:23:25.086123" elapsed="0.009148"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:23:25.096067" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.238/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-04-17T03:23:25.108444" 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-04-17T03:23:25.095799" elapsed="0.012783"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:23:25.109578" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.120/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-04-17T03:23:25.159514" 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-04-17T03:23:25.109061" elapsed="0.050633"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:23:25.160514" level="INFO">Executing command 'cat bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-04-17T03:23:25.212289" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:23:25.212589" level="INFO">${stdout} = neighbor 10.30.170.120 {
router-id 10.30.171.238;
local-address 10.30.171.238;
local-as 64496;
peer-as 64496;
family {
  ipv4 flow;
}
flow {
    route flow1 {
        match {
            source 10.0.0...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-17T03:23:25.160154" elapsed="0.052497"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:25.213897" level="INFO">neighbor 10.30.170.120 {
router-id 10.30.171.238;
local-address 10.30.171.238;
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-04-17T03:23:25.213192" elapsed="0.000856"/>
</kw>
<var name="${cfgfile}">bgp-flowspec-redirect.cfg</var>
<status status="PASS" start="2026-04-17T03:23:25.095606" elapsed="0.118525"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:23:25.215119" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.238/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-04-17T03:23:25.264006" 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-04-17T03:23:25.214694" elapsed="0.049535"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:23:25.265287" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.120/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-04-17T03:23:25.316675" 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-04-17T03:23:25.264706" elapsed="0.052381"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:23:25.318248" level="INFO">Executing command 'cat bgp-flowspec.cfg'.</msg>
<msg time="2026-04-17T03:23:25.372377" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:23:25.372778" level="INFO">${stdout} = neighbor 10.30.170.120 {
router-id 10.30.171.238;
local-address 10.30.171.238;
local-as 64496;
peer-as 64496;
family {
  ipv4 flow;
}
flow {
    route flow1 {
        match {
            source 10.0.0...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-17T03:23:25.317703" elapsed="0.055119"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:25.374085" level="INFO">neighbor 10.30.170.120 {
router-id 10.30.171.238;
local-address 10.30.171.238;
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-04-17T03:23:25.373386" elapsed="0.001040"/>
</kw>
<var name="${cfgfile}">bgp-flowspec.cfg</var>
<status status="PASS" start="2026-04-17T03:23:25.214391" elapsed="0.160124"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:23:25.375896" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.238/g' exa-md5.cfg'.</msg>
<msg time="2026-04-17T03:23:25.424558" 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-04-17T03:23:25.375420" elapsed="0.049403"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:23:25.425917" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.120/g' exa-md5.cfg'.</msg>
<msg time="2026-04-17T03:23:25.475826" 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-04-17T03:23:25.425405" elapsed="0.050749"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:23:25.477265" level="INFO">Executing command 'cat exa-md5.cfg'.</msg>
<msg time="2026-04-17T03:23:25.528479" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:23:25.529076" level="INFO">${stdout} = neighbor 10.30.170.120 {
  router-id 10.30.171.238;
  local-address 10.30.171.238;
  local-as 64496;
  peer-as 64496;
  md5-password topsecret;

  capability {
    route-refresh disable;
    add-path ...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-17T03:23:25.476703" elapsed="0.052461"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:25.530977" level="INFO">neighbor 10.30.170.120 {
  router-id 10.30.171.238;
  local-address 10.30.171.238;
  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-04-17T03:23:25.529977" elapsed="0.001117"/>
</kw>
<var name="${cfgfile}">exa-md5.cfg</var>
<status status="PASS" start="2026-04-17T03:23:25.374890" elapsed="0.156290"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:23:25.532421" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.238/g' gobgp.cfg'.</msg>
<msg time="2026-04-17T03:23:25.584704" 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-04-17T03:23:25.531844" elapsed="0.053295"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:23:25.586590" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.120/g' gobgp.cfg'.</msg>
<msg time="2026-04-17T03:23:25.635742" 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-04-17T03:23:25.585886" elapsed="0.050202"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:23:25.637392" level="INFO">Executing command 'cat gobgp.cfg'.</msg>
<msg time="2026-04-17T03:23:25.684828" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:23:25.685288" level="INFO">${stdout} = [global.config]
    as = 64496
    router-id = "10.30.171.238"
    port = 17900
[[neighbors]]
    [neighbors.config]
        peer-as = 64496
        neighbor-address = "10.30.170.120"
        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-04-17T03:23:25.636771" elapsed="0.048559"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:25.686486" level="INFO">[global.config]
    as = 64496
    router-id = "10.30.171.238"
    port = 17900
[[neighbors]]
    [neighbors.config]
        peer-as = 64496
        neighbor-address = "10.30.170.120"
        local-as = 64496
    [neighbors.transport.config]
        local-address = "10.30.171.238"
        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-04-17T03:23:25.685827" elapsed="0.000762"/>
</kw>
<var name="${cfgfile}">gobgp.cfg</var>
<status status="PASS" start="2026-04-17T03:23:25.531475" elapsed="0.155184"/>
</iter>
<var>${cfgfile}</var>
<value>@{cfgfiles}</value>
<status status="PASS" start="2026-04-17T03:23:25.095365" elapsed="0.591385"/>
</for>
<arg>${BGP_VARIABLES_FOLDER}</arg>
<doc>Uploads exabgp config files</doc>
<status status="PASS" start="2026-04-17T03:23:25.043584" elapsed="0.643379"/>
</kw>
<doc>Suite setup keyword</doc>
<status status="PASS" start="2026-04-17T03:23:19.325232" elapsed="6.361862"/>
</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-04-17T03:23:25.737852" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:23:25.737429" elapsed="0.000465"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:23:25.738892" 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-04-17T03:23:25.738422" elapsed="0.000580">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-04-17T03:23:25.739104" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:23:25.738089" elapsed="0.001040"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:23:25.739675" 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-04-17T03:23:25.739283" elapsed="0.000419"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:23:25.740110" 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-04-17T03:23:25.740286" 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-04-17T03:23:25.739960" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:25.740714" 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-04-17T03:23:25.740458" 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-04-17T03:23:25.742005" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:25.741530" elapsed="0.000537"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:23:25.742583" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:23:25.742216" elapsed="0.000394"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:25.743052" elapsed="0.000048"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:25.743667" 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-04-17T03:23:25.744023" elapsed="0.000046"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:23:25.742851" elapsed="0.001337"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:23:25.742674" elapsed="0.001583"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:23:25.744312" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:23:25.744492" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:23:25.741194" elapsed="0.003324"/>
</kw>
<status status="PASS" start="2026-04-17T03:23:25.740864" elapsed="0.003686"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:25.744711" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:25.744577" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:25.740834" elapsed="0.003986"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:23:25.745437" 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-04-17T03:23:25.744973" elapsed="0.000492"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:23:25.745514" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>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-04-17T03:23:25.736795" elapsed="0.008845"/>
</kw>
<msg time="2026-04-17T03:23:25.745695" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:25.725288" elapsed="0.020458"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>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-04-17T03:23:25.757185" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:25.768230" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:25.779248" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:25.779581" 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-04-17T03:23:25.779749" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:25.780147" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:25.780013" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:23:25.779997" 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-04-17T03:23:25.780355" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:25.780508" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:25.780658" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:23:25.779962" elapsed="0.000749"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:23:25.779831" elapsed="0.000907"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:25.780889" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:23:25.780981" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:23:25.781124" 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-04-17T03:23:25.721340" elapsed="0.059812"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:23:25.782474" 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-04-17T03:23:25.782190" elapsed="0.000360">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-04-17T03:23:25.782647" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:23:25.781811" elapsed="0.000861"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:25.782999" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:25.782741" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:23:25.783546" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:23:25.783247" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-17T03:23:25.783082" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:25.782723" elapsed="0.000906"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:23:25.785777" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:23:25.783767" elapsed="0.002036"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:23:25.785854" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:23:25.786027" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:23:25.781476" elapsed="0.004576"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:23:25.787199" 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-04-17T03:23:25.787002" elapsed="0.000251"/>
</kw>
<msg time="2026-04-17T03:23:25.787339" 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-04-17T03:23:25.786663" elapsed="0.000756"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-04-17T03:23:25.787631" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:25.787493" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:25.787475" elapsed="0.000223"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:23:25.788015" 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-04-17T03:23:25.788175" 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-04-17T03:23:25.787829" elapsed="0.000371"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-04-17T03:23:25.788588" 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-04-17T03:23:25.788344" elapsed="0.000270"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-04-17T03:23:25.788661" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:23:25.788845" 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-04-17T03:23:25.786349" elapsed="0.002523"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:25.790278" 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-04-17T03:23:25.790023" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:25.790704" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:25.790460" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:23:25.796070" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:25.998365" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:26.401401" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:26.404252" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:23:25.792871" elapsed="0.616598">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:23:25.790813" elapsed="0.618874">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:23:26.410183" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:26.409775" elapsed="0.000559"/>
</branch>
<status status="FAIL" start="2026-04-17T03:23:25.790795" elapsed="0.619591">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:23:26.411276" elapsed="0.000057"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:23:26.411575" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:26.411492" elapsed="0.000178"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:23:26.411452" elapsed="0.000266"/>
</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-04-17T03:23:26.412031" elapsed="0.000136"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:23:26.412282" elapsed="0.000035"/>
</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-04-17T03:23:25.789194" elapsed="0.623413">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:23:26.412787" elapsed="0.000036"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:23:25.700532" elapsed="0.712436">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:23:26.413238" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:26.413066" elapsed="0.000245"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:23:26.413049" elapsed="0.000285"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:23:26.413367" elapsed="0.000014"/>
</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="FAIL" start="2026-04-17T03:23:25.694519" elapsed="0.718948">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verify empty flowspec data on neon</doc>
<status status="FAIL" start="2026-04-17T03:23:25.690310" elapsed="0.723261">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verify expected response.</doc>
<status status="FAIL" start="2026-04-17T03:23:25.689901" elapsed="0.723757">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:23:29.467892" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:23:29.467482" elapsed="0.000462"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:23:29.468962" 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-04-17T03:23:29.468485" elapsed="0.000563">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-04-17T03:23:29.469149" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:23:29.468114" elapsed="0.001059"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:23:29.469724" 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-04-17T03:23:29.469329" elapsed="0.000423"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:23:29.470126" 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-04-17T03:23:29.470474" 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-04-17T03:23:29.469973" elapsed="0.000591"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:29.471040" 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-04-17T03:23:29.470712" elapsed="0.000376"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:29.472312" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:29.471810" elapsed="0.000566"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:23:29.472885" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:23:29.472526" elapsed="0.000386"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:29.473504" elapsed="0.000047"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:29.474136" 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-04-17T03:23:29.474458" elapsed="0.000046"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:23:29.473150" elapsed="0.001476"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:23:29.472985" elapsed="0.001707"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:23:29.474742" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:23:29.474960" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:23:29.471471" elapsed="0.003517"/>
</kw>
<status status="PASS" start="2026-04-17T03:23:29.471167" elapsed="0.003858"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:29.475189" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:29.475053" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:29.471142" elapsed="0.004126"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:23:29.475859" 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-04-17T03:23:29.475400" elapsed="0.000489"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:23:29.475956" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:23:29.466834" elapsed="0.009253"/>
</kw>
<msg time="2026-04-17T03:23:29.476144" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:29.454903" elapsed="0.021291"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>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-04-17T03:23:29.489372" 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/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-04-17T03:23:29.502097" 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/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-04-17T03:23:29.515358" elapsed="0.000067"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:29.515759" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:29.515952" 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-04-17T03:23:29.516388" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:29.516248" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:23:29.516230" 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-04-17T03:23:29.516600" 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-04-17T03:23:29.516753" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:29.516904" elapsed="0.000034"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:23:29.516189" elapsed="0.000785"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:23:29.516043" elapsed="0.000959"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:29.517139" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:23:29.517219" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:23:29.517391" 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-04-17T03:23:29.450864" elapsed="0.066557"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:23:29.518870" 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-04-17T03:23:29.518554" elapsed="0.000410">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-04-17T03:23:29.519061" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:23:29.518155" elapsed="0.000932"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:29.519411" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:29.519158" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:23:29.519974" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:23:29.519658" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-04-17T03:23:29.519494" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:29.519140" elapsed="0.000918"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:23:29.522284" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:23:29.520198" elapsed="0.002114"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:23:29.522368" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:23:29.522543" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:23:29.517781" elapsed="0.004788"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:23:29.523811" 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-04-17T03:23:29.523599" elapsed="0.000267"/>
</kw>
<msg time="2026-04-17T03:23:29.523969" 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-04-17T03:23:29.523269" elapsed="0.000725"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-04-17T03:23:29.524209" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:29.524068" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:29.524048" elapsed="0.000308"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:23:29.524662" 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-04-17T03:23:29.524817" 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-04-17T03:23:29.524492" elapsed="0.000350"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-04-17T03:23:29.525260" 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-04-17T03:23:29.525004" elapsed="0.000281"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-04-17T03:23:29.525332" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:23:29.525491" 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-04-17T03:23:29.522916" elapsed="0.002599"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:29.526977" 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-04-17T03:23:29.526665" elapsed="0.000359"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:29.527408" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:29.527164" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:23:29.532770" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:29.734407" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:30.136908" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:30.139544" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:23:29.529618" elapsed="0.615098">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:23:29.527518" elapsed="0.617439">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:23:30.145439" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:30.145048" elapsed="0.000546"/>
</branch>
<status status="FAIL" start="2026-04-17T03:23:29.527499" elapsed="0.618149">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:23:30.146668" elapsed="0.000062"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:23:30.147018" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:30.146895" elapsed="0.000184"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:23:30.146855" elapsed="0.000246"/>
</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-04-17T03:23:30.147236" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:23:30.147307" 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-04-17T03:23:29.525822" elapsed="0.621601">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:23:30.147561" 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-04-17T03:23:29.429667" elapsed="0.717998">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:23:30.147950" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:30.147763" elapsed="0.000263"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:23:30.147746" elapsed="0.000304"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:23:30.148083" elapsed="0.000015"/>
</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="FAIL" start="2026-04-17T03:23:29.424080" elapsed="0.724106">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verify empty flowspec data on neon</doc>
<status status="FAIL" start="2026-04-17T03:23:29.415074" elapsed="0.733216">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verify expected response.</doc>
<status status="FAIL" start="2026-04-17T03:23:29.414317" elapsed="0.734063">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:23:33.216003" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:23:33.215493" elapsed="0.000547"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:23:33.217051" 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-04-17T03:23:33.216562" elapsed="0.000568">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-04-17T03:23:33.217234" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:23:33.216216" elapsed="0.001043"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:23:33.217879" 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-04-17T03:23:33.217445" elapsed="0.000464"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:23:33.218249" 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-04-17T03:23:33.218420" 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-04-17T03:23:33.218099" elapsed="0.000348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:33.218853" 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-04-17T03:23:33.218597" 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-04-17T03:23:33.220324" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:33.219807" elapsed="0.000583"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:23:33.221008" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:23:33.220543" 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-04-17T03:23:33.221451" elapsed="0.000049"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:33.222098" elapsed="0.000053"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:23:33.222479" elapsed="0.000049"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:23:33.221269" elapsed="0.001399"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:23:33.221095" elapsed="0.001651"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:23:33.222799" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:23:33.223028" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:23:33.219438" elapsed="0.003618"/>
</kw>
<status status="PASS" start="2026-04-17T03:23:33.219074" elapsed="0.004016"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:33.223268" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:33.223126" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:33.219047" elapsed="0.004300"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:23:33.223986" 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-04-17T03:23:33.223482" elapsed="0.000534"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:23:33.224065" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:23:33.214626" elapsed="0.009575"/>
</kw>
<msg time="2026-04-17T03:23:33.224258" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:33.198599" elapsed="0.025716"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>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-04-17T03:23:33.236318" 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-04-17T03:23:33.248745" elapsed="0.000093"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${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-04-17T03:23:33.261694" elapsed="0.000057"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:33.261996" 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-04-17T03:23:33.262187" 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-04-17T03:23:33.262754" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:33.262608" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:23:33.262590" 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-04-17T03:23:33.262992" 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-04-17T03:23:33.263155" 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-04-17T03:23:33.263316" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:23:33.262549" elapsed="0.000825"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:23:33.262403" elapsed="0.000999"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:33.263539" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:23:33.263622" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:23:33.263787" 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-04-17T03:23:33.192707" elapsed="0.071112"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:23:33.265585" 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-04-17T03:23:33.265258" elapsed="0.000417">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-04-17T03:23:33.265787" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:23:33.264782" elapsed="0.001037"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:33.266188" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:33.265899" elapsed="0.000350"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:23:33.266773" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:23:33.266440" elapsed="0.000362"/>
</kw>
<status status="PASS" start="2026-04-17T03:23:33.266275" elapsed="0.000565"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:33.265876" elapsed="0.000987"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:23:33.269191" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:23:33.267028" elapsed="0.002192"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:23:33.269274" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:23:33.269442" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:23:33.264382" elapsed="0.005087"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:23:33.270768" 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-04-17T03:23:33.270535" elapsed="0.000291"/>
</kw>
<msg time="2026-04-17T03:23:33.270943" 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-04-17T03:23:33.270191" elapsed="0.000780"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-04-17T03:23:33.271192" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:33.271047" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:33.271027" elapsed="0.000236"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:23:33.271578" 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-04-17T03:23:33.271798" 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-04-17T03:23:33.271399" elapsed="0.000427"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-04-17T03:23:33.272278" 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-04-17T03:23:33.272011" elapsed="0.000296"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-04-17T03:23:33.272368" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:23:33.272565" 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-04-17T03:23:33.269811" elapsed="0.002782"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:33.274210" 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-04-17T03:23:33.273878" elapsed="0.000384"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:33.274699" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:33.274443" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:23:33.280136" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:33.481523" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:33.884031" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:33.886552" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:23:33.277073" elapsed="0.615294">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:23:33.274813" elapsed="0.617919">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:23:33.893385" elapsed="0.000068"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:33.892842" elapsed="0.000758"/>
</branch>
<status status="FAIL" start="2026-04-17T03:23:33.274794" elapsed="0.618886">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:23:33.894704" elapsed="0.000064"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:23:33.895077" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:33.894977" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:23:33.894901" elapsed="0.000334"/>
</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-04-17T03:23:33.895587" elapsed="0.000075"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:23:33.895793" elapsed="0.000038"/>
</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-04-17T03:23:33.273012" elapsed="0.623110">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:23:33.896425" elapsed="0.000041"/>
</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-04-17T03:23:33.163018" elapsed="0.733734">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:23:33.897290" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:33.897015" elapsed="0.000349"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:23:33.896973" elapsed="0.000415"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:23:33.897421" elapsed="0.000015"/>
</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="FAIL" start="2026-04-17T03:23:33.154633" elapsed="0.742892">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verify empty flowspec data on neon</doc>
<status status="FAIL" start="2026-04-17T03:23:33.149464" elapsed="0.748182">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verify expected response.</doc>
<status status="FAIL" start="2026-04-17T03:23:33.148954" elapsed="0.748827">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:23:36.962112" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:23:36.961663" elapsed="0.000484"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:23:36.963139" 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-04-17T03:23:36.962653" elapsed="0.000565">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-04-17T03:23:36.963317" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:23:36.962316" elapsed="0.001026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:23:36.963907" 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-04-17T03:23:36.963496" elapsed="0.000499"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:23:36.964352" 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-04-17T03:23:36.964536" 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-04-17T03:23:36.964174" elapsed="0.000389"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:36.964986" 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-04-17T03:23:36.964709" elapsed="0.000325"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:36.966260" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:36.965793" elapsed="0.000544"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:23:36.966863" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:23:36.966505" elapsed="0.000383"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:36.967395" elapsed="0.000047"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:36.968036" 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-04-17T03:23:36.968358" elapsed="0.000047"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:23:36.967219" elapsed="0.001309"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:23:36.967046" elapsed="0.001547"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:23:36.968644" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:23:36.968819" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:23:36.965456" elapsed="0.003388"/>
</kw>
<status status="PASS" start="2026-04-17T03:23:36.965115" elapsed="0.003761"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:36.969058" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:36.968900" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:36.965090" elapsed="0.004045"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:23:36.969855" 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-04-17T03:23:36.969264" elapsed="0.000620"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:23:36.969947" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:23:36.960919" elapsed="0.009156"/>
</kw>
<msg time="2026-04-17T03:23:36.970145" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:36.946130" elapsed="0.024067"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>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-04-17T03:23:36.986387" elapsed="0.000081"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>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-04-17T03:23:36.997870" 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/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-04-17T03:23:37.009436" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:37.009679" 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-04-17T03:23:37.009865" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:37.010318" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:37.010171" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:23:37.010152" 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-04-17T03:23:37.010553" 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-04-17T03:23:37.010804" 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-04-17T03:23:37.011012" elapsed="0.000025"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:23:37.010109" elapsed="0.000964"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:23:37.009975" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:37.011241" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:23:37.011324" elapsed="0.000021"/>
</return>
<msg time="2026-04-17T03:23:37.011532" 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-04-17T03:23:36.940716" elapsed="0.070848"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:23:37.013021" 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-04-17T03:23:37.012695" elapsed="0.000406">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-04-17T03:23:37.013199" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:23:37.012283" elapsed="0.000941"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:37.013556" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:37.013298" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:23:37.014183" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:23:37.013803" elapsed="0.000407"/>
</kw>
<status status="PASS" start="2026-04-17T03:23:37.013639" elapsed="0.000608"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:37.013277" elapsed="0.000991"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:23:37.016483" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:23:37.014415" elapsed="0.002095"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:23:37.016563" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:23:37.016724" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:23:37.011904" elapsed="0.004845"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:23:37.017937" 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-04-17T03:23:37.017728" elapsed="0.000266"/>
</kw>
<msg time="2026-04-17T03:23:37.018080" 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-04-17T03:23:37.017404" elapsed="0.000700"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-04-17T03:23:37.018314" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:37.018174" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:37.018155" elapsed="0.000227"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:23:37.018681" 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-04-17T03:23:37.018838" 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-04-17T03:23:37.018513" elapsed="0.000351"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-04-17T03:23:37.019330" 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-04-17T03:23:37.019059" elapsed="0.000303"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-04-17T03:23:37.019420" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:23:37.019581" 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-04-17T03:23:37.017087" elapsed="0.002565"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:37.021091" 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-04-17T03:23:37.020814" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:37.021521" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:37.021277" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:23:37.027377" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:37.232375" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:37.634973" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:37.637659" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:23:37.023769" elapsed="0.619709">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:23:37.021631" elapsed="0.622002">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:23:37.644001" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:37.643697" elapsed="0.000405"/>
</branch>
<status status="FAIL" start="2026-04-17T03:23:37.021613" elapsed="0.622524">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:23:37.644904" elapsed="0.000084"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:23:37.645165" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:37.645106" elapsed="0.000125"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:23:37.645077" elapsed="0.000185"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:37.645458" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:23:37.645598" elapsed="0.000037"/>
</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-04-17T03:23:37.019986" elapsed="0.625820">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:23:37.645957" 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-04-17T03:23:36.915086" elapsed="0.731046">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:23:37.646702" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:37.646401" elapsed="0.000411"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:23:37.646363" elapsed="0.000484"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:23:37.646895" elapsed="0.000020"/>
</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="FAIL" start="2026-04-17T03:23:36.906042" elapsed="0.741028">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verify empty flowspec data on neon</doc>
<status status="FAIL" start="2026-04-17T03:23:36.899213" elapsed="0.748007">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verify expected response.</doc>
<status status="FAIL" start="2026-04-17T03:23:36.898392" elapsed="0.748954">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:23:40.708601" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:23:40.708132" elapsed="0.000515"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:23:40.709729" 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-04-17T03:23:40.709264" elapsed="0.000569">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-04-17T03:23:40.709988" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:23:40.708823" elapsed="0.001192"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:23:40.710621" 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-04-17T03:23:40.710178" elapsed="0.000471"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:23:40.710961" 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-04-17T03:23:40.711132" 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-04-17T03:23:40.710799" elapsed="0.000361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:40.711642" 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-04-17T03:23:40.711329" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:40.713540" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:40.712888" elapsed="0.000737"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:23:40.714315" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:23:40.713811" elapsed="0.000536"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:40.714867" elapsed="0.000054"/>
</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-04-17T03:23:40.715610" elapsed="0.000061"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:23:40.716131" elapsed="0.000085"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:23:40.714655" elapsed="0.001762"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:23:40.714429" elapsed="0.002081"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:23:40.716579" elapsed="0.000053"/>
</return>
<msg time="2026-04-17T03:23:40.716818" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:23:40.712381" elapsed="0.004469"/>
</kw>
<status status="PASS" start="2026-04-17T03:23:40.711806" elapsed="0.005085"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:40.717168" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:40.716964" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:40.711773" elapsed="0.005490"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:23:40.718067" 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-04-17T03:23:40.717409" elapsed="0.000691"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:23:40.718158" 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//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-04-17T03:23:40.707318" elapsed="0.010988"/>
</kw>
<msg time="2026-04-17T03:23:40.718369" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:40.693547" elapsed="0.024914"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>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-04-17T03:23:40.731422" 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/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-04-17T03:23:40.743847" elapsed="0.000050"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:23:40.756097" elapsed="0.000061"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:40.756413" 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-04-17T03:23:40.756615" 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-04-17T03:23:40.757235" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:40.756975" elapsed="0.000331"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:23:40.756912" elapsed="0.000423"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:40.757483" 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-04-17T03:23:40.757655" 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-04-17T03:23:40.757823" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:23:40.756849" elapsed="0.001143"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:23:40.756711" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:40.758173" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:23:40.758263" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:23:40.758442" 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-04-17T03:23:40.688208" elapsed="0.070268"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:23:40.760061" 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-04-17T03:23:40.759705" elapsed="0.000443">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-04-17T03:23:40.760261" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:23:40.759282" 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-04-17T03:23:40.760668" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:40.760378" elapsed="0.000357"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:23:40.761388" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:23:40.760966" elapsed="0.000452"/>
</kw>
<status status="PASS" start="2026-04-17T03:23:40.760763" elapsed="0.000695"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:40.760354" elapsed="0.001128"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:23:40.763805" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:23:40.761637" elapsed="0.002200"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:23:40.763900" elapsed="0.000063"/>
</return>
<msg time="2026-04-17T03:23:40.764118" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:23:40.758857" elapsed="0.005289"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:23:40.765544" 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-04-17T03:23:40.765316" elapsed="0.000292"/>
</kw>
<msg time="2026-04-17T03:23:40.765710" 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-04-17T03:23:40.764864" elapsed="0.000872"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-04-17T03:23:40.766007" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:40.765820" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:40.765797" elapsed="0.000286"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:23:40.766422" 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-04-17T03:23:40.766607" 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-04-17T03:23:40.766230" elapsed="0.000407"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-04-17T03:23:40.767103" 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-04-17T03:23:40.766798" elapsed="0.000336"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-04-17T03:23:40.767187" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:23:40.767372" 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-04-17T03:23:40.764495" elapsed="0.002904"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:40.768867" 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-04-17T03:23:40.768599" elapsed="0.000415"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:40.769406" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:40.769157" 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-04-17T03:23:40.775069" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:40.976635" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:41.379701" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:41.382463" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:23:40.771869" elapsed="0.615861">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:23:40.769520" elapsed="0.618471">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:23:41.388476" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:41.388093" elapsed="0.000542"/>
</branch>
<status status="FAIL" start="2026-04-17T03:23:40.769500" elapsed="0.619254">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:23:41.389696" elapsed="0.000043"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:23:41.390009" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:41.389884" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:23:41.389848" elapsed="0.000280"/>
</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-04-17T03:23:41.390324" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:23:41.390427" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:23:40.767737" elapsed="0.622863">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:23:41.390714" 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-04-17T03:23:40.664242" elapsed="0.726621">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:23:41.391297" elapsed="0.000108"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:41.391048" elapsed="0.000435"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:23:41.391021" elapsed="0.000500"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:23:41.391570" elapsed="0.000022"/>
</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="FAIL" start="2026-04-17T03:23:40.656244" elapsed="0.735476">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verify empty flowspec data on neon</doc>
<status status="FAIL" start="2026-04-17T03:23:40.648807" elapsed="0.743063">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verify expected response.</doc>
<status status="FAIL" start="2026-04-17T03:23:40.648091" elapsed="0.743947">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:23:44.447775" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:23:44.447311" elapsed="0.000501"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:23:44.448796" 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-04-17T03:23:44.448349" elapsed="0.000526">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-04-17T03:23:44.449005" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:23:44.447998" elapsed="0.001037"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:23:44.449626" 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-04-17T03:23:44.449208" elapsed="0.000447"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:23:44.449981" 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-04-17T03:23:44.450154" 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-04-17T03:23:44.449811" elapsed="0.000372"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:44.450612" 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-04-17T03:23:44.450337" elapsed="0.000325"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:44.452044" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:44.451528" elapsed="0.000583"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:23:44.452648" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:23:44.452266" 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-04-17T03:23:44.453124" elapsed="0.000051"/>
</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-04-17T03:23:44.453758" elapsed="0.000053"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:23:44.454157" elapsed="0.000047"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:23:44.452904" elapsed="0.001423"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:23:44.452731" elapsed="0.001665"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:23:44.454528" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:23:44.454719" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:23:44.451113" elapsed="0.003632"/>
</kw>
<status status="PASS" start="2026-04-17T03:23:44.450746" elapsed="0.004032"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:44.454959" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:44.454804" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:44.450720" elapsed="0.004331"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:23:44.455695" 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-04-17T03:23:44.455193" elapsed="0.000532"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:23:44.455778" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:23:44.446492" elapsed="0.009420"/>
</kw>
<msg time="2026-04-17T03:23:44.455990" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:44.433623" elapsed="0.022424"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>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-04-17T03:23:44.467847" 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/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-04-17T03:23:44.478969" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:44.489961" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:44.490167" 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-04-17T03:23:44.490447" 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-04-17T03:23:44.490848" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:44.490706" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:23:44.490689" 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-04-17T03:23:44.491131" 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-04-17T03:23:44.491366" 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-04-17T03:23:44.491531" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:23:44.490655" elapsed="0.000931"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:23:44.490539" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:44.491751" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:23:44.491908" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:23:44.492089" 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-04-17T03:23:44.429196" elapsed="0.062923"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:23:44.493540" 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-04-17T03:23:44.493237" elapsed="0.000409">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-04-17T03:23:44.493782" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:23:44.492822" 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-04-17T03:23:44.494251" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:44.493914" elapsed="0.000411"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:23:44.494887" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:23:44.494565" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-04-17T03:23:44.494358" elapsed="0.000612"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:44.493891" elapsed="0.001109"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:23:44.497401" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:23:44.495229" elapsed="0.002200"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:23:44.497483" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:23:44.497657" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:23:44.492460" elapsed="0.005224"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:23:44.498906" 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-04-17T03:23:44.498699" elapsed="0.000281"/>
</kw>
<msg time="2026-04-17T03:23:44.499073" 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-04-17T03:23:44.498361" elapsed="0.000738"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-04-17T03:23:44.499344" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:44.499172" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:44.499153" elapsed="0.000263"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:23:44.499742" 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-04-17T03:23:44.499908" 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-04-17T03:23:44.499554" elapsed="0.000404"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-04-17T03:23:44.500364" 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-04-17T03:23:44.500108" elapsed="0.000284"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-04-17T03:23:44.500439" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:23:44.500637" 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-04-17T03:23:44.498027" elapsed="0.002643"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:44.502153" 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-04-17T03:23:44.501866" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:44.502606" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:44.502347" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:23:44.507998" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:44.709291" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:45.112096" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:45.114695" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:23:44.504956" elapsed="0.614988">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:23:44.502773" elapsed="0.617288">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:23:45.120366" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:45.120110" elapsed="0.000334"/>
</branch>
<status status="FAIL" start="2026-04-17T03:23:44.502754" elapsed="0.617716">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:23:45.121001" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:23:45.121155" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:45.121111" elapsed="0.000093"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:23:45.121091" elapsed="0.000135"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:45.121369" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:23:45.121443" 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-04-17T03:23:44.501011" elapsed="0.620553">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:23:45.121646" 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-04-17T03:23:44.406547" elapsed="0.715207">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:23:45.122099" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:45.121858" elapsed="0.000371"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:23:45.121838" elapsed="0.000420"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:23:45.122294" elapsed="0.000015"/>
</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="FAIL" start="2026-04-17T03:23:44.400190" elapsed="0.722213">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verify empty flowspec data on neon</doc>
<status status="FAIL" start="2026-04-17T03:23:44.393849" elapsed="0.728664">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verify expected response.</doc>
<status status="FAIL" start="2026-04-17T03:23:44.392830" elapsed="0.729776">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:23:48.183845" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:23:48.183363" elapsed="0.000521"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:23:48.184905" 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-04-17T03:23:48.184432" elapsed="0.000584">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-04-17T03:23:48.185116" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:23:48.184073" elapsed="0.001069"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:23:48.185754" 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-04-17T03:23:48.185306" elapsed="0.000477"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:23:48.186100" 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-04-17T03:23:48.186266" 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-04-17T03:23:48.185953" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:48.186709" 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-04-17T03:23:48.186451" 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-04-17T03:23:48.188133" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:48.187608" elapsed="0.000589"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:23:48.188751" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:23:48.188365" elapsed="0.000414"/>
</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-04-17T03:23:48.189197" 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-04-17T03:23:48.189849" 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-04-17T03:23:48.190214" elapsed="0.000047"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:23:48.189019" elapsed="0.001370"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:23:48.188835" elapsed="0.001633"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:23:48.190523" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:23:48.190704" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:23:48.187222" elapsed="0.003508"/>
</kw>
<status status="PASS" start="2026-04-17T03:23:48.186836" elapsed="0.003926"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:48.191006" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:48.190845" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:48.186812" elapsed="0.004273"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:23:48.191704" 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-04-17T03:23:48.191217" elapsed="0.000517"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:23:48.191784" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:23:48.182657" elapsed="0.009257"/>
</kw>
<msg time="2026-04-17T03:23:48.191990" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:48.170838" elapsed="0.021207"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>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-04-17T03:23:48.204285" 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/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-04-17T03:23:48.215676" 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-04-17T03:23:48.227108" elapsed="0.000043"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:48.227362" 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-04-17T03:23:48.227575" 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-04-17T03:23:48.228039" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:48.227867" elapsed="0.000243"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:23:48.227848" elapsed="0.000296"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:48.228293" 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-04-17T03:23:48.228453" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:48.228606" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:23:48.227807" elapsed="0.000852"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:23:48.227672" elapsed="0.001014"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:48.228816" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:23:48.228898" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:23:48.229092" 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-04-17T03:23:48.166691" elapsed="0.062506"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:23:48.230743" 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-04-17T03:23:48.230435" elapsed="0.000385">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-04-17T03:23:48.230918" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:23:48.229993" elapsed="0.000967"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:48.231321" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:48.231036" elapsed="0.000346"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:23:48.231870" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:23:48.231568" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-17T03:23:48.231406" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:48.231018" elapsed="0.000953"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:23:48.234209" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:23:48.232113" elapsed="0.002125"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:23:48.234291" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:23:48.234457" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:23:48.229585" elapsed="0.004897"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:23:48.235662" 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-04-17T03:23:48.235465" elapsed="0.000251"/>
</kw>
<msg time="2026-04-17T03:23:48.235804" 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-04-17T03:23:48.235127" elapsed="0.000701"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-04-17T03:23:48.236054" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:48.235899" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:48.235881" elapsed="0.000241"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:23:48.236445" 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-04-17T03:23:48.236606" 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-04-17T03:23:48.236272" elapsed="0.000359"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-04-17T03:23:48.237041" 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-04-17T03:23:48.236775" elapsed="0.000292"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-04-17T03:23:48.237117" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:23:48.237291" 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-04-17T03:23:48.234788" elapsed="0.002530"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:48.238751" 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-04-17T03:23:48.238491" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:48.239200" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:48.238953" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:23:48.244580" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:48.446232" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:48.848975" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:48.851613" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:23:48.241493" elapsed="0.615780">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:23:48.239324" elapsed="0.618193">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:23:48.858164" elapsed="0.000083"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:48.857614" elapsed="0.000770"/>
</branch>
<status status="FAIL" start="2026-04-17T03:23:48.239306" elapsed="0.619160">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:23:48.859602" elapsed="0.000075"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:23:48.860005" elapsed="0.000053"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:48.859863" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:23:48.859819" elapsed="0.000421"/>
</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-04-17T03:23:48.860641" elapsed="0.000060"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:23:48.860821" elapsed="0.000037"/>
</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-04-17T03:23:48.237647" elapsed="0.623593">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:23:48.861481" elapsed="0.000046"/>
</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-04-17T03:23:48.136537" elapsed="0.725225">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:23:48.862080" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:48.861885" elapsed="0.000270"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:23:48.861866" elapsed="0.000314"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:23:48.862214" elapsed="0.000014"/>
</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="FAIL" start="2026-04-17T03:23:48.128643" elapsed="0.733675">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verify empty flowspec data on neon</doc>
<status status="FAIL" start="2026-04-17T03:23:48.123610" elapsed="0.738869">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verify expected response.</doc>
<status status="FAIL" start="2026-04-17T03:23:48.123143" elapsed="0.739428">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:23:51.920280" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:23:51.919811" elapsed="0.000505"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:23:51.921255" 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-04-17T03:23:51.920822" elapsed="0.000510">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-04-17T03:23:51.921430" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:23:51.920483" elapsed="0.000972"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:23:51.922027" 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-04-17T03:23:51.921611" elapsed="0.000444"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:23:51.922351" 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-04-17T03:23:51.922516" 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-04-17T03:23:51.922205" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:51.922961" 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-04-17T03:23:51.922689" 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-04-17T03:23:51.924325" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:51.923846" elapsed="0.000544"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:23:51.924906" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:23:51.924541" 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-04-17T03:23:51.925341" elapsed="0.000047"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:51.925976" 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-04-17T03:23:51.926304" elapsed="0.000046"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:23:51.925169" elapsed="0.001303"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:23:51.925003" elapsed="0.001537"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:23:51.926592" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:23:51.926769" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:23:51.923422" elapsed="0.003374"/>
</kw>
<status status="PASS" start="2026-04-17T03:23:51.923088" elapsed="0.003743"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:51.927023" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:51.926858" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:51.923064" elapsed="0.004038"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:23:51.927765" 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-04-17T03:23:51.927234" elapsed="0.000627"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:23:51.927915" 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/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-04-17T03:23:51.919090" elapsed="0.008973"/>
</kw>
<msg time="2026-04-17T03:23:51.928120" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:51.906889" elapsed="0.021284"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>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-04-17T03:23:51.941644" 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/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-04-17T03:23:51.952946" 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/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-04-17T03:23:51.964184" elapsed="0.000048"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:51.964445" 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-04-17T03:23:51.964621" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:51.965070" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:51.964912" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:23:51.964894" 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-04-17T03:23:51.965287" 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-04-17T03:23:51.965439" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:51.965589" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:23:51.964854" elapsed="0.000788"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:23:51.964710" elapsed="0.000960"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:51.965801" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:23:51.965880" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:23:51.966057" 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-04-17T03:23:51.902520" elapsed="0.063567"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:23:51.967735" 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-04-17T03:23:51.967382" elapsed="0.000436">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-04-17T03:23:51.967918" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:23:51.966957" 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-04-17T03:23:51.968325" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:51.968038" elapsed="0.000350"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:23:51.968886" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:23:51.968580" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-04-17T03:23:51.968414" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:51.968017" elapsed="0.000975"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:23:51.971287" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:23:51.969140" elapsed="0.002176"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:23:51.971376" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:23:51.971557" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:23:51.966560" elapsed="0.005023"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:23:51.972956" 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-04-17T03:23:51.972699" elapsed="0.000336"/>
</kw>
<msg time="2026-04-17T03:23:51.973148" 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-04-17T03:23:51.972322" elapsed="0.000853"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-04-17T03:23:51.973402" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:51.973253" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:51.973232" elapsed="0.000239"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:23:51.973780" 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-04-17T03:23:51.973967" 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-04-17T03:23:51.973609" elapsed="0.000385"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-04-17T03:23:51.974390" 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-04-17T03:23:51.974142" elapsed="0.000275"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-04-17T03:23:51.974465" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:23:51.974630" 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-04-17T03:23:51.971974" elapsed="0.002690"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:51.976258" 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-04-17T03:23:51.975985" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:51.976719" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:51.976467" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:23:51.982295" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:52.183990" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:52.586748" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:52.589772" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:23:51.979111" elapsed="0.613924">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:23:51.976837" elapsed="0.616347">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:23:52.593520" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:52.593245" elapsed="0.000372"/>
</branch>
<status status="FAIL" start="2026-04-17T03:23:51.976814" elapsed="0.616837">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:23:52.594254" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:23:52.594456" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:52.594399" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:23:52.594371" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:52.594737" elapsed="0.000035"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:23:52.594894" elapsed="0.000070"/>
</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-04-17T03:23:51.975051" elapsed="0.620081">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:23:52.595247" 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-04-17T03:23:51.881615" elapsed="0.713800">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:23:52.595917" elapsed="0.000090"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:52.595562" elapsed="0.000551"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:23:52.595531" elapsed="0.000620"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:23:52.596200" elapsed="0.000021"/>
</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="FAIL" start="2026-04-17T03:23:51.873229" elapsed="0.723120">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verify empty flowspec data on neon</doc>
<status status="FAIL" start="2026-04-17T03:23:51.864096" elapsed="0.732419">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verify expected response.</doc>
<status status="FAIL" start="2026-04-17T03:23:51.863233" elapsed="0.733528">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:23:55.655144" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:23:55.654662" elapsed="0.000518"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:23:55.656178" 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-04-17T03:23:55.655729" elapsed="0.000527">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-04-17T03:23:55.656355" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:23:55.655367" elapsed="0.001022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:23:55.656993" 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-04-17T03:23:55.656558" elapsed="0.000462"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:23:55.657340" 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-04-17T03:23:55.657510" 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-04-17T03:23:55.657183" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:55.658014" 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-04-17T03:23:55.657684" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:55.659320" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:55.658838" elapsed="0.000547"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:23:55.659912" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:23:55.659537" elapsed="0.000419"/>
</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-04-17T03:23:55.660358" elapsed="0.000047"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:55.661020" 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-04-17T03:23:55.661351" elapsed="0.000045"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:23:55.660184" elapsed="0.001333"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:23:55.660013" elapsed="0.001570"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:23:55.661635" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:23:55.661812" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:23:55.658489" elapsed="0.003349"/>
</kw>
<status status="PASS" start="2026-04-17T03:23:55.658143" elapsed="0.003749"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:55.662071" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:55.661919" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:55.658118" elapsed="0.004031"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:23:55.662751" 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-04-17T03:23:55.662279" elapsed="0.000501"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:23:55.662830" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:23:55.653834" elapsed="0.009139"/>
</kw>
<msg time="2026-04-17T03:23:55.663085" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:55.641994" elapsed="0.021145"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>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-04-17T03:23:55.674845" 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-04-17T03:23:55.686107" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//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-04-17T03:23:55.697291" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:55.697493" 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-04-17T03:23:55.697660" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:55.698078" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:55.697938" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:23:55.697907" 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-04-17T03:23:55.698291" 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-04-17T03:23:55.698443" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:55.698593" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:23:55.697870" elapsed="0.000776"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:23:55.697742" elapsed="0.000931"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:55.698803" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:23:55.698879" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:23:55.699038" 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-04-17T03:23:55.637709" elapsed="0.061357"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:23:55.700396" 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-04-17T03:23:55.700113" elapsed="0.000374">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-04-17T03:23:55.700584" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:23:55.699732" elapsed="0.000876"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:55.701011" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:55.700733" elapsed="0.000338"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:23:55.701569" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:23:55.701268" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-17T03:23:55.701096" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:55.700714" elapsed="0.000938"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:23:55.703897" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:23:55.701790" elapsed="0.002146"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:23:55.703990" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:23:55.704183" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:23:55.699385" elapsed="0.004824"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:23:55.705416" 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-04-17T03:23:55.705209" elapsed="0.000260"/>
</kw>
<msg time="2026-04-17T03:23:55.705565" 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-04-17T03:23:55.704840" elapsed="0.000749"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-04-17T03:23:55.705820" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:55.705673" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:55.705655" elapsed="0.000299"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:23:55.706259" 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-04-17T03:23:55.706412" 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-04-17T03:23:55.706090" elapsed="0.000346"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-04-17T03:23:55.706821" 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-04-17T03:23:55.706579" elapsed="0.000268"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-04-17T03:23:55.706894" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:23:55.707068" 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-04-17T03:23:55.704514" elapsed="0.002578"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:55.708531" 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-04-17T03:23:55.708274" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:55.708975" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:55.708715" 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-04-17T03:23:55.714761" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:55.916328" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:56.319326" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:56.328324" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:23:55.711592" elapsed="0.622266">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:23:55.709084" elapsed="0.625145">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:23:56.334733" elapsed="0.000075"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:56.334325" elapsed="0.000659"/>
</branch>
<status status="FAIL" start="2026-04-17T03:23:55.709066" elapsed="0.625988">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:23:56.335986" elapsed="0.000062"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:23:56.336299" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:56.336212" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:23:56.336172" elapsed="0.000273"/>
</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-04-17T03:23:56.336742" elapsed="0.000049"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:23:56.336899" elapsed="0.000059"/>
</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-04-17T03:23:55.707396" elapsed="0.629783">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:23:56.337351" elapsed="0.000035"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:23:55.616023" elapsed="0.721670">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:23:56.338139" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:56.337953" elapsed="0.000262"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:23:56.337902" elapsed="0.000338"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:23:56.338274" elapsed="0.000014"/>
</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="FAIL" start="2026-04-17T03:23:55.607632" elapsed="0.730747">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verify empty flowspec data on neon</doc>
<status status="FAIL" start="2026-04-17T03:23:55.598295" elapsed="0.740190">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verify expected response.</doc>
<status status="FAIL" start="2026-04-17T03:23:55.597404" elapsed="0.741172">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:23:59.393875" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:23:59.393466" elapsed="0.000541"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:23:59.394906" 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-04-17T03:23:59.394511" elapsed="0.000498">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-04-17T03:23:59.395114" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:23:59.394176" elapsed="0.000964"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:23:59.395758" 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-04-17T03:23:59.395310" elapsed="0.000476"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:23:59.396137" 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-04-17T03:23:59.396307" 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-04-17T03:23:59.395959" elapsed="0.000375"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:59.396738" 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-04-17T03:23:59.396485" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:59.397993" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:59.397529" elapsed="0.000527"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:23:59.398563" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:23:59.398204" elapsed="0.000385"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:59.398993" 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-04-17T03:23:59.399618" elapsed="0.000053"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:23:59.399981" elapsed="0.000048"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:23:59.398804" elapsed="0.001390"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:23:59.398643" elapsed="0.001623"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:23:59.400317" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:23:59.400497" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:23:59.397190" elapsed="0.003334"/>
</kw>
<status status="PASS" start="2026-04-17T03:23:59.396863" elapsed="0.003694"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:59.400719" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:59.400582" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:59.396839" elapsed="0.003960"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:23:59.401461" 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-04-17T03:23:59.400950" elapsed="0.000539"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:23:59.401539" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:23:59.392825" elapsed="0.008840"/>
</kw>
<msg time="2026-04-17T03:23:59.401721" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:23:59.381182" elapsed="0.020589"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>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-04-17T03:23:59.413498" elapsed="0.000044"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:23:59.424727" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//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-04-17T03:23:59.438383" elapsed="0.000041"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:59.438649" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:59.438857" 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-04-17T03:23:59.439336" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:59.439189" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:23:59.439171" 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-04-17T03:23:59.439558" 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-04-17T03:23:59.439717" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:59.439872" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:23:59.439128" elapsed="0.000814"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:23:59.438973" elapsed="0.001000"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:59.440173" elapsed="0.000024"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:23:59.440260" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:23:59.440419" 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-04-17T03:23:59.377050" elapsed="0.063400"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:23:59.441888" 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-04-17T03:23:59.441585" elapsed="0.000400">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-04-17T03:23:59.442092" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:23:59.441175" elapsed="0.000947"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:23:59.442615" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:23:59.442358" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:23:59.443281" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:23:59.442891" elapsed="0.000420"/>
</kw>
<status status="PASS" start="2026-04-17T03:23:59.442708" elapsed="0.000640"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:59.442340" elapsed="0.001030"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:23:59.445768" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:23:59.443522" elapsed="0.002274"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:23:59.445849" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:23:59.446130" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:23:59.440791" elapsed="0.005371"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:23:59.447394" 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-04-17T03:23:59.447186" elapsed="0.000264"/>
</kw>
<msg time="2026-04-17T03:23:59.447539" 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-04-17T03:23:59.446807" elapsed="0.000757"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-04-17T03:23:59.447777" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:23:59.447636" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-17T03:23:59.447617" elapsed="0.000229"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:23:59.448199" 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-04-17T03:23:59.448362" 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-04-17T03:23:59.447997" elapsed="0.000391"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-04-17T03:23:59.448780" 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-04-17T03:23:59.448536" elapsed="0.000270"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-04-17T03:23:59.448855" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:23:59.449034" 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-04-17T03:23:59.446468" elapsed="0.002592"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:59.450472" 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-04-17T03:23:59.450213" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:23:59.450902" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:23:59.450657" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:23:59.456190" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:59.658139" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:00.061119" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:00.063977" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:23:59.453177" elapsed="0.615893">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:23:59.451031" elapsed="0.618214">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:24:00.069674" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:00.069312" elapsed="0.000511"/>
</branch>
<status status="FAIL" start="2026-04-17T03:23:59.451012" elapsed="0.618858">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:24:00.070654" elapsed="0.000051"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:00.070906" elapsed="0.000060"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:00.070840" elapsed="0.000182"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:00.070808" elapsed="0.000249"/>
</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-04-17T03:24:00.071270" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:24:00.071379" elapsed="0.000024"/>
</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-04-17T03:23:59.449375" elapsed="0.622183">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:00.071709" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:23:59.356267" elapsed="0.715646">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:24:00.072395" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:00.072091" elapsed="0.000422"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:00.072062" elapsed="0.000489"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:00.072600" elapsed="0.000022"/>
</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="FAIL" start="2026-04-17T03:23:59.347602" elapsed="0.725152">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verify empty flowspec data on neon</doc>
<status status="FAIL" start="2026-04-17T03:23:59.340030" elapsed="0.732878">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verify expected response.</doc>
<status status="FAIL" start="2026-04-17T03:23:59.339227" elapsed="0.733837">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:24:03.124415" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:03.124001" elapsed="0.000448"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:24:03.125417" 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-04-17T03:24:03.124968" elapsed="0.000526">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-04-17T03:24:03.125593" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:24:03.124612" elapsed="0.001006"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:24:03.126205" 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-04-17T03:24:03.125773" elapsed="0.000566"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:24:03.126654" 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-04-17T03:24:03.126812" 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-04-17T03:24:03.126498" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:03.127320" 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-04-17T03:24:03.127020" elapsed="0.000347"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:03.128592" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:03.128126" elapsed="0.000530"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:24:03.129211" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:24:03.128809" elapsed="0.000430"/>
</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-04-17T03:24:03.129638" elapsed="0.000049"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:03.130386" elapsed="0.000055"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:24:03.130723" elapsed="0.000047"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:24:03.129462" elapsed="0.001433"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:24:03.129295" elapsed="0.001694"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:24:03.131041" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:24:03.131219" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:24:03.127747" elapsed="0.003498"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:03.127447" elapsed="0.003830"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:03.131437" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:03.131301" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:03.127422" elapsed="0.004092"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:24:03.132125" 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-04-17T03:24:03.131646" elapsed="0.000509"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:24:03.132205" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:24:03.123361" elapsed="0.008972"/>
</kw>
<msg time="2026-04-17T03:24:03.132389" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:03.111505" elapsed="0.020937"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>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-04-17T03:24:03.144020" 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-04-17T03:24:03.155597" 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/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-04-17T03:24:03.167291" elapsed="0.000055"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:03.167582" elapsed="0.000036"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:03.167798" 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-04-17T03:24:03.168241" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:03.168101" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:03.168083" 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-04-17T03:24:03.168452" 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-04-17T03:24:03.168604" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:03.168755" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:24:03.168044" elapsed="0.000764"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:24:03.167889" elapsed="0.000946"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:03.168985" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:03.169066" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:24:03.169231" 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-04-17T03:24:03.107341" elapsed="0.061918"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:24:03.170691" 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-04-17T03:24:03.170395" elapsed="0.000373">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-04-17T03:24:03.170861" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:24:03.169967" elapsed="0.000918"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:03.171226" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:03.170970" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:24:03.171763" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:03.171468" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:03.171308" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:03.170952" elapsed="0.000893"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:24:03.174095" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:24:03.172033" elapsed="0.002091"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:24:03.174176" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:24:03.174353" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:24:03.169609" elapsed="0.004769"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:24:03.175518" 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-04-17T03:24:03.175324" elapsed="0.000311"/>
</kw>
<msg time="2026-04-17T03:24:03.175724" 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-04-17T03:24:03.174999" elapsed="0.000749"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-04-17T03:24:03.175973" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:03.175819" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:03.175801" elapsed="0.000241"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:24:03.176342" 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-04-17T03:24:03.176496" 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-04-17T03:24:03.176174" elapsed="0.000347"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-04-17T03:24:03.176907" 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-04-17T03:24:03.176664" elapsed="0.000284"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-04-17T03:24:03.176996" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:24:03.177153" 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-04-17T03:24:03.174672" elapsed="0.002506"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:03.178581" 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-04-17T03:24:03.178328" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:03.179022" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:03.178765" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:24:03.184211" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:03.385679" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:03.788857" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:03.792229" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:24:03.181149" elapsed="0.616824">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:24:03.179130" elapsed="0.619112">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:24:03.798831" elapsed="0.000066"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:03.798336" elapsed="0.000753"/>
</branch>
<status status="FAIL" start="2026-04-17T03:24:03.179113" elapsed="0.620049">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:24:03.800212" elapsed="0.000068"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:03.800606" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:03.800493" elapsed="0.000333"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:03.800430" elapsed="0.000470"/>
</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-04-17T03:24:03.801285" elapsed="0.000055"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:24:03.801460" elapsed="0.000036"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:24:03.177480" elapsed="0.624251">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:03.801923" elapsed="0.000401"/>
</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-04-17T03:24:03.086718" elapsed="0.716106">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:24:03.803388" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:03.803182" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:03.803139" elapsed="0.000349"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:03.803526" elapsed="0.000015"/>
</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="FAIL" start="2026-04-17T03:24:03.079557" elapsed="0.724075">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verify empty flowspec data on neon</doc>
<status status="FAIL" start="2026-04-17T03:24:03.074073" elapsed="0.729671">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verify expected response.</doc>
<status status="FAIL" start="2026-04-17T03:24:03.073572" elapsed="0.730263">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:24:06.863902" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:06.863344" elapsed="0.000619"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:24:06.865128" 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-04-17T03:24:06.864650" elapsed="0.000562">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-04-17T03:24:06.865318" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:24:06.864176" elapsed="0.001170"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:24:06.865988" 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-04-17T03:24:06.865518" elapsed="0.000502"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:24:06.866379" 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-04-17T03:24:06.866671" 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-04-17T03:24:06.866206" elapsed="0.000499"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:06.867220" 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-04-17T03:24:06.866892" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:06.868791" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:06.868228" elapsed="0.000642"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:24:06.869552" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:24:06.869076" 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-04-17T03:24:06.870103" elapsed="0.000056"/>
</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-04-17T03:24:06.870859" elapsed="0.000060"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:24:06.871276" elapsed="0.000058"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:24:06.869850" elapsed="0.001631"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:24:06.869651" elapsed="0.001913"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:24:06.871626" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:24:06.871838" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:24:06.867791" elapsed="0.004078"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:06.867376" elapsed="0.004531"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:06.872126" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:06.871958" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:06.867347" elapsed="0.004871"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:24:06.873019" 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-04-17T03:24:06.872381" elapsed="0.000673"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:24:06.873111" 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//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-04-17T03:24:06.862364" elapsed="0.010902"/>
</kw>
<msg time="2026-04-17T03:24:06.873355" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:06.847798" elapsed="0.025637"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:24:06.890612" 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/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-04-17T03:24:06.904912" elapsed="0.000089"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${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-04-17T03:24:06.918905" elapsed="0.000087"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:06.919404" 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-04-17T03:24:06.919621" 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-04-17T03:24:06.920154" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:06.919977" elapsed="0.000247"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:06.919955" elapsed="0.000299"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:06.920419" 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-04-17T03:24:06.920697" 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-04-17T03:24:06.920884" elapsed="0.000025"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:24:06.919891" elapsed="0.001076"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:24:06.919727" elapsed="0.001274"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:06.921167" elapsed="0.000027"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:06.921267" elapsed="0.000021"/>
</return>
<msg time="2026-04-17T03:24:06.921460" 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-04-17T03:24:06.842771" elapsed="0.078724"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:24:06.923250" 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-04-17T03:24:06.922849" elapsed="0.000493">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-04-17T03:24:06.923457" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:24:06.922377" elapsed="0.001111"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:06.923882" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:06.923575" elapsed="0.000397"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:24:06.924608" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:06.924223" elapsed="0.000418"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:06.924005" elapsed="0.000678"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:06.923552" elapsed="0.001158"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:24:06.927496" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:24:06.924884" elapsed="0.002646"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:24:06.927596" elapsed="0.000045"/>
</return>
<msg time="2026-04-17T03:24:06.927801" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:24:06.921943" elapsed="0.005889"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:24:06.929350" 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-04-17T03:24:06.929100" elapsed="0.000319"/>
</kw>
<msg time="2026-04-17T03:24:06.929525" 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-04-17T03:24:06.928662" elapsed="0.000894"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-04-17T03:24:06.929815" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:06.929647" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:06.929623" elapsed="0.000375"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:24:06.930387" 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-04-17T03:24:06.930574" 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-04-17T03:24:06.930179" elapsed="0.000425"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-04-17T03:24:06.931099" 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-04-17T03:24:06.930785" elapsed="0.000344"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-04-17T03:24:06.931186" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:24:06.931383" 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-04-17T03:24:06.928236" elapsed="0.003178"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:06.933194" 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-04-17T03:24:06.932858" elapsed="0.000394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:06.933720" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:06.933426" elapsed="0.000348"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:24:06.940341" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:07.142040" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:07.545210" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:07.548141" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:24:06.936714" elapsed="0.617137">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:24:06.933855" elapsed="0.620249">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:24:07.554645" elapsed="0.000073"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:07.554208" elapsed="0.000611"/>
</branch>
<status status="FAIL" start="2026-04-17T03:24:06.933832" elapsed="0.621059">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:24:07.555892" elapsed="0.000107"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:07.556422" elapsed="0.000043"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:07.556307" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:07.556181" elapsed="0.000405"/>
</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-04-17T03:24:07.556894" elapsed="0.000082"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:24:07.557089" elapsed="0.000036"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:24:06.931796" elapsed="0.625545">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:07.557510" 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-04-17T03:24:06.817155" elapsed="0.740465">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:24:07.557944" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:07.557720" elapsed="0.000317"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:07.557703" elapsed="0.000359"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:07.558096" elapsed="0.000016"/>
</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="FAIL" start="2026-04-17T03:24:06.809921" elapsed="0.748280">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verify empty flowspec data on neon</doc>
<status status="FAIL" start="2026-04-17T03:24:06.804891" elapsed="0.753427">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verify expected response.</doc>
<status status="FAIL" start="2026-04-17T03:24:06.804388" elapsed="0.754035">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:24:10.613605" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:10.613164" elapsed="0.000475"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:24:10.614581" 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-04-17T03:24:10.614166" elapsed="0.000493">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-04-17T03:24:10.614816" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:24:10.613805" elapsed="0.001038"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:24:10.615428" 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-04-17T03:24:10.615026" elapsed="0.000432"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:24:10.615829" 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-04-17T03:24:10.616048" 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-04-17T03:24:10.615636" elapsed="0.000448"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:10.616535" 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-04-17T03:24:10.616268" elapsed="0.000380"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:10.618051" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:10.617508" elapsed="0.000609"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:24:10.618648" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:24:10.618270" elapsed="0.000405"/>
</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-04-17T03:24:10.619127" elapsed="0.000047"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:10.619776" 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-04-17T03:24:10.620143" elapsed="0.000045"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:24:10.618947" elapsed="0.001364"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:24:10.618731" elapsed="0.001646"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:24:10.620431" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:24:10.620620" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:24:10.617133" elapsed="0.003513"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:10.616732" elapsed="0.003947"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:10.620845" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:10.620707" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:10.616706" elapsed="0.004216"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:24:10.621609" 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-04-17T03:24:10.621075" elapsed="0.000563"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:24:10.621687" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:24:10.612400" elapsed="0.009417"/>
</kw>
<msg time="2026-04-17T03:24:10.621876" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:10.600601" elapsed="0.021354"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>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-04-17T03:24:10.634258" elapsed="0.000063"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:24:10.646354" elapsed="0.000062"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:24:10.658574" elapsed="0.000055"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:10.658904" elapsed="0.000044"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:10.659125" 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-04-17T03:24:10.659808" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:10.659616" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:10.659597" 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-04-17T03:24:10.660145" 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-04-17T03:24:10.660355" 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-04-17T03:24:10.660519" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:24:10.659554" elapsed="0.001020"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:24:10.659382" elapsed="0.001220"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:10.660737" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:10.660818" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:24:10.661009" 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-04-17T03:24:10.595591" elapsed="0.065452"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:24:10.662528" 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-04-17T03:24:10.662225" elapsed="0.000380">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-04-17T03:24:10.662702" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:24:10.661801" 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-04-17T03:24:10.663163" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:10.662879" elapsed="0.000342"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:24:10.663715" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:10.663407" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:10.663247" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:10.662859" elapsed="0.000938"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:24:10.665980" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:24:10.663951" elapsed="0.002056"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:24:10.666060" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:24:10.666227" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:24:10.661446" elapsed="0.004806"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:24:10.667475" 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-04-17T03:24:10.667274" elapsed="0.000255"/>
</kw>
<msg time="2026-04-17T03:24:10.667614" 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-04-17T03:24:10.666944" elapsed="0.000694"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-04-17T03:24:10.667845" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:10.667708" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:10.667690" elapsed="0.000221"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:24:10.668223" 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-04-17T03:24:10.668438" 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-04-17T03:24:10.668057" elapsed="0.000407"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-04-17T03:24:10.668850" 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-04-17T03:24:10.668607" elapsed="0.000269"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-04-17T03:24:10.668938" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:24:10.669101" 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-04-17T03:24:10.666563" elapsed="0.002563"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:10.670523" 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-04-17T03:24:10.670271" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:10.670982" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:10.670708" elapsed="0.000318"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:24:10.676300" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:10.877997" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:11.280644" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:11.283110" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:24:10.673190" elapsed="0.612771">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:24:10.671092" elapsed="0.615002">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:24:11.286453" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:11.286151" elapsed="0.000394"/>
</branch>
<status status="FAIL" start="2026-04-17T03:24:10.671074" elapsed="0.615504">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:24:11.287160" elapsed="0.000034"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:11.287344" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:11.287291" elapsed="0.000111"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:11.287266" elapsed="0.000163"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:11.287602" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:24:11.287690" 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-04-17T03:24:10.669438" elapsed="0.618398">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:11.288017" 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-04-17T03:24:10.572870" elapsed="0.715280">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:24:11.288488" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:11.288272" elapsed="0.000308"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:11.288250" elapsed="0.000360"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:11.288653" elapsed="0.000019"/>
</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="FAIL" start="2026-04-17T03:24:10.564767" elapsed="0.724018">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verify empty flowspec data on neon</doc>
<status status="FAIL" start="2026-04-17T03:24:10.559539" elapsed="0.729384">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verify expected response.</doc>
<status status="FAIL" start="2026-04-17T03:24:10.559035" elapsed="0.730028">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:24:14.348818" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:14.348310" elapsed="0.000554"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:24:14.349950" 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-04-17T03:24:14.349508" elapsed="0.000522">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-04-17T03:24:14.350132" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:24:14.349105" elapsed="0.001054"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:24:14.350749" 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-04-17T03:24:14.350320" elapsed="0.000457"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:24:14.351101" 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-04-17T03:24:14.351274" 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-04-17T03:24:14.350948" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:14.351720" 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-04-17T03:24:14.351450" 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-04-17T03:24:14.353240" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:14.352686" elapsed="0.000627"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:24:14.353965" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:24:14.353518" elapsed="0.000476"/>
</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-04-17T03:24:14.354476" elapsed="0.000048"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:14.355139" elapsed="0.000055"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:24:14.355475" elapsed="0.000048"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:24:14.354296" elapsed="0.001353"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:24:14.354120" elapsed="0.001598"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:24:14.355772" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:24:14.355976" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:24:14.352285" elapsed="0.003719"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:14.351885" elapsed="0.004155"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:14.356208" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:14.356067" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:14.351856" elapsed="0.004431"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:24:14.356908" 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-04-17T03:24:14.356422" elapsed="0.000547"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:24:14.357024" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:24:14.347524" elapsed="0.009632"/>
</kw>
<msg time="2026-04-17T03:24:14.357215" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:14.335179" elapsed="0.022091"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>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-04-17T03:24:14.369589" 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/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-04-17T03:24:14.381528" 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/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-04-17T03:24:14.392863" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:14.393098" 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-04-17T03:24:14.393271" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:14.393695" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:14.393548" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:14.393523" 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-04-17T03:24:14.393954" 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-04-17T03:24:14.394195" 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-04-17T03:24:14.394355" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:24:14.393479" elapsed="0.000932"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:24:14.393358" elapsed="0.001082"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:14.394577" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:14.394659" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:24:14.394824" 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-04-17T03:24:14.330691" elapsed="0.064162"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:24:14.396315" 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-04-17T03:24:14.396014" elapsed="0.000380">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-04-17T03:24:14.396491" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:24:14.395603" elapsed="0.000912"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:14.396841" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:14.396587" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:24:14.397455" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:14.397156" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:14.396985" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:14.396568" elapsed="0.000971"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:24:14.399719" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:24:14.397678" elapsed="0.002068"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:24:14.399799" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:24:14.399975" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:24:14.395200" elapsed="0.004802"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:24:14.401164" 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-04-17T03:24:14.400967" elapsed="0.000250"/>
</kw>
<msg time="2026-04-17T03:24:14.401302" 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-04-17T03:24:14.400614" elapsed="0.000712"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-04-17T03:24:14.401533" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:14.401396" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:14.401378" elapsed="0.000224"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:24:14.401898" 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-04-17T03:24:14.402072" 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-04-17T03:24:14.401732" elapsed="0.000364"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-04-17T03:24:14.402481" 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-04-17T03:24:14.402239" elapsed="0.000267"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-04-17T03:24:14.402553" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:24:14.402706" 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-04-17T03:24:14.400298" elapsed="0.002472"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:14.404185" 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-04-17T03:24:14.403913" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:14.404653" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:14.404374" elapsed="0.000330"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:24:14.409813" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:14.611521" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:15.014004" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:15.017041" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:24:14.406902" elapsed="0.616121">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:24:14.404774" elapsed="0.618546">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:24:15.023867" elapsed="0.000058"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:15.023439" elapsed="0.000663"/>
</branch>
<status status="FAIL" start="2026-04-17T03:24:14.404755" elapsed="0.619440">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:24:15.025334" elapsed="0.000068"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:15.025644" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:15.025580" elapsed="0.000111"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:15.025535" 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-04-17T03:24:15.025856" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:24:15.025945" 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-04-17T03:24:14.403090" elapsed="0.622983">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:15.026164" 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-04-17T03:24:14.308437" elapsed="0.717836">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:24:15.026624" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:15.026440" elapsed="0.000260"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:15.026421" elapsed="0.000305"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:15.026761" elapsed="0.000016"/>
</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="FAIL" start="2026-04-17T03:24:14.299292" elapsed="0.727579">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verify empty flowspec data on neon</doc>
<status status="FAIL" start="2026-04-17T03:24:14.290468" elapsed="0.736529">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verify expected response.</doc>
<status status="FAIL" start="2026-04-17T03:24:14.289700" elapsed="0.737395">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:24:18.087512" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:18.087004" elapsed="0.000545"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:24:18.088600" 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-04-17T03:24:18.088130" elapsed="0.000553">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-04-17T03:24:18.088784" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:24:18.087719" elapsed="0.001090"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:24:18.089489" 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-04-17T03:24:18.089021" elapsed="0.000497"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:24:18.089819" 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-04-17T03:24:18.090027" 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-04-17T03:24:18.089671" elapsed="0.000393"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:18.090481" 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-04-17T03:24:18.090225" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:18.091898" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:18.091433" elapsed="0.000552"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:24:18.092560" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:24:18.092137" 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-04-17T03:24:18.093028" elapsed="0.000048"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:18.093707" 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-04-17T03:24:18.094122" elapsed="0.000047"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:24:18.092829" elapsed="0.001466"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:24:18.092653" elapsed="0.001709"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:24:18.094415" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:24:18.094638" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:24:18.091030" elapsed="0.003642"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:18.090614" elapsed="0.004094"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:18.094874" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:18.094735" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:18.090587" elapsed="0.004398"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:24:18.095619" 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-04-17T03:24:18.095121" elapsed="0.000532"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:24:18.095720" 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/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-04-17T03:24:18.086105" elapsed="0.009783"/>
</kw>
<msg time="2026-04-17T03:24:18.095982" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:18.073112" elapsed="0.022940"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>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-04-17T03:24:18.108306" elapsed="0.000033"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//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-04-17T03:24:18.120158" elapsed="0.000037"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:18.132658" elapsed="0.000040"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:18.132900" 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-04-17T03:24:18.133118" 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-04-17T03:24:18.133604" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:18.133440" elapsed="0.000237"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:18.133420" elapsed="0.000292"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:18.133879" 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-04-17T03:24:18.134114" 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-04-17T03:24:18.134324" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:24:18.133364" elapsed="0.001099"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:24:18.133207" elapsed="0.001301"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:18.134692" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:18.134781" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:24:18.134957" 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-04-17T03:24:18.068243" elapsed="0.066744"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:24:18.136574" 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-04-17T03:24:18.136274" elapsed="0.000378">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-04-17T03:24:18.136747" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:24:18.135806" elapsed="0.000965"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:18.137106" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:18.136841" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:24:18.137644" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:18.137347" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:18.137187" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:18.136823" elapsed="0.000903"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:24:18.139876" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:24:18.137860" elapsed="0.002043"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:24:18.139969" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:24:18.140130" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:24:18.135449" elapsed="0.004706"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:24:18.141303" 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-04-17T03:24:18.141106" elapsed="0.000250"/>
</kw>
<msg time="2026-04-17T03:24:18.141440" 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-04-17T03:24:18.140767" elapsed="0.000697"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-04-17T03:24:18.141670" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:18.141533" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:18.141515" elapsed="0.000220"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:24:18.142046" 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-04-17T03:24:18.142207" 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-04-17T03:24:18.141863" elapsed="0.000369"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-04-17T03:24:18.142613" 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-04-17T03:24:18.142372" elapsed="0.000267"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-04-17T03:24:18.142684" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:24:18.142839" 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-04-17T03:24:18.140452" elapsed="0.002411"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:18.144283" 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-04-17T03:24:18.144019" elapsed="0.000361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:18.144767" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:18.144519" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:24:18.152068" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:18.353479" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:18.756137" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:18.759309" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:24:18.146923" elapsed="0.617733">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:24:18.144876" elapsed="0.619942">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:24:18.765198" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:18.764883" elapsed="0.000418"/>
</branch>
<status status="FAIL" start="2026-04-17T03:24:18.144858" elapsed="0.620479">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:24:18.766102" elapsed="0.000051"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:18.766358" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:18.766298" elapsed="0.000127"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:18.766262" elapsed="0.000195"/>
</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-04-17T03:24:18.766656" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:24:18.766760" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:24:18.143196" elapsed="0.623833">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:18.767165" 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-04-17T03:24:18.042973" elapsed="0.724346">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:24:18.767711" elapsed="0.000101"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:18.767459" elapsed="0.000455"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:18.767434" elapsed="0.000568"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:18.768068" elapsed="0.000023"/>
</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="FAIL" start="2026-04-17T03:24:18.036714" elapsed="0.731513">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verify empty flowspec data on neon</doc>
<status status="FAIL" start="2026-04-17T03:24:18.028758" elapsed="0.739646">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verify expected response.</doc>
<status status="FAIL" start="2026-04-17T03:24:18.027804" elapsed="0.740764">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:24:21.826180" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:21.825703" elapsed="0.000513"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:24:21.827157" 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-04-17T03:24:21.826712" elapsed="0.000524">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-04-17T03:24:21.827335" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:24:21.826380" elapsed="0.000983"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:24:21.827916" 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-04-17T03:24:21.827521" elapsed="0.000440"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:24:21.828254" 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-04-17T03:24:21.828412" 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-04-17T03:24:21.828111" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:21.828833" 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-04-17T03:24:21.828583" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:21.830115" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:21.829649" elapsed="0.000528"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:24:21.830688" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:24:21.830326" elapsed="0.000388"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:21.831118" 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-04-17T03:24:21.831727" 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-04-17T03:24:21.832065" elapsed="0.000045"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:24:21.830944" elapsed="0.001286"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:24:21.830766" elapsed="0.001530"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:24:21.832403" elapsed="0.000049"/>
</return>
<msg time="2026-04-17T03:24:21.832646" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:24:21.829297" elapsed="0.003377"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:21.828987" elapsed="0.003721"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:21.832877" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:21.832733" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:21.828962" elapsed="0.004026"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:24:21.833608" 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-04-17T03:24:21.833123" elapsed="0.000514"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:24:21.833686" 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/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-04-17T03:24:21.825035" elapsed="0.008805"/>
</kw>
<msg time="2026-04-17T03:24:21.833896" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:21.813343" elapsed="0.020632"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>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-04-17T03:24:21.848334" 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/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-04-17T03:24:21.861344" 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/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-04-17T03:24:21.873115" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:21.873340" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:21.873542" 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-04-17T03:24:21.874284" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:21.873871" elapsed="0.000494"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:21.873838" elapsed="0.000562"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:21.874572" 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-04-17T03:24:21.874762" 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-04-17T03:24:21.875002" elapsed="0.000025"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:24:21.873775" elapsed="0.001289"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:24:21.873632" elapsed="0.001462"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:21.875230" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:21.875390" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:24:21.875555" 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-04-17T03:24:21.809250" elapsed="0.066334"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:24:21.877208" 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-04-17T03:24:21.876811" elapsed="0.000487">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-04-17T03:24:21.877445" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:24:21.876330" elapsed="0.001143"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:21.877803" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:21.877546" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:24:21.878522" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:21.878216" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:21.877885" elapsed="0.000712"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:21.877527" elapsed="0.001101"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:24:21.880976" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:24:21.878795" elapsed="0.002210"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:24:21.881059" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:24:21.881224" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:24:21.875967" elapsed="0.005283"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:24:21.882436" 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-04-17T03:24:21.882237" elapsed="0.000255"/>
</kw>
<msg time="2026-04-17T03:24:21.882578" 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-04-17T03:24:21.881892" elapsed="0.000710"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-04-17T03:24:21.882863" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:21.882673" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:21.882654" elapsed="0.000299"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:24:21.883301" 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-04-17T03:24:21.883500" 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-04-17T03:24:21.883089" elapsed="0.000446"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-04-17T03:24:21.883989" 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-04-17T03:24:21.883717" elapsed="0.000300"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-04-17T03:24:21.884064" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:24:21.884223" 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-04-17T03:24:21.881572" elapsed="0.002676"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:21.885716" 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-04-17T03:24:21.885457" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:21.886213" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:21.885905" elapsed="0.000356"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:24:21.891862" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:22.093530" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:22.496061" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:22.499162" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:24:21.888477" elapsed="0.617205">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:24:21.886376" elapsed="0.619511">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:24:22.506392" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:22.506010" elapsed="0.000514"/>
</branch>
<status status="FAIL" start="2026-04-17T03:24:21.886356" elapsed="0.620206">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:24:22.507281" elapsed="0.000055"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:22.507575" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:22.507493" elapsed="0.000175"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:22.507451" elapsed="0.000261"/>
</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-04-17T03:24:22.507951" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:24:22.508055" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:24:21.884592" elapsed="0.623632">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:22.508335" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:24:21.788398" elapsed="0.720079">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:24:22.509001" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:22.508642" elapsed="0.000608"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:22.508608" elapsed="0.000697"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:22.509374" elapsed="0.000030"/>
</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="FAIL" start="2026-04-17T03:24:21.779244" elapsed="0.730332">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verify empty flowspec data on neon</doc>
<status status="FAIL" start="2026-04-17T03:24:21.769827" elapsed="0.739961">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verify expected response.</doc>
<status status="FAIL" start="2026-04-17T03:24:21.769226" elapsed="0.740769">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:24:25.569495" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:25.569044" elapsed="0.000486"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:24:25.570495" 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-04-17T03:24:25.570056" elapsed="0.000520">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-04-17T03:24:25.570693" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:24:25.569698" elapsed="0.001022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:24:25.571355" 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-04-17T03:24:25.570881" elapsed="0.000504"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:24:25.571751" 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-04-17T03:24:25.571945" 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-04-17T03:24:25.571562" elapsed="0.000413"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:25.572394" 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-04-17T03:24:25.572131" 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-04-17T03:24:25.573805" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:25.573326" elapsed="0.000545"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:24:25.574459" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:24:25.574041" elapsed="0.000446"/>
</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-04-17T03:24:25.574913" elapsed="0.000095"/>
</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-04-17T03:24:25.575664" elapsed="0.000059"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:24:25.576057" elapsed="0.000049"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:24:25.574722" elapsed="0.001510"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:24:25.574544" elapsed="0.001756"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:24:25.576354" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:24:25.576545" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:24:25.572889" elapsed="0.003682"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:25.572527" elapsed="0.004078"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:25.576837" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:25.576693" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:25.572501" elapsed="0.004417"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:24:25.577565" 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-04-17T03:24:25.577073" elapsed="0.000521"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:24:25.577646" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:24:25.568267" elapsed="0.009518"/>
</kw>
<msg time="2026-04-17T03:24:25.577857" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:25.553821" elapsed="0.024098"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>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-04-17T03:24:25.590042" 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/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-04-17T03:24:25.601512" 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/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-04-17T03:24:25.612758" elapsed="0.000037"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:25.613010" 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-04-17T03:24:25.613191" elapsed="0.000038"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:25.613657" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:25.613491" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:25.613472" elapsed="0.000276"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:25.613902" elapsed="0.000041"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:25.614089" 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-04-17T03:24:25.614245" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:24:25.613431" elapsed="0.000868"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:24:25.613297" elapsed="0.001032"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:25.614475" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:25.614558" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:24:25.614729" 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-04-17T03:24:25.549615" elapsed="0.065214"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:24:25.616395" 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-04-17T03:24:25.616083" elapsed="0.000395">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-04-17T03:24:25.616582" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:24:25.615624" 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-04-17T03:24:25.616965" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:25.616685" elapsed="0.000343"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:24:25.617537" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:25.617222" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:25.617054" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:25.616664" elapsed="0.000957"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:24:25.619872" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:24:25.617764" elapsed="0.002137"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:24:25.619978" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:24:25.620142" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:24:25.615200" elapsed="0.004967"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:24:25.621324" 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-04-17T03:24:25.621127" elapsed="0.000251"/>
</kw>
<msg time="2026-04-17T03:24:25.621462" 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-04-17T03:24:25.620785" elapsed="0.000701"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-04-17T03:24:25.621691" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:25.621554" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:25.621537" elapsed="0.000219"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:24:25.622069" 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-04-17T03:24:25.622226" 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-04-17T03:24:25.621886" elapsed="0.000366"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-04-17T03:24:25.622645" 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-04-17T03:24:25.622402" elapsed="0.000268"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-04-17T03:24:25.622717" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:24:25.622874" 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-04-17T03:24:25.620466" elapsed="0.002433"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:25.624329" 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-04-17T03:24:25.624072" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:25.624752" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:25.624511" 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-04-17T03:24:25.629904" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:25.831734" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:26.234729" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:26.237463" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:24:25.627013" elapsed="0.615744">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:24:25.624862" elapsed="0.618155">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:24:26.243679" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:26.243112" elapsed="0.000734"/>
</branch>
<status status="FAIL" start="2026-04-17T03:24:25.624843" elapsed="0.619058">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:24:26.244502" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:26.244656" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:26.244612" elapsed="0.000090"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:26.244591" elapsed="0.000132"/>
</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-04-17T03:24:26.244862" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:24:26.244953" 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-04-17T03:24:25.623219" elapsed="0.621863">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:26.245162" 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-04-17T03:24:25.526716" elapsed="0.718551">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:24:26.245541" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:26.245366" elapsed="0.000249"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:26.245348" elapsed="0.000291"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:26.245700" elapsed="0.000025"/>
</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="FAIL" start="2026-04-17T03:24:25.520670" elapsed="0.725168">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verify empty flowspec data on neon</doc>
<status status="FAIL" start="2026-04-17T03:24:25.511614" elapsed="0.734430">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verify expected response.</doc>
<status status="FAIL" start="2026-04-17T03:24:25.510720" elapsed="0.735430">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:24:26.246267" level="FAIL">Keyword 'Verify_Empty_Flowspec_Data' failed after retrying for 1 minute. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-17T03:23:25.688862" elapsed="60.557518">Keyword 'Verify_Empty_Flowspec_Data' failed after retrying for 1 minute. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Sanity check bgp-flowspec:flowspec-routes is up but empty.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:23:25.687253" elapsed="60.559329">Keyword 'Verify_Empty_Flowspec_Data' failed after retrying for 1 minute. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s10-t2" name="Reconfigure_ODL_To_Accept_Connection" line="46">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:24:26.248439" level="INFO">&amp;{mapping} = { IP=10.30.171.238 | 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-04-17T03:24:26.247646" elapsed="0.000832"/>
</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-04-17T03:24:26.285856" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:26.285436" elapsed="0.000457"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:24:26.286899" 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-04-17T03:24:26.286613" elapsed="0.000389">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-04-17T03:24:26.287105" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:24:26.286119" elapsed="0.001012"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:24:26.287712" 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-04-17T03:24:26.287306" elapsed="0.000435"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:24:26.288059" 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-04-17T03:24:26.288243" 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-04-17T03:24:26.287894" elapsed="0.000376"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:26.288673" 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-04-17T03:24:26.288416" 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-04-17T03:24:26.289727" level="INFO">mapping: {'IP': '10.30.171.238', '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-04-17T03:24:26.289459" elapsed="0.000396"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:24:26.290423" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:24:26.290054" elapsed="0.000404"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:24:26.291416" level="INFO">${value} = 10.30.171.238</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:24:26.290969" elapsed="0.000484"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:24:26.292434" level="INFO">${encoded} = 10.30.171.238</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:24:26.292136" elapsed="0.000335"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:24:26.292546" elapsed="0.000051"/>
</return>
<msg time="2026-04-17T03:24:26.292770" level="INFO">${encoded_value} = 10.30.171.238</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:24:26.291705" elapsed="0.001098"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:24:26.293008" elapsed="0.000313"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.238</var>
<status status="PASS" start="2026-04-17T03:24:26.290776" elapsed="0.002597"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:24:26.294080" 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-04-17T03:24:26.293671" elapsed="0.000441"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:24:26.295048" 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-04-17T03:24:26.294731" elapsed="0.000353"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:24:26.295150" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:24:26.295538" 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-04-17T03:24:26.294338" 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-04-17T03:24:26.295782" elapsed="0.000360"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:24:26.293515" elapsed="0.002684"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:24:26.297281" 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-04-17T03:24:26.296527" elapsed="0.000791"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:24:26.298314" 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-04-17T03:24:26.298017" elapsed="0.000334"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:24:26.298420" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:24:26.298630" 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-04-17T03:24:26.297565" elapsed="0.001097"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:24:26.298853" elapsed="0.000324"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:24:26.296354" elapsed="0.002881"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:24:26.300007" 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-04-17T03:24:26.299574" elapsed="0.000467"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:24:26.300987" 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-04-17T03:24:26.300688" elapsed="0.000334"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:24:26.301087" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:24:26.301295" 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-04-17T03:24:26.300278" elapsed="0.001052"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:24:26.301522" elapsed="0.000295"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:24:26.299406" elapsed="0.002466"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:24:26.302546" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:24:26.302197" elapsed="0.000384"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:24:26.303378" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:24:26.303130" elapsed="0.000274"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:24:26.303453" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:24:26.303604" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:24:26.302783" 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-04-17T03:24:26.303853" elapsed="0.000245"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:24:26.302040" elapsed="0.002102"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:24:26.304671" 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-04-17T03:24:26.304371" elapsed="0.000325"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:24:26.305397" 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-04-17T03:24:26.305186" elapsed="0.000237"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:24:26.305473" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:24:26.305624" 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-04-17T03:24:26.304868" 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-04-17T03:24:26.305783" elapsed="0.000239"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:24:26.304254" elapsed="0.001810"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:24:26.290530" elapsed="0.015569"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:24:26.306143" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:24:26.306303" level="INFO">${mapping_to_use} = {'IP': '10.30.171.238', '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-04-17T03:24:26.289143" elapsed="0.017185"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:26.288801" elapsed="0.017559"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:26.306540" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:26.306390" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:26.288777" elapsed="0.017840"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:24:26.307503" 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-04-17T03:24:26.306750" elapsed="0.000782"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:24:26.307581" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>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-04-17T03:24:26.284733" elapsed="0.022973"/>
</kw>
<msg time="2026-04-17T03:24:26.307762" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:26.270438" elapsed="0.037377"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>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-04-17T03:24:26.319194" 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//bgp_peer.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-04-17T03:24:26.330342" 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_peer.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-04-17T03:24:26.341360" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:26.341636" 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-04-17T03:24:26.341807" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:26.342214" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:26.342078" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:26.342061" 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-04-17T03:24:26.342424" 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-04-17T03:24:26.342575" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:26.342725" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:24:26.342023" elapsed="0.000754"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:24:26.341892" elapsed="0.000913"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:26.342950" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:26.343029" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:24:26.343182" 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-04-17T03:24:26.265580" elapsed="0.077631"/>
</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-04-17T03:24:26.367630" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:26.367084" elapsed="0.000588"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:24:26.368739" 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-04-17T03:24:26.368345" elapsed="0.000496">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-04-17T03:24:26.368999" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:24:26.367887" elapsed="0.001147"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:24:26.369768" 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-04-17T03:24:26.369235" elapsed="0.000568"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:24:26.370216" 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-04-17T03:24:26.370439" 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-04-17T03:24:26.370017" elapsed="0.000460"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:26.370999" 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-04-17T03:24:26.370664" elapsed="0.000490"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-17T03:24:26.371712" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:26.371274" elapsed="0.000512"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:24:26.372424" level="INFO">${mapping_to_use} = {'IP': '10.30.171.238', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:26.372020" elapsed="0.000439"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:26.371822" elapsed="0.000681"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:26.371227" elapsed="0.001305"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:24:26.373700" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.238&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflec...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:24:26.372709" elapsed="0.001024"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:24:26.373787" elapsed="0.000039"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer.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-04-17T03:24:26.366327" elapsed="0.007621"/>
</kw>
<msg time="2026-04-17T03:24:26.374026" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:26.354586" elapsed="0.019495"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>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-04-17T03:24:26.386140" elapsed="0.000059"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:24:26.398027" elapsed="0.000044"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:24:26.409776" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:26.410006" 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-04-17T03:24:26.410180" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:26.410578" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:26.410440" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:26.410423" 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-04-17T03:24:26.410788" 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-04-17T03:24:26.410956" 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-04-17T03:24:26.411114" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:24:26.410385" elapsed="0.000780"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:24:26.410264" elapsed="0.000928"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:26.411459" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:26.411542" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:24:26.411718" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.238&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflec...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:24:26.352068" elapsed="0.059682"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:24:26.413409" 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-04-17T03:24:26.413031" elapsed="0.000476">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-04-17T03:24:26.413626" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:24:26.412517" elapsed="0.001140"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:26.414088" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:26.413748" elapsed="0.000413"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:24:26.414797" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:26.414408" elapsed="0.000422"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:26.414195" elapsed="0.000681"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:26.413724" elapsed="0.001179"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:24:26.417710" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:24:26.415108" elapsed="0.002637"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:24:26.417802" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:24:26.418015" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:24:26.412142" elapsed="0.005913"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:26.419535" 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.238</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:26.419271" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:26.420009" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.238&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-04-17T03:24:26.419725" elapsed="0.000345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:26.420466" 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-04-17T03:24:26.420209" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:26.420952" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:26.420686" elapsed="0.000313"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:24:26.421788" 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-04-17T03:24:26.421582" elapsed="0.000231"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:24:26.422280" 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-04-17T03:24:26.422018" elapsed="0.000292"/>
</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-04-17T03:24:26.422544" elapsed="0.000229"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:26.423196" 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-04-17T03:24:26.422942" elapsed="0.000374"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:24:26.423364" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:24:26.423529" 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-04-17T03:24:26.421189" elapsed="0.002366"/>
</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-04-17T03:24:26.429000" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:24:26.630562" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:24:27.033469" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:24:27.036679" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:24:26.425708" elapsed="0.615154">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:24:26.423627" elapsed="0.617522">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:27.041711" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:27.041249" elapsed="0.000580"/>
</branch>
<status status="FAIL" start="2026-04-17T03:24:26.423609" elapsed="0.618261">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:27.042887" elapsed="0.000112"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:27.043393" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:27.043322" elapsed="0.000147"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:27.043096" elapsed="0.000405"/>
</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-04-17T03:24:27.043715" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:24:27.043818" elapsed="0.000024"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:24:26.418392" elapsed="0.625657">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:27.044307" elapsed="0.000025"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:24:26.253277" elapsed="0.791191">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:27.044956" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:27.044637" elapsed="0.000416"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:27.044612" elapsed="0.000475"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:27.045135" elapsed="0.000021"/>
</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="FAIL" start="2026-04-17T03:24:26.248755" elapsed="0.796534">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Configure BGP peer module with initiate-connection set to false.</doc>
<status status="FAIL" start="2026-04-17T03:24:26.247041" elapsed="0.798563">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:24:27.103414" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:27.102941" elapsed="0.000511"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:24:27.104379" 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-04-17T03:24:27.103989" elapsed="0.000470">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-04-17T03:24:27.104556" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:24:27.103621" elapsed="0.000959"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:24:27.105161" 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-04-17T03:24:27.104734" elapsed="0.000455"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:24:27.105486" 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-04-17T03:24:27.105660" 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-04-17T03:24:27.105338" elapsed="0.000349"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:27.106102" 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-04-17T03:24:27.105831" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:27.107540" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:27.106985" elapsed="0.000601"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:24:27.108310" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:24:27.107738" elapsed="0.000623"/>
</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-04-17T03:24:27.108981" elapsed="0.000120"/>
</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-04-17T03:24:27.109810" elapsed="0.000156"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:24:27.110296" elapsed="0.000114"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:24:27.108709" elapsed="0.001842"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:24:27.108455" elapsed="0.002147"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:24:27.110674" elapsed="0.000054"/>
</return>
<msg time="2026-04-17T03:24:27.110987" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:24:27.106594" elapsed="0.004433"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:27.106234" elapsed="0.004843"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:27.111315" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:27.111114" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:27.106205" elapsed="0.005224"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:24:27.112339" 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-04-17T03:24:27.111625" elapsed="0.000757"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:24:27.112454" 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/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-04-17T03:24:27.102101" elapsed="0.010540"/>
</kw>
<msg time="2026-04-17T03:24:27.112724" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:27.090431" elapsed="0.022369"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>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-04-17T03:24:27.126257" 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/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-04-17T03:24:27.140221" 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/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-04-17T03:24:27.154962" elapsed="0.000070"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:27.155332" elapsed="0.000035"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:27.155581" 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-04-17T03:24:27.156236" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:27.156022" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:27.155992" 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-04-17T03:24:27.156549" 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-04-17T03:24:27.156770" 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-04-17T03:24:27.157118" elapsed="0.000032"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:24:27.155912" elapsed="0.001283"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:24:27.155711" elapsed="0.001521"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:27.157418" elapsed="0.000030"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:27.157530" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:24:27.157763" 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-04-17T03:24:27.086303" elapsed="0.071500"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:24:27.159785" 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-04-17T03:24:27.159368" elapsed="0.000532">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-04-17T03:24:27.160060" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:24:27.158768" elapsed="0.001328"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:27.160496" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:27.160187" elapsed="0.000389"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:24:27.161235" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:27.160835" elapsed="0.000432"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:27.160611" elapsed="0.000693"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:27.160165" elapsed="0.001160"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:24:27.163799" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:24:27.161472" elapsed="0.002354"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:24:27.163879" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:24:27.164103" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:24:27.158279" elapsed="0.005850"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:24:27.165321" 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-04-17T03:24:27.165118" elapsed="0.000292"/>
</kw>
<msg time="2026-04-17T03:24:27.165530" 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-04-17T03:24:27.164762" elapsed="0.000801"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-04-17T03:24:27.165838" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:27.165657" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:27.165631" elapsed="0.000282"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:24:27.166322" 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-04-17T03:24:27.166537" 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-04-17T03:24:27.166105" elapsed="0.000464"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-04-17T03:24:27.167127" 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-04-17T03:24:27.166756" elapsed="0.000405"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-04-17T03:24:27.167224" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:24:27.167440" 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-04-17T03:24:27.164443" elapsed="0.003029"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:27.169496" 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-04-17T03:24:27.169142" elapsed="0.000419"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:27.170123" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:27.169757" 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-04-17T03:24:27.178763" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:27.380696" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:27.783506" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:27.786102" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:24:27.175006" elapsed="0.615389">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:24:27.170283" elapsed="0.620361">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:24:27.791171" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:27.790751" elapsed="0.000562"/>
</branch>
<status status="FAIL" start="2026-04-17T03:24:27.170256" elapsed="0.621107">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:24:27.792291" elapsed="0.000057"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:27.792584" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:27.792503" elapsed="0.000174"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:27.792463" elapsed="0.000260"/>
</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-04-17T03:24:27.793024" elapsed="0.000047"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:24:27.793172" elapsed="0.000034"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:24:27.167994" elapsed="0.625417">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:27.793573" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:24:27.065313" elapsed="0.728468">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:24:27.794447" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:27.794102" elapsed="0.000553"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:27.794063" elapsed="0.000648"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:27.794781" elapsed="0.000031"/>
</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="FAIL" start="2026-04-17T03:24:27.056648" elapsed="0.738371">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verify empty flowspec data on neon</doc>
<status status="FAIL" start="2026-04-17T03:24:27.049810" elapsed="0.745392">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verify expected response.</doc>
<status status="FAIL" start="2026-04-17T03:24:27.049217" elapsed="0.746119">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Start_ExaBgp_And_Verify_Connected" owner="ExaBgpLib">
<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="NOT RUN" start="2026-04-17T03:24:27.795770" elapsed="0.000032"/>
</kw>
<arg>${CFG1}</arg>
<status status="FAIL" start="2026-04-17T03:24:27.048240" elapsed="0.747676">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Stop_ExaBgp" owner="ExaBgpLib" type="TEARDOWN">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-04-17T03:24:27.797103" level="INFO">${output} =  </msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-04-17T03:24:27.796813" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:27.797745" level="INFO"> </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:27.797338" elapsed="0.000470"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:24:27.799091" 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-04-17T03:24:27.798531" elapsed="0.000601"/>
</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-04-17T03:24:27.799344" elapsed="0.000388"/>
</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-04-17T03:24:27.798096" elapsed="0.001721"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:24:27.804237" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-188-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-04-17T03:24:27.804550" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-188-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-04-17T03:24:27.800055" elapsed="0.004573"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:27.805861" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-188-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-04-17T03:24:27.805114" elapsed="0.000943"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:24:27.810471" 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-04-17T03:24:27.808192" elapsed="0.002539"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:24:27.929734" level="INFO">[?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-188-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-04-17T03:24:27.929966" level="INFO">${output} = [?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-188-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-04-17T03:24:27.811146" elapsed="0.118852"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:27.930849" level="INFO">[?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-188-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-04-17T03:24:27.930474" elapsed="0.000427"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:27.930123" elapsed="0.000829"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:27.930089" elapsed="0.000893"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-04-17T03:24:27.806850" elapsed="0.124197"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-04-17T03:24:27.796371" elapsed="0.134737"/>
</kw>
<doc>Testing flowspec values for bgp-flowspec.cfg</doc>
<status status="FAIL" start="2026-04-17T03:24:27.046770" elapsed="0.884392">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:24:27.980479" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//empty_route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:27.980041" elapsed="0.000474"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:24:27.981457" 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-04-17T03:24:27.981052" elapsed="0.000489">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-04-17T03:24:27.981639" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:24:27.980682" elapsed="0.000982"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:24:27.982300" 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-04-17T03:24:27.981826" elapsed="0.000503"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:24:27.982711" 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-04-17T03:24:27.982896" 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-04-17T03:24:27.982545" elapsed="0.000395"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:27.983349" 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-04-17T03:24:27.983096" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:27.984610" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:27.984137" elapsed="0.000519"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:24:27.985246" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:24:27.984805" elapsed="0.000467"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:27.985632" elapsed="0.000078"/>
</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-04-17T03:24:27.986138" elapsed="0.000081"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:24:27.986435" elapsed="0.000136"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:24:27.985477" elapsed="0.001190"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:24:27.985329" elapsed="0.001374"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:24:27.986755" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:24:27.986961" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:24:27.983806" elapsed="0.003183"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:27.983479" 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 variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:27.987190" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:27.987053" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:27.983453" elapsed="0.003812"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:24:27.988100" 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-04-17T03:24:27.987397" elapsed="0.000733"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:24:27.988179" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>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-04-17T03:24:27.979343" elapsed="0.008963"/>
</kw>
<msg time="2026-04-17T03:24:27.988362" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:27.967564" elapsed="0.020904"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>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-04-17T03:24:28.002901" elapsed="0.000049"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:24:28.014396" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//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-04-17T03:24:28.027070" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:28.027314" 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-04-17T03:24:28.027495" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:28.027894" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:28.027754" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:28.027736" 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-04-17T03:24:28.028134" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:28.028288" 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-04-17T03:24:28.028455" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:24:28.027699" elapsed="0.000810"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:24:28.027582" elapsed="0.000955"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:28.028670" elapsed="0.000025"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:28.028755" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:24:28.028923" 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-04-17T03:24:27.963561" elapsed="0.065408"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:24:28.030336" 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-04-17T03:24:28.030037" elapsed="0.000377">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-04-17T03:24:28.030566" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:24:28.029639" elapsed="0.000952"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:28.030960" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:28.030662" elapsed="0.000427"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:24:28.031586" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:28.031280" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:28.031116" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:28.030644" elapsed="0.001026"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:24:28.033827" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:24:28.031808" elapsed="0.002046"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:24:28.033907" elapsed="0.000050"/>
</return>
<msg time="2026-04-17T03:24:28.034114" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:24:28.029295" elapsed="0.004849"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:24:28.035429" 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-04-17T03:24:28.035173" elapsed="0.000314"/>
</kw>
<msg time="2026-04-17T03:24:28.035576" 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-04-17T03:24:28.034809" elapsed="0.000790"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-04-17T03:24:28.035808" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:28.035670" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:28.035652" elapsed="0.000223"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:24:28.036197" 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-04-17T03:24:28.036426" 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-04-17T03:24:28.036028" elapsed="0.000424"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-04-17T03:24:28.036853" 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-04-17T03:24:28.036599" elapsed="0.000284"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-04-17T03:24:28.036948" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:24:28.037110" 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-04-17T03:24:28.034465" elapsed="0.002670"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:28.038566" 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-04-17T03:24:28.038291" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:28.039100" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:28.038780" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:24:28.044461" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:28.246288" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:28.657678" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:28.660859" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:24:28.041372" elapsed="0.624354">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:24:28.039224" elapsed="0.626950">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:24:28.666673" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:28.666273" elapsed="0.000539"/>
</branch>
<status status="FAIL" start="2026-04-17T03:24:28.039205" elapsed="0.627651">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:24:28.667611" elapsed="0.000045"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:28.667833" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:28.667773" elapsed="0.000130"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:28.667743" elapsed="0.000216"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:28.668168" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:24:28.668274" elapsed="0.000025"/>
</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-04-17T03:24:28.037444" elapsed="0.631015">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:28.668581" 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-04-17T03:24:27.943296" elapsed="0.725437">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:24:28.669176" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:28.668878" elapsed="0.000427"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:28.668853" elapsed="0.000501"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:28.669420" elapsed="0.000024"/>
</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="FAIL" start="2026-04-17T03:24:27.937447" elapsed="0.732161">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verify empty flowspec data on neon</doc>
<status status="FAIL" start="2026-04-17T03:24:27.933237" elapsed="0.736571">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verify expected response.</doc>
<status status="FAIL" start="2026-04-17T03:24:27.932967" elapsed="0.737039">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Start_ExaBgp_And_Verify_Connected" owner="ExaBgpLib">
<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="NOT RUN" start="2026-04-17T03:24:28.670623" elapsed="0.000044"/>
</kw>
<arg>${CFG2}</arg>
<status status="FAIL" start="2026-04-17T03:24:27.932260" elapsed="0.738563">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Stop_ExaBgp" owner="ExaBgpLib" type="TEARDOWN">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-04-17T03:24:28.671970" level="INFO">${output} =  </msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-04-17T03:24:28.671674" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:28.672470" level="INFO"> </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:28.672153" elapsed="0.000365"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:24:28.673364" 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-04-17T03:24:28.673015" elapsed="0.000377"/>
</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-04-17T03:24:28.673532" elapsed="0.000306"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-04-17T03:24:28.672707" elapsed="0.001193"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:24:28.675879" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-188-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-04-17T03:24:28.676000" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-188-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-04-17T03:24:28.674069" elapsed="0.001964"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:28.676472" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-188-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-04-17T03:24:28.676189" elapsed="0.000332"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:24:28.678325" 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-04-17T03:24:28.677206" elapsed="0.001177"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:24:28.761871" level="INFO">[?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-188-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-04-17T03:24:28.762218" level="INFO">${output} = [?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-188-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-04-17T03:24:28.678528" elapsed="0.083738"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:28.763319" level="INFO">[?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-188-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-04-17T03:24:28.762922" elapsed="0.000450"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:28.762432" elapsed="0.000977"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:28.762388" elapsed="0.001052"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-04-17T03:24:28.676780" elapsed="0.086722"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-04-17T03:24:28.671300" elapsed="0.092263"/>
</kw>
<doc>Testing flowspec values for bgp-flowspec-redirect.cfg</doc>
<status status="FAIL" start="2026-04-17T03:24:27.931699" elapsed="0.831918">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s10-t5" name="Deconfigure_ODL_To_Accept_Connection" line="72">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:24:28.765079" level="INFO">&amp;{mapping} = { IP=10.30.171.238 | 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-04-17T03:24:28.764549" elapsed="0.000559"/>
</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-04-17T03:24:28.805641" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:28.805150" elapsed="0.000527"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:24:28.806535" 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-04-17T03:24:28.806269" elapsed="0.000359">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-04-17T03:24:28.806731" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:24:28.805846" elapsed="0.000911"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:24:28.807349" 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-04-17T03:24:28.806913" elapsed="0.000464"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:24:28.807716" 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-04-17T03:24:28.807892" 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-04-17T03:24:28.807527" elapsed="0.000392"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:28.808443" 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-04-17T03:24:28.808179" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:28.809672" level="INFO">mapping: {'IP': '10.30.171.238', '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-04-17T03:24:28.809394" elapsed="0.000330"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:24:28.810200" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:24:28.809876" elapsed="0.000350"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:24:28.810919" level="INFO">${value} = 10.30.171.238</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:24:28.810592" elapsed="0.000370"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:24:28.811697" level="INFO">${encoded} = 10.30.171.238</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:24:28.811463" elapsed="0.000262"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:24:28.811779" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:24:28.811971" level="INFO">${encoded_value} = 10.30.171.238</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:24:28.811151" 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-04-17T03:24:28.812145" elapsed="0.000472"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.238</var>
<status status="PASS" start="2026-04-17T03:24:28.810466" elapsed="0.002195"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:24:28.813234" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:24:28.812909" elapsed="0.000351"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:24:28.814029" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:24:28.813788" elapsed="0.000267"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:24:28.814129" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:24:28.814291" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:24:28.813438" 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-04-17T03:24:28.814457" elapsed="0.000229"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:24:28.812787" elapsed="0.001944"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:24:28.810284" elapsed="0.004494"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:24:28.814823" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:24:28.815005" level="INFO">${mapping_to_use} = {'IP': '10.30.171.238', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:24:28.809056" elapsed="0.005976"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:28.808606" elapsed="0.006460"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:28.815240" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:28.815097" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:28.808571" elapsed="0.006746"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:24:28.816135" 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-04-17T03:24:28.815453" elapsed="0.000714"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:24:28.816216" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpflowspec/../../../variables/bgpflowspec//bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:24:28.804315" elapsed="0.012030"/>
</kw>
<msg time="2026-04-17T03:24:28.816405" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:28.792229" elapsed="0.024230"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>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-04-17T03:24:28.828110" elapsed="0.000080"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:24:28.839616" elapsed="0.000071"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:24:28.851003" elapsed="0.000065"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:28.851306" 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-04-17T03:24:28.851480" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:28.851908" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:28.851769" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:28.851751" 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-04-17T03:24:28.852141" 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-04-17T03:24:28.852294" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:28.852444" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:24:28.851711" elapsed="0.000785"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:24:28.851567" elapsed="0.000956"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:28.852655" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:28.852735" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:24:28.852913" 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-04-17T03:24:28.787815" elapsed="0.065143"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:28.854229" 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.238</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:28.853881" elapsed="0.000402"/>
</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-04-17T03:24:28.859455" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:24:29.061387" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:24:29.464540" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:24:29.467979" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:24:28.856393" elapsed="0.616790">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:24:28.854350" elapsed="0.619050">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:24:29.473897" elapsed="0.000083"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:29.473489" elapsed="0.000585"/>
</branch>
<status status="FAIL" start="2026-04-17T03:24:28.854332" elapsed="0.619794">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:24:29.475266" elapsed="0.000068"/>
</kw>
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:29.475467" elapsed="0.000043"/>
</return>
<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-04-17T03:24:28.853258" elapsed="0.622463">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:29.475864" elapsed="0.000034"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}/bgp_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="FAIL" start="2026-04-17T03:24:28.765356" elapsed="0.710760">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Deconfigure BGP peer.</doc>
<status status="FAIL" start="2026-04-17T03:24:28.764062" elapsed="0.712433">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:24:29.478157" elapsed="0.000464"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-17T03:24:29.478856" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-17T03:24:29.478774" elapsed="0.000150"/>
</kw>
<doc>Suite teardown keyword</doc>
<status status="PASS" start="2026-04-17T03:24:29.477636" elapsed="0.001359"/>
</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="FAIL" start="2026-04-17T03:23:19.263403" elapsed="70.215622"/>
</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-04-17T03:24:29.575147" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:24:29.570701" elapsed="0.004509"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-17T03:24:29.570459" elapsed="0.004829"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-17T03:24:29.580419" 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-04-17T03:24:29.576580" elapsed="0.003870"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-17T03:24:29.580681" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:29.580541" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:29.580516" elapsed="0.000236"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:24:29.581337" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:24:29.580940" elapsed="0.000441"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-17T03:24:29.581902" 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-04-17T03:24:29.581550" elapsed="0.000393"/>
</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-04-17T03:24:29.582469" elapsed="0.000292"/>
</kw>
<msg time="2026-04-17T03:24:29.582860" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:24:29.582908" level="INFO">${possibly_int_of_members} = 1</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:29.582116" elapsed="0.000831"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:24:29.583516" 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-04-17T03:24:29.583136" elapsed="0.000406"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:24:29.584648" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:24:29.584377" elapsed="0.000297"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:24:29.585111" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:24:29.584828" elapsed="0.000310"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:24:29.585679" 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-04-17T03:24:29.585315" elapsed="0.000411"/>
</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-04-17T03:24:29.589196" elapsed="0.000216"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:24:29.589945" level="INFO">${member_ip} = 10.30.170.120</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:29.589579" elapsed="0.000394"/>
</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-04-17T03:24:29.590132" elapsed="0.000229"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:24:29.591175" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:29.590860" elapsed="0.000342"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-17T03:24:29.591250" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:24:29.591413" 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-04-17T03:24:29.590561" elapsed="0.000877"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:24:29.592072" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.120:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a44243def50&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-04-17T03:24:29.591602" elapsed="0.000610"/>
</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-04-17T03:24:29.592379" elapsed="0.000192"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-04-17T03:24:29.588595" elapsed="0.004035"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:24:29.588386" elapsed="0.004288"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-04-17T03:24:29.585785" elapsed="0.006923"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:24:29.593542" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:24:29.592902" elapsed="0.000683"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:24:29.594440" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.120'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:24:29.593964" elapsed="0.000520"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:24:29.595057" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:24:29.594651" elapsed="0.000526"/>
</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-04-17T03:24:29.583820" elapsed="0.011417"/>
</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-04-17T03:24:29.576226" elapsed="0.019070"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:24:29.595527" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:29.595380" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:29.595357" elapsed="0.000240"/>
</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-04-17T03:24:29.598948" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:24:29.598521" elapsed="0.000456"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:24:29.599450" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:24:29.599146" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:24:29.599523" elapsed="0.000048"/>
</return>
<msg time="2026-04-17T03:24:29.599700" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:24:29.598176" elapsed="0.001548"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:24:29.600763" level="INFO">${member_ip} = 10.30.170.120</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-04-17T03:24:29.600489" elapsed="0.000301"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:29.601573" 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-04-17T03:24:29.601676" 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-04-17T03:24:29.601397" elapsed="0.000327"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:29.605541" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:29.604901" elapsed="0.000729"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:29.604880" elapsed="0.000790"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:29.606436" 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-04-17T03:24:29.606679" 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-04-17T03:24:29.605917" elapsed="0.000815"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:29.607797" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.120" 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-04-17T03:24:29.607056" elapsed="0.000849"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:29.609143" 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-04-17T03:24:29.608207" elapsed="0.000990"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-17T03:24:29.611022" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:24:29.611201" 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-04-17T03:24:29.610621" elapsed="0.000624"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:29.611607" elapsed="0.000573"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:24:29.613369" level="INFO">Logging into '10.30.170.120:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:24:30.393106" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 17 03:24:29 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:23:19 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:24:29.613037" elapsed="0.780341"/>
</kw>
<msg time="2026-04-17T03:24:30.393461" 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-04-17T03:24:29.612556" elapsed="0.781074"/>
</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-04-17T03:24:29.609647" elapsed="0.784139"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:24:30.394781" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-17T03:24:30.408202" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-17T03:24:30.408538" level="INFO">${stdout} = </msg>
<msg time="2026-04-17T03:24:30.408691" 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-04-17T03:24:30.394241" elapsed="0.014525"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:24:30.409438" elapsed="0.000997"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:30.413235" 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-04-17T03:24:30.411814" elapsed="0.002107"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-17T03:24:30.415042" elapsed="0.000110"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:30.414375" elapsed="0.000943"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:30.414322" elapsed="0.001077"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:24:30.416252" elapsed="0.000145"/>
</return>
<status status="PASS" start="2026-04-17T03:24:30.415574" elapsed="0.000997"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:30.415539" elapsed="0.001117"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-17T03:24:30.416800" elapsed="0.000035"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:30.424941" elapsed="0.000567"/>
</kw>
<kw name="Open 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-04-17T03:24:30.425804" elapsed="0.000389"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:24:30.426506" elapsed="0.000227"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:24:30.418182" elapsed="0.008638"/>
</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-04-17T03:24:29.603888" elapsed="0.823142"/>
</kw>
<msg time="2026-04-17T03:24:30.427096" 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-04-17T03:24:29.603220" elapsed="0.823942"/>
</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-04-17T03:24:29.602424" elapsed="0.824821"/>
</kw>
<msg time="2026-04-17T03:24:30.427295" 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-04-17T03:24:29.601888" elapsed="0.825455"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:30.430418" elapsed="0.000399"/>
</kw>
<kw name="Open 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-04-17T03:24:30.431013" elapsed="0.000166"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:24:30.431348" 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-04-17T03:24:30.427680" elapsed="0.003823"/>
</kw>
<msg time="2026-04-17T03:24:30.431600" 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-04-17T03:24:29.601026" elapsed="0.830599"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:30.432146" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:30.431855" elapsed="0.000334"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-17T03:24:30.432237" elapsed="0.000037"/>
</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-04-17T03:24:29.600121" elapsed="0.832254"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:24:29.599918" elapsed="0.832588"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:24:29.599780" elapsed="0.832766"/>
</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-04-17T03:24:29.595838" elapsed="0.836767"/>
</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-04-17T03:24:30.432768" elapsed="0.000236"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:24:30.447911" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:30.447749" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:30.447721" elapsed="0.000295"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:30.448427" 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-04-17T03:24:30.448559" 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-04-17T03:24:30.448236" elapsed="0.000350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:30.449075" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:30.448753" elapsed="0.000368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:30.449550" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:30.449281" elapsed="0.000314"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:24:30.450448" 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-04-17T03:24:30.450212" elapsed="0.000344">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-17T03:24:30.450665" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:24:30.450712" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:30.449764" elapsed="0.000972"/>
</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-04-17T03:24:30.451066" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:30.450814" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:30.450795" elapsed="0.000371"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:24:30.451964" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:24:30.451674" elapsed="0.000317"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:24:30.452041" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:24:30.452204" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:24:30.451391" elapsed="0.000837"/>
</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-04-17T03:24:30.452395" elapsed="0.000451"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:30.453150" level="INFO">index=4
host=10.30.170.120
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-04-17T03:24:30.453262" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.120
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-04-17T03:24:30.453039" 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-04-17T03:24:30.453484" elapsed="0.002665"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:24:30.456608" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:24:30.457940" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:24:30.456330" elapsed="0.002301">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:30.462116" elapsed="0.000588"/>
</kw>
<kw name="Open 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-04-17T03:24:30.462882" elapsed="0.000202"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:24:30.463254" elapsed="0.000106"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:24:30.459657" elapsed="0.003816"/>
</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-04-17T03:24:30.459017" elapsed="0.004597"/>
</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="FAIL" start="2026-04-17T03:24:30.447153" elapsed="0.016585">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:24:31.485189" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:31.484968" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:31.484908" elapsed="0.000423"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:31.485879" 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-04-17T03:24:31.486062" 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-04-17T03:24:31.485631" elapsed="0.000471"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:31.486905" 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-04-17T03:24:31.486505" elapsed="0.000488"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:31.487750" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:31.487224" elapsed="0.000589"/>
</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-04-17T03:24:31.488632" elapsed="0.000314"/>
</kw>
<msg time="2026-04-17T03:24:31.489090" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:24:31.489150" level="INFO">${old_connection_index} = 4</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:31.488059" elapsed="0.001121"/>
</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-04-17T03:24:31.490286" elapsed="0.000150"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:24:31.491299" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:24:31.491096" elapsed="0.000793">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:31.490672" elapsed="0.001324"/>
</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-04-17T03:24:31.492711" elapsed="0.000234"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:31.492238" elapsed="0.000780"/>
</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-04-17T03:24:31.489650" elapsed="0.003434"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:31.489297" elapsed="0.003859"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:31.489265" elapsed="0.003940"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:24:31.494421" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:24:31.494013" elapsed="0.000439"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:24:31.494507" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:24:31.494689" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:24:31.493540" elapsed="0.001175"/>
</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-04-17T03:24:31.494918" elapsed="0.000486"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:31.495714" level="INFO">index=6
host=10.30.170.120
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-04-17T03:24:31.495820" level="INFO">${karaf_connection_object} = index=6
host=10.30.170.120
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-04-17T03:24:31.495587" elapsed="0.000260"/>
</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-04-17T03:24:31.496022" elapsed="0.003168"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:24:31.499853" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:24:31.501333" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:24:31.499458" elapsed="0.002587">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:31.505649" 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-04-17T03:24:31.506285" elapsed="0.000185"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:24:31.506627" elapsed="0.000107"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:24:31.503158" elapsed="0.003630"/>
</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-04-17T03:24:31.502475" elapsed="0.004364"/>
</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="FAIL" start="2026-04-17T03:24:31.484302" elapsed="0.022657">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:24:32.530342" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:32.530178" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:32.530147" elapsed="0.000297"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:32.530876" 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-04-17T03:24:32.531021" 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-04-17T03:24:32.530679" elapsed="0.000371"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:32.531550" level="INFO">{1: 6}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:32.531217" elapsed="0.000380"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:32.532027" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:32.531756" elapsed="0.000316"/>
</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-04-17T03:24:32.532735" elapsed="0.000209"/>
</kw>
<msg time="2026-04-17T03:24:32.533048" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:24:32.533095" level="INFO">${old_connection_index} = 6</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:32.532248" elapsed="0.000870"/>
</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-04-17T03:24:32.533983" elapsed="0.000143"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:24:32.534824" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:24:32.534642" elapsed="0.000722">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:32.534303" elapsed="0.001124"/>
</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-04-17T03:24:32.535954" elapsed="0.000106"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:32.535602" elapsed="0.000504"/>
</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-04-17T03:24:32.533440" elapsed="0.002709"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:32.533202" elapsed="0.003000"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:32.533180" elapsed="0.003051"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:24:32.537144" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:24:32.536839" elapsed="0.000332"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:24:32.537222" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:24:32.537395" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:24:32.536528" elapsed="0.000891"/>
</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-04-17T03:24:32.537582" elapsed="0.000515"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:32.538617" level="INFO">index=8
host=10.30.170.120
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-04-17T03:24:32.538759" level="INFO">${karaf_connection_object} = index=8
host=10.30.170.120
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-04-17T03:24:32.538448" elapsed="0.000348"/>
</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-04-17T03:24:32.539041" elapsed="0.004000"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:24:32.543957" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:24:32.545454" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:24:32.543357" elapsed="0.002761">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:32.551211" elapsed="0.000604"/>
</kw>
<kw name="Open 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-04-17T03:24:32.552130" elapsed="0.000329"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:24:32.552702" elapsed="0.000162"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:24:32.547567" elapsed="0.005407"/>
</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-04-17T03:24:32.546633" elapsed="0.006418"/>
</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="FAIL" start="2026-04-17T03:24:32.529690" elapsed="0.023509">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:24:33.574723" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:33.574573" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:33.574544" elapsed="0.000269"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:33.575247" 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-04-17T03:24:33.575372" 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-04-17T03:24:33.575050" elapsed="0.000348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:33.575954" level="INFO">{1: 8}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:33.575572" elapsed="0.000432"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:33.576495" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:33.576199" elapsed="0.000342"/>
</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-04-17T03:24:33.577260" elapsed="0.000196"/>
</kw>
<msg time="2026-04-17T03:24:33.577576" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:24:33.577638" level="INFO">${old_connection_index} = 8</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:33.576716" elapsed="0.000952"/>
</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-04-17T03:24:33.578583" elapsed="0.000142"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:24:33.579436" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:24:33.579252" elapsed="0.000755">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:33.578898" elapsed="0.001174"/>
</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-04-17T03:24:33.580585" elapsed="0.000103"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:33.580252" elapsed="0.000482"/>
</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-04-17T03:24:33.578044" elapsed="0.002733"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:33.577762" elapsed="0.003064"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:33.577741" elapsed="0.003210"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:24:33.581793" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:24:33.581508" elapsed="0.000312"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:24:33.581871" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:24:33.582070" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:24:33.581197" elapsed="0.000899"/>
</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-04-17T03:24:33.582258" elapsed="0.000434"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:33.583013" level="INFO">index=10
host=10.30.170.120
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-04-17T03:24:33.583118" level="INFO">${karaf_connection_object} = index=10
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:24:33.582874" elapsed="0.000270"/>
</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-04-17T03:24:33.583299" elapsed="0.002676"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:24:33.586434" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:24:33.587755" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:24:33.586155" elapsed="0.002799">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:33.592616" elapsed="0.000399"/>
</kw>
<kw name="Open 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-04-17T03:24:33.593192" elapsed="0.000177"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:24:33.593523" elapsed="0.000104"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:24:33.590035" elapsed="0.003645"/>
</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-04-17T03:24:33.589329" elapsed="0.004397"/>
</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="FAIL" start="2026-04-17T03:24:33.574108" elapsed="0.019712">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:24:33.593917" level="FAIL">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<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="FAIL" start="2026-04-17T03:24:30.433818" elapsed="3.160262">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:30.433437" elapsed="3.160716"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:24:30.433215" elapsed="3.160981"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-04-17T03:24:30.433061" elapsed="3.161173"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-17T03:24:29.575726" elapsed="4.018590"/>
</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-04-17T03:24:33.597412" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:33.597270" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:33.597242" 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-04-17T03:24:33.603059" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:33.602896" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:33.602874" elapsed="0.000260"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:24:33.604265" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:24:33.603773" elapsed="0.000524"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:24:33.604821" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:24:33.604487" elapsed="0.000362"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:24:33.605000" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:24:33.605182" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:24:33.603403" elapsed="0.001805"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:24:33.611210" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:33.611081" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:33.611060" elapsed="0.000225"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:24:33.612677" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:33.612542" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:33.612523" elapsed="0.000226"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:24:33.613317" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:24:33.612904" elapsed="0.000444"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:33.613768" 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-04-17T03:24:33.613524" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:24:33.615018" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:24:33.614517" elapsed="0.001333">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:24:33.616021" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:24:33.616070" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:33.613985" elapsed="0.002110"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:24:33.617300" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:24:33.616823" elapsed="0.001357">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:24:33.618362" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:24:33.618420" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:33.616282" elapsed="0.002167"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:24:33.619649" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/ibgp_peer_lsp.robot"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:24:33.618862" elapsed="0.000875">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/ibgp_peer_lsp.robot"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:24:33.618560" elapsed="0.001397">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/ibgp_peer_lsp.robot"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:24:33.618530" elapsed="0.001470">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/ibgp_peer_lsp.robot"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:33.620186" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:33.620438" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:33.620286" elapsed="0.000309"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:33.620266" elapsed="0.000357"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:24:33.620663" elapsed="0.000020"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:33.623166" elapsed="0.000491"/>
</kw>
<kw name="Open 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-04-17T03:24:33.624075" elapsed="0.000340"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:24:33.624761" elapsed="0.000292"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:24:33.622237" 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-04-17T03:24:33.621086" elapsed="0.004209"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:24:33.612235" elapsed="0.013175">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/ibgp_peer_lsp.robot"</status>
</kw>
<msg time="2026-04-17T03:24:33.625617" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:24:33.625666" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/ibgp_peer_lsp.robot"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:33.611463" elapsed="0.014230"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:24:33.626067" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:33.625787" elapsed="0.000357"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:33.625762" elapsed="0.000412"/>
</if>
<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-04-17T03:24:33.627099" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:33.626982" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:33.626962" elapsed="0.000208"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:33.627813" 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-04-17T03:24:33.627954" 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-04-17T03:24:33.627354" elapsed="0.000630"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:33.628503" level="INFO">{1: 10}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:33.628174" elapsed="0.000377"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:33.629012" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:33.628716" elapsed="0.000352"/>
</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-04-17T03:24:33.629684" elapsed="0.000455"/>
</kw>
<msg time="2026-04-17T03:24:33.630248" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:24:33.630296" level="INFO">${old_connection_index} = 10</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:33.629247" elapsed="0.001073"/>
</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-04-17T03:24:33.631516" elapsed="0.000325"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:24:33.633265" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:24:33.632946" elapsed="0.000870">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:33.632109" elapsed="0.001804"/>
</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-04-17T03:24:33.635149" elapsed="0.000214"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:33.634369" elapsed="0.001070"/>
</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-04-17T03:24:33.630661" elapsed="0.004865"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:33.630408" elapsed="0.005171"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:33.630384" elapsed="0.005230"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:24:33.636819" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:24:33.636284" elapsed="0.000567"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:24:33.636904" elapsed="0.000077"/>
</return>
<msg time="2026-04-17T03:24:33.637135" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:24:33.635900" elapsed="0.001261"/>
</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-04-17T03:24:33.637333" elapsed="0.000454"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:33.638124" level="INFO">index=13
host=10.30.170.120
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-04-17T03:24:33.638229" level="INFO">${karaf_connection_object} = index=13
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:24:33.637997" elapsed="0.000259"/>
</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-04-17T03:24:33.638412" elapsed="0.002415"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:24:33.641421" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:24:33.642899" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:24:33.641125" elapsed="0.002261">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:33.647450" elapsed="0.000732"/>
</kw>
<kw name="Open 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-04-17T03:24:33.648454" elapsed="0.000443"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:24:33.649158" elapsed="0.000197"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:24:33.644538" elapsed="0.004908"/>
</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-04-17T03:24:33.643841" elapsed="0.005658"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:24:33.626671" elapsed="0.022934">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:33.650041" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:24:33.650122" 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="FAIL" start="2026-04-17T03:24:33.610736" elapsed="0.039504">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:24:33.650366" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:24:33.650415" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:33.605620" elapsed="0.044821"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:33.650810" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:33.650527" elapsed="0.000339"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:33.650506" elapsed="0.000387"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:24:33.605462" elapsed="0.045457"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:24:33.605267" elapsed="0.045723"/>
</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-04-17T03:24:33.602539" elapsed="0.048535"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-17T03:24:33.595041" elapsed="0.056103"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:33.594529" elapsed="0.056663"/>
</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-04-17T03:24:29.570131" elapsed="4.081114"/>
</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-04-17T03:24:33.651404" elapsed="0.000194"/>
</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-04-17T03:24:33.651810" elapsed="0.000219"/>
</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-04-17T03:24:33.653882" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:24:33.653999" 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-04-17T03:24:33.653579" elapsed="0.000446"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:33.654192" elapsed="0.000335"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:24:33.655569" level="INFO">Logging into '10.30.171.238:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:24:34.327665" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 17 03:24:33 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:23:19 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:24:33.655224" elapsed="0.672750"/>
</kw>
<msg time="2026-04-17T03:24:34.328065" 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-04-17T03:24:33.654735" elapsed="0.673421"/>
</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-04-17T03:24:33.653115" elapsed="0.675154"/>
</kw>
<msg time="2026-04-17T03:24:34.328330" 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-04-17T03:24:33.652618" elapsed="0.675768"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-17T03:24:33.652246" elapsed="0.676221"/>
</kw>
<kw name="Require_Python" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:24:34.329998" level="INFO">Executing command 'python3 --help'.</msg>
<msg time="2026-04-17T03:24:34.342540" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:24:34.342756" 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-04-17T03:24:34.342812" level="INFO">${stderr} = </msg>
<msg time="2026-04-17T03:24:34.342854" 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-04-17T03:24:34.329759" elapsed="0.013120"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:24:34.344808" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-04-17T03:24:34.344188" elapsed="0.000724"/>
</kw>
<msg time="2026-04-17T03:24:34.345159" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-04-17T03:24:34.345267" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:34.343180" elapsed="0.002149"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:24:34.346853" 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-04-17T03:24:34.345750" elapsed="0.001209"/>
</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-04-17T03:24:34.348188" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:34.347168" elapsed="0.001169"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:34.347117" elapsed="0.001283"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-04-17T03:24:34.348832" elapsed="0.000083"/>
</return>
<status status="PASS" start="2026-04-17T03:24:34.348557" elapsed="0.000463"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:34.348519" elapsed="0.000567"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-04-17T03:24:34.349303" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:34.349210" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:34.349176" elapsed="0.000298"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:34.349837" elapsed="0.000051"/>
</kw>
<msg time="2026-04-17T03:24:34.350226" 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-04-17T03:24:34.329372" elapsed="0.020912"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-04-17T03:24:34.350649" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-04-17T03:24:34.350442" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:34.350402" elapsed="0.000420"/>
</if>
<kw name="Fatal Error" owner="BuiltIn">
<arg>Python 3 is not installed!</arg>
<doc>Stops the whole test execution.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:34.351249" elapsed="0.000069"/>
</kw>
<doc>Verify current SSH connection leads to machine with python working. Fatal fail otherwise.</doc>
<status status="PASS" start="2026-04-17T03:24:34.328875" elapsed="0.022729"/>
</kw>
<kw name="Assure_Library_Ipaddr" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:24:34.353369" level="INFO">Executing command 'bash -c 'cd "." &amp;&amp; python -c "import ipaddr"''.</msg>
<msg time="2026-04-17T03:24:34.412115" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:24:34.412492" level="INFO">${stdout} = </msg>
<msg time="2026-04-17T03:24:34.412595" level="INFO">${stderr} = </msg>
<msg time="2026-04-17T03:24:34.412686" 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-04-17T03:24:34.353157" elapsed="0.059582"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:24:34.414846" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-04-17T03:24:34.414195" elapsed="0.000784"/>
</kw>
<msg time="2026-04-17T03:24:34.415198" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-04-17T03:24:34.415296" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:34.413283" elapsed="0.002062"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:24:34.417077" 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-04-17T03:24:34.415867" elapsed="0.001272"/>
</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-04-17T03:24:34.418186" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:34.417327" elapsed="0.001005"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:34.417281" elapsed="0.001107"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-04-17T03:24:34.418731" elapsed="0.000070"/>
</return>
<status status="PASS" start="2026-04-17T03:24:34.418511" elapsed="0.000364"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:34.418477" elapsed="0.000478"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-04-17T03:24:34.419158" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:34.419082" elapsed="0.000163"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:34.419048" elapsed="0.000244"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:34.419720" elapsed="0.000052"/>
</kw>
<msg time="2026-04-17T03:24:34.420097" 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-04-17T03:24:34.352755" elapsed="0.067398"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-04-17T03:24:34.420467" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-04-17T03:24:34.420315" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:34.420275" elapsed="0.000311"/>
</if>
<kw name="Put File" owner="SSHLibrary">
<arg>/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/libraries/BGPCEP/ipaddr.py</arg>
<arg>${target_dir}/</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:34.420819" elapsed="0.000032"/>
</kw>
<arg>target_dir=.</arg>
<doc>Tests whether ipaddr module is present on ssh-connected machine, Puts ipaddr.py to target_dir if not.</doc>
<status status="PASS" start="2026-04-17T03:24:34.352227" elapsed="0.068741"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-04-17T03:24:34.457558" level="INFO">[chan 3] Opened sftp connection (server version 3)</msg>
<msg time="2026-04-17T03:24:34.472013" 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-04-17T03:24:34.421201" elapsed="0.051004"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:24:34.473270" level="INFO">Creating Session using : alias=config-session, url=http://10.30.170.120:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a44243b2890&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-04-17T03:24:34.472751" elapsed="0.000753"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-17T03:24:34.475702" 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-04-17T03:24:34.475111" elapsed="0.000630"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="PASS" start="2026-04-17T03:24:34.476038" elapsed="0.000049"/>
</return>
<status status="PASS" start="2026-04-17T03:24:34.475855" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:34.475822" elapsed="0.000350"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:34.476413" elapsed="0.000032"/>
</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-04-17T03:24:34.476670" elapsed="0.000029"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:34.476942" elapsed="0.000032"/>
</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-04-17T03:24:34.477203" elapsed="0.000034"/>
</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-04-17T03:24:34.477598" elapsed="0.000035"/>
</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-04-17T03:24:34.474602" elapsed="0.003123"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:24:34.478573" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:34.477815" elapsed="0.000824"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:34.477791" elapsed="0.000880"/>
</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-04-17T03:24:34.483058" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:24:34.482423" elapsed="0.000676"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:24:34.483906" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:24:34.483474" elapsed="0.000487"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:24:34.484028" elapsed="0.000057"/>
</return>
<msg time="2026-04-17T03:24:34.484267" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:24:34.481910" elapsed="0.002392"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:24:34.485580" level="INFO">${member_ip} = 10.30.170.120</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-04-17T03:24:34.485286" elapsed="0.000329"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:34.486582" level="INFO">index=15
host=10.30.171.238
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-04-17T03:24:34.486691" level="INFO">${current_connection} = index=15
host=10.30.171.238
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-04-17T03:24:34.486426" elapsed="0.000293"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:34.489750" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:34.489384" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:34.489360" elapsed="0.000614"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:34.490267" level="INFO">index=15
host=10.30.171.238
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-04-17T03:24:34.490421" level="INFO">${current_ssh_connection} = index=15
host=10.30.171.238
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-04-17T03:24:34.490137" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:34.491876" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.120" 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-04-17T03:24:34.490669" elapsed="0.001277"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:34.492888" level="INFO">${conn_id} = 16</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-04-17T03:24:34.492117" elapsed="0.000799"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-17T03:24:34.494409" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:24:34.494643" 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-04-17T03:24:34.493792" elapsed="0.000921"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:34.495041" elapsed="0.000967"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:24:34.497760" level="INFO">Logging into '10.30.170.120:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:24:34.892743" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 17 03:24:29 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:24:30 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:24:34.497246" elapsed="0.395813"/>
</kw>
<msg time="2026-04-17T03:24:34.893215" 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-04-17T03:24:34.496350" elapsed="0.397126"/>
</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-04-17T03:24:34.493172" elapsed="0.400677"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:24:34.894717" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-17T03:24:34.909309" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-17T03:24:34.909686" level="INFO">${stdout} = </msg>
<msg time="2026-04-17T03:24:34.909753" 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-04-17T03:24:34.894237" elapsed="0.015555"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:24:34.910110" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:34.911685" 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-04-17T03:24:34.910761" elapsed="0.001034"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-17T03:24:34.912329" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:34.911999" elapsed="0.000429"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:34.911912" elapsed="0.000565"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:24:34.912843" elapsed="0.000064"/>
</return>
<status status="PASS" start="2026-04-17T03:24:34.912584" elapsed="0.000415"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:34.912553" elapsed="0.000496"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-17T03:24:34.913116" elapsed="0.000029"/>
</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-04-17T03:24:34.921208" elapsed="0.000492"/>
</kw>
<msg time="2026-04-17T03:24:34.921851" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:34.919007" elapsed="0.003107"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:34.922442" elapsed="0.000105"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:34.922822" elapsed="0.000122"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:24:34.913750" elapsed="0.009341"/>
</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-04-17T03:24:34.488849" elapsed="0.434408"/>
</kw>
<msg time="2026-04-17T03:24:34.923335" 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-04-17T03:24:34.488104" elapsed="0.435302"/>
</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-04-17T03:24:34.487566" elapsed="0.435951"/>
</kw>
<msg time="2026-04-17T03:24:34.923574" 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-04-17T03:24:34.486889" elapsed="0.436736"/>
</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-04-17T03:24:34.929015" elapsed="0.000219"/>
</kw>
<msg time="2026-04-17T03:24:34.929303" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:34.927770" elapsed="0.001626"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:34.929636" elapsed="0.000033"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:34.929873" elapsed="0.000032"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:24:34.923976" elapsed="0.006038"/>
</kw>
<msg time="2026-04-17T03:24:34.930150" 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-04-17T03:24:34.485916" elapsed="0.444270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:34.931072" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:34.930695" elapsed="0.000438"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-17T03:24:34.931250" elapsed="0.000053"/>
</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-04-17T03:24:34.484864" elapsed="0.446580"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:24:34.484582" elapsed="0.446916"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:24:34.484386" elapsed="0.447167"/>
</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-04-17T03:24:34.479003" elapsed="0.452640"/>
</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-04-17T03:24:34.931975" elapsed="0.000313"/>
</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-04-17T03:24:34.951822" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:34.951668" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:34.951638" elapsed="0.000280"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:34.952365" level="INFO">index=15
host=10.30.171.238
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-04-17T03:24:34.952490" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
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-04-17T03:24:34.952194" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:34.953029" level="INFO">{1: 13}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:34.952684" elapsed="0.000393"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:34.953481" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:34.953235" elapsed="0.000290"/>
</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-04-17T03:24:34.954159" elapsed="0.000192"/>
</kw>
<msg time="2026-04-17T03:24:34.954453" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:24:34.954499" level="INFO">${old_connection_index} = 13</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:34.953697" elapsed="0.000824"/>
</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-04-17T03:24:34.955431" elapsed="0.000140"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:24:34.956512" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:24:34.956317" elapsed="0.000766">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:34.955743" elapsed="0.001404"/>
</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-04-17T03:24:34.957658" elapsed="0.000102"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:34.957323" elapsed="0.000483"/>
</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-04-17T03:24:34.954832" elapsed="0.003018"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:34.954596" elapsed="0.003302"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:34.954578" elapsed="0.003347"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:24:34.958761" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:24:34.958486" elapsed="0.000301"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:24:34.958837" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:24:34.959020" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:24:34.958188" elapsed="0.000857"/>
</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-04-17T03:24:34.959251" elapsed="0.000442"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:34.961947" level="INFO">index=17
host=10.30.170.120
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-04-17T03:24:34.962064" level="INFO">${karaf_connection_object} = index=17
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:24:34.959870" elapsed="0.002221"/>
</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-04-17T03:24:34.962256" elapsed="0.002350"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:24:34.965072" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:24:34.966301" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:24:34.964780" elapsed="0.001960">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:24:34.970775" elapsed="0.000223"/>
</kw>
<msg time="2026-04-17T03:24:34.971051" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:34.970189" elapsed="0.000930"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:34.971305" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:34.971475" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:24:34.967779" elapsed="0.003781"/>
</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-04-17T03:24:34.967120" elapsed="0.004489"/>
</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="FAIL" start="2026-04-17T03:24:34.951107" elapsed="0.020589">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:24:35.992455" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:35.992309" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:35.992280" elapsed="0.000270"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:35.992914" level="INFO">index=15
host=10.30.171.238
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-04-17T03:24:35.993052" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
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-04-17T03:24:35.992755" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:35.993622" level="INFO">{1: 17}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:35.993250" elapsed="0.000420"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:35.994131" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:35.993838" elapsed="0.000357"/>
</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-04-17T03:24:35.994868" elapsed="0.000213"/>
</kw>
<msg time="2026-04-17T03:24:35.995185" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:24:35.995231" level="INFO">${old_connection_index} = 17</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:35.994392" elapsed="0.000862"/>
</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-04-17T03:24:35.996106" elapsed="0.000143"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:24:35.996955" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:24:35.996763" elapsed="0.000777">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:35.996426" elapsed="0.001180"/>
</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-04-17T03:24:35.998148" elapsed="0.000105"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:35.997785" elapsed="0.000514"/>
</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-04-17T03:24:35.995563" elapsed="0.002780"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:35.995329" elapsed="0.003063"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:35.995311" elapsed="0.003108"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:24:35.999264" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:24:35.998984" elapsed="0.000307"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:24:35.999340" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:24:35.999505" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:24:35.998661" elapsed="0.000870"/>
</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-04-17T03:24:35.999699" elapsed="0.000472"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:36.000726" level="INFO">index=18
host=10.30.170.120
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-04-17T03:24:36.000962" level="INFO">${karaf_connection_object} = index=18
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:24:36.000363" elapsed="0.000629"/>
</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-04-17T03:24:36.001152" elapsed="0.002271"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:24:36.003865" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:24:36.005161" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:24:36.003595" elapsed="0.001954">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:24:36.009295" elapsed="0.000226"/>
</kw>
<msg time="2026-04-17T03:24:36.009568" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:36.008792" elapsed="0.000839"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:36.009816" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:36.010047" elapsed="0.000032"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:24:36.006482" elapsed="0.003681"/>
</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-04-17T03:24:36.005886" elapsed="0.004342"/>
</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="FAIL" start="2026-04-17T03:24:35.991862" elapsed="0.018453">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:24:37.029892" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:37.029737" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:37.029708" elapsed="0.000298"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:37.030418" level="INFO">index=15
host=10.30.171.238
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-04-17T03:24:37.030544" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
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-04-17T03:24:37.030251" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:37.031190" level="INFO">{1: 18}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:37.030798" elapsed="0.000447"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:37.031705" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:37.031440" elapsed="0.000311"/>
</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-04-17T03:24:37.032379" elapsed="0.000379"/>
</kw>
<msg time="2026-04-17T03:24:37.032860" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:24:37.032906" level="INFO">${old_connection_index} = 18</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:37.031940" elapsed="0.001003"/>
</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-04-17T03:24:37.033807" elapsed="0.000157"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:24:37.034690" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:24:37.034513" elapsed="0.000711">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:37.034139" elapsed="0.001149"/>
</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-04-17T03:24:37.035990" elapsed="0.000105"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:37.035462" elapsed="0.000680"/>
</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-04-17T03:24:37.033254" elapsed="0.002933"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:37.033021" elapsed="0.003293"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:37.033002" elapsed="0.003344"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:24:37.037181" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:24:37.036878" elapsed="0.000330"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:24:37.037257" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:24:37.037423" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:24:37.036580" elapsed="0.001055"/>
</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-04-17T03:24:37.037798" elapsed="0.000462"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:37.038801" level="INFO">index=19
host=10.30.170.120
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-04-17T03:24:37.038907" level="INFO">${karaf_connection_object} = index=19
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:24:37.038439" elapsed="0.000510"/>
</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-04-17T03:24:37.039109" elapsed="0.002505"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:24:37.042112" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:24:37.043566" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:24:37.041805" elapsed="0.002590">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:24:37.051575" elapsed="0.000312"/>
</kw>
<msg time="2026-04-17T03:24:37.051997" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:37.050569" elapsed="0.001532"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:37.052360" elapsed="0.000033"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:37.052697" elapsed="0.000037"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:24:37.046276" elapsed="0.006557"/>
</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-04-17T03:24:37.045066" elapsed="0.007838"/>
</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="FAIL" start="2026-04-17T03:24:37.029270" elapsed="0.023783">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:24:38.070462" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:38.070292" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:38.070259" elapsed="0.000309"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:38.071031" level="INFO">index=15
host=10.30.171.238
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-04-17T03:24:38.071181" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
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-04-17T03:24:38.070828" elapsed="0.000388"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:38.071811" level="INFO">{1: 19}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:38.071426" elapsed="0.000443"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:38.072387" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:38.072084" elapsed="0.000359"/>
</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-04-17T03:24:38.073187" elapsed="0.000234"/>
</kw>
<msg time="2026-04-17T03:24:38.073543" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:24:38.073600" level="INFO">${old_connection_index} = 19</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:38.072652" elapsed="0.000977"/>
</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-04-17T03:24:38.074711" elapsed="0.000171"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:24:38.075862" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:24:38.075646" elapsed="0.000865">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:38.075216" elapsed="0.001373"/>
</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-04-17T03:24:38.077246" elapsed="0.000128"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:38.076808" elapsed="0.000624"/>
</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-04-17T03:24:38.074062" elapsed="0.003426"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:38.073747" elapsed="0.003801"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:38.073723" elapsed="0.003857"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:24:38.078616" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:24:38.078280" elapsed="0.000370"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:24:38.078709" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:24:38.078899" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:24:38.077894" elapsed="0.001059"/>
</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-04-17T03:24:38.079164" elapsed="0.000816"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:38.080346" level="INFO">index=20
host=10.30.170.120
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-04-17T03:24:38.080468" level="INFO">${karaf_connection_object} = index=20
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:24:38.080209" elapsed="0.000290"/>
</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-04-17T03:24:38.080688" elapsed="0.003186"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:24:38.084541" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:24:38.086136" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:24:38.084163" elapsed="0.002574">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:24:38.091720" elapsed="0.000309"/>
</kw>
<msg time="2026-04-17T03:24:38.092108" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:38.091098" elapsed="0.001118"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:38.092451" elapsed="0.000034"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:38.092695" elapsed="0.000030"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:24:38.088116" elapsed="0.004700"/>
</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-04-17T03:24:38.087251" elapsed="0.005636"/>
</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="FAIL" start="2026-04-17T03:24:38.069777" elapsed="0.023255">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:24:38.093178" level="FAIL">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<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="FAIL" start="2026-04-17T03:24:34.933508" elapsed="3.159825">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:34.932960" elapsed="3.160483"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:24:34.932733" elapsed="3.160873"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-04-17T03:24:34.932372" elapsed="3.161331"/>
</for>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-17T03:24:34.474004" elapsed="3.619793"/>
</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-04-17T03:24:29.569679" elapsed="8.524194"/>
</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-04-17T03:24:38.098498" elapsed="0.000350"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:24:38.098099" elapsed="0.000853"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:24:38.100466" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:38.100285" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:38.100250" elapsed="0.000323"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:24:38.107733" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:38.107565" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:38.107536" elapsed="0.000302"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:24:38.109198" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:24:38.108718" elapsed="0.000510"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:24:38.109799" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:24:38.109447" elapsed="0.000381"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:24:38.109873" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:24:38.110109" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:24:38.108222" elapsed="0.001920"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:24:38.118255" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:38.118126" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:38.118103" 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-04-17T03:24:38.119614" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:38.119505" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:38.119487" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:24:38.120201" level="INFO">${karaf_connection_index} = 20</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:24:38.119843" elapsed="0.000385"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:38.120633" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:24:38.120400" elapsed="0.000262"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:24:38.121489" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:24:38.121203" elapsed="0.001024">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:24:38.122430" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:24:38.122476" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:38.120830" elapsed="0.001670"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:24:38.123290" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:24:38.123037" elapsed="0.000939">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:24:38.124169" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:24:38.124217" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:38.122675" elapsed="0.001565"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:24:38.125221" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC1_Configure_iBGP_Peer"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:24:38.124561" elapsed="0.000933">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC1_Configure_iBGP_Peer"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:24:38.124319" elapsed="0.001246">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC1_Configure_iBGP_Peer"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:24:38.124298" elapsed="0.001388">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC1_Configure_iBGP_Peer"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:38.125869" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:38.126124" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:38.125973" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:38.125955" elapsed="0.000245"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:24:38.126234" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:24:38.128819" elapsed="0.000172"/>
</kw>
<msg time="2026-04-17T03:24:38.129067" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:38.127763" 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-04-17T03:24:38.129489" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:38.129853" 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-04-17T03:24:38.127122" 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-04-17T03:24:38.126542" elapsed="0.003581"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:24:38.119189" elapsed="0.011019">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC1_Configure_iBGP_Peer"</status>
</kw>
<msg time="2026-04-17T03:24:38.130311" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:24:38.130354" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC1_Configure_iBGP_Peer"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:38.118513" elapsed="0.011864"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:24:38.130563" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:38.130455" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:38.130436" elapsed="0.000193"/>
</if>
<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-04-17T03:24:38.131466" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:38.131361" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:38.131342" elapsed="0.000193"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:38.131835" level="INFO">index=15
host=10.30.171.238
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-04-17T03:24:38.132038" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
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-04-17T03:24:38.131700" elapsed="0.000367"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:38.132494" level="INFO">{1: 20}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:38.132225" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:38.132965" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:38.132698" elapsed="0.000312"/>
</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-04-17T03:24:38.133572" elapsed="0.000315"/>
</kw>
<msg time="2026-04-17T03:24:38.134004" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:24:38.134051" level="INFO">${old_connection_index} = 20</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:38.133176" elapsed="0.000897"/>
</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-04-17T03:24:38.134912" elapsed="0.000214"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:24:38.136328" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:24:38.135788" elapsed="0.001481">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:38.135298" elapsed="0.002069"/>
</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-04-17T03:24:38.138049" elapsed="0.000282"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:38.137545" elapsed="0.000873"/>
</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-04-17T03:24:38.134383" elapsed="0.004080"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:38.134149" elapsed="0.004438"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:38.134130" elapsed="0.004486"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:24:38.139611" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:24:38.139290" elapsed="0.000347"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:24:38.139689" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:24:38.139860" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:24:38.138848" elapsed="0.001038"/>
</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-04-17T03:24:38.140066" elapsed="0.000442"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:38.140810" level="INFO">index=21
host=10.30.170.120
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-04-17T03:24:38.140910" level="INFO">${karaf_connection_object} = index=21
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:24:38.140689" elapsed="0.000265"/>
</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-04-17T03:24:38.141109" elapsed="0.002829"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:24:38.144502" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:24:38.145833" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:24:38.144187" elapsed="0.002122">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:24:38.161447" elapsed="0.000456"/>
</kw>
<msg time="2026-04-17T03:24:38.162033" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:38.159870" elapsed="0.002334"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:38.162374" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:38.162543" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:24:38.147428" elapsed="0.015202"/>
</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-04-17T03:24:38.146670" elapsed="0.016010"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:24:38.131061" elapsed="0.031714">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:38.163614" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:24:38.163694" elapsed="0.000024"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:24:38.117625" elapsed="0.046191">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:24:38.163949" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:24:38.163999" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:38.110692" elapsed="0.053330"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:38.164388" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:38.164111" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:38.164089" elapsed="0.000379"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:24:38.110465" elapsed="0.054028"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:24:38.110214" elapsed="0.054314"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:24:38.107064" elapsed="0.057527"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:24:38.099839" elapsed="0.064882"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:38.099181" elapsed="0.065589"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:24:38.094847" elapsed="0.069980"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:24:38.166036" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | BGP_NAME=example-bgp-peer | IP=10.30.171.238 | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=exam...</msg>
<var>&amp;{mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</arg>
<arg>BGP_NAME=${BGP_PEER_NAME}</arg>
<arg>IP=${TOOLS_SYSTEM_IP}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>INITIATE=false</arg>
<arg>BGP_RIB=${RIB_INSTANCE}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:24:38.165072" elapsed="0.000994"/>
</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-04-17T03:24:38.202749" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:38.202287" elapsed="0.000498"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:24:38.203646" 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-04-17T03:24:38.203356" elapsed="0.000367">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-04-17T03:24:38.203819" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:24:38.202995" elapsed="0.000849"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:24:38.204445" 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-04-17T03:24:38.204035" elapsed="0.000436"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:24:38.204785" 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-04-17T03:24:38.204986" 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-04-17T03:24:38.204638" elapsed="0.000376"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:38.205430" 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-04-17T03:24:38.205175" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:38.206615" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.238', '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-04-17T03:24:38.206344" elapsed="0.000317"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:24:38.207126" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:24:38.206831" elapsed="0.000320"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:24:38.207837" 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-04-17T03:24:38.207535" elapsed="0.000328"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:24:38.208646" 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-04-17T03:24:38.208415" elapsed="0.000258"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:24:38.208726" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:24:38.208892" 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-04-17T03:24:38.208085" 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-04-17T03:24:38.209097" elapsed="0.000245"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-04-17T03:24:38.207393" elapsed="0.001990"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:24:38.209998" 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-04-17T03:24:38.209668" elapsed="0.000357"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:24:38.210987" 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-04-17T03:24:38.210746" elapsed="0.000268"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:24:38.211067" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:24:38.211225" 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-04-17T03:24:38.210348" 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-04-17T03:24:38.211459" elapsed="0.000240"/>
</kw>
<var name="${key}">BGP_NAME</var>
<var name="${value}">example-bgp-peer</var>
<status status="PASS" start="2026-04-17T03:24:38.209496" elapsed="0.002250"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:24:38.212428" level="INFO">${value} = 10.30.171.238</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:24:38.212079" elapsed="0.000376"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:24:38.213421" level="INFO">${encoded} = 10.30.171.238</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:24:38.213122" elapsed="0.000335"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:24:38.213523" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:24:38.213785" level="INFO">${encoded_value} = 10.30.171.238</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:24:38.212666" elapsed="0.001153"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:24:38.214059" elapsed="0.000614"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.238</var>
<status status="PASS" start="2026-04-17T03:24:38.211889" elapsed="0.002842"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:24:38.215477" 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-04-17T03:24:38.215065" elapsed="0.000439"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:24:38.216404" 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-04-17T03:24:38.216055" elapsed="0.000375"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:24:38.216480" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:24:38.216636" 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-04-17T03:24:38.215709" elapsed="0.000951"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:24:38.216823" elapsed="0.000271"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:24:38.214853" elapsed="0.002295"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:24:38.217749" 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-04-17T03:24:38.217408" elapsed="0.000369"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:24:38.218550" 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-04-17T03:24:38.218335" elapsed="0.000250"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:24:38.218635" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:24:38.218787" 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-04-17T03:24:38.217997" elapsed="0.000814"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:24:38.218982" elapsed="0.000224"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:24:38.217269" elapsed="0.001977"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:24:38.219986" 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-04-17T03:24:38.219573" elapsed="0.000445"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:24:38.220971" 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-04-17T03:24:38.220730" elapsed="0.000269"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:24:38.221051" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:24:38.221216" 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-04-17T03:24:38.220271" elapsed="0.000976"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:24:38.221430" elapsed="0.000253"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:24:38.219385" elapsed="0.002341"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:24:38.222301" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:24:38.221999" elapsed="0.000327"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:24:38.223148" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:24:38.222912" elapsed="0.000262"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:24:38.223223" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:24:38.223375" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:24:38.222590" elapsed="0.000812"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:24:38.223569" elapsed="0.000227"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:24:38.221844" elapsed="0.001994"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:24:38.224400" 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-04-17T03:24:38.224102" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:24:38.225164" 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-04-17T03:24:38.224951" elapsed="0.000239"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:24:38.225238" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:24:38.225389" 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-04-17T03:24:38.224613" 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-04-17T03:24:38.225574" elapsed="0.000252"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:24:38.223965" elapsed="0.001902"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:24:38.226437" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:24:38.226132" elapsed="0.000331"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:24:38.227387" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:24:38.227177" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:24:38.227460" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:24:38.227610" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:24:38.226652" elapsed="0.000982"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:24:38.227788" elapsed="0.000241"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:24:38.225994" elapsed="0.002075"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:24:38.228615" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:24:38.228316" elapsed="0.000325"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:24:38.229384" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:24:38.229175" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:24:38.229457" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:24:38.229624" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:24:38.228829" elapsed="0.000820"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:24:38.229803" elapsed="0.000240"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:24:38.228179" elapsed="0.001905"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:24:38.207204" elapsed="0.022916"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:24:38.230164" elapsed="0.000027"/>
</return>
<msg time="2026-04-17T03:24:38.230330" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.238', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': ...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:24:38.206000" elapsed="0.024357"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:38.205561" elapsed="0.024827"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:38.230579" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:38.230418" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:38.205534" elapsed="0.025123"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:24:38.231605" 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-04-17T03:24:38.230811" elapsed="0.000823"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:24:38.231730" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:24:38.201413" elapsed="0.030450"/>
</kw>
<msg time="2026-04-17T03:24:38.231952" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:38.187701" elapsed="0.044310"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:24:38.245023" 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/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-04-17T03:24:38.257914" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:24:38.270886" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:38.271187" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:38.271389" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:38.271905" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:38.271710" elapsed="0.000282"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:38.271679" 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-04-17T03:24:38.272195" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:38.272369" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:38.272574" elapsed="0.000024"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:24:38.271628" elapsed="0.001004"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:24:38.271474" elapsed="0.001187"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:38.272816" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:38.272896" elapsed="0.000022"/>
</return>
<msg time="2026-04-17T03:24:38.273107" 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-04-17T03:24:38.183012" elapsed="0.090125"/>
</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-04-17T03:24:38.301898" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:38.301416" elapsed="0.000532"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:24:38.302767" 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-04-17T03:24:38.302505" elapsed="0.000341">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-04-17T03:24:38.302959" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:24:38.302142" elapsed="0.000844"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:24:38.303559" 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-04-17T03:24:38.303160" elapsed="0.000427"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:24:38.303900" 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-04-17T03:24:38.304090" 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-04-17T03:24:38.303755" elapsed="0.000365"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:38.304621" 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-04-17T03:24:38.304307" elapsed="0.000396"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-17T03:24:38.305192" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:38.304795" elapsed="0.000458"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:24:38.305830" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.238', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': ...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:38.305440" elapsed="0.000421"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:38.305280" elapsed="0.000617"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:38.304768" elapsed="0.001150"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:24:38.306957" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.238&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflec...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:24:38.306097" elapsed="0.000893"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:24:38.307045" 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//bgp_peer.vanadium/${file_name} 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-04-17T03:24:38.300670" elapsed="0.006521"/>
</kw>
<msg time="2026-04-17T03:24:38.307253" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:38.286639" elapsed="0.020665"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:24:38.320488" elapsed="0.000043"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} 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-04-17T03:24:38.334084" 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-04-17T03:24:38.347232" elapsed="0.000041"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:38.347498" 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-04-17T03:24:38.347690" 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-04-17T03:24:38.348139" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:38.347979" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:38.347959" 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-04-17T03:24:38.348371" 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-04-17T03:24:38.348546" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:38.348716" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:24:38.347905" elapsed="0.000864"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:24:38.347775" elapsed="0.001022"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:38.348964" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:38.349045" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:24:38.349220" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.238&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflec...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:24:38.283604" elapsed="0.065647"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:24:38.350802" 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-04-17T03:24:38.350487" elapsed="0.000395">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-04-17T03:24:38.350996" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:24:38.350049" elapsed="0.000972"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:38.351371" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:38.351092" elapsed="0.000343"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:24:38.352316" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:38.351703" elapsed="0.000641"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:38.351467" elapsed="0.000915"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:38.351075" elapsed="0.001332"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:24:38.355010" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:24:38.352612" elapsed="0.002425"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:24:38.355091" elapsed="0.000102"/>
</return>
<msg time="2026-04-17T03:24:38.355329" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:24:38.349652" elapsed="0.005703"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:38.357062" 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.238</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:38.356725" elapsed="0.000403"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:38.357663" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.238&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-04-17T03:24:38.357339" elapsed="0.000403"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:38.358188" 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-04-17T03:24:38.357918" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:38.358637" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:38.358392" elapsed="0.000288"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:24:38.359539" 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-04-17T03:24:38.359329" elapsed="0.000237"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:24:38.359974" 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-04-17T03:24:38.359743" elapsed="0.000261"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:24:38.360173" elapsed="0.000238"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:38.360856" 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-04-17T03:24:38.360595" elapsed="0.000306"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:24:38.360964" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:24:38.361132" 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-04-17T03:24:38.358891" elapsed="0.002266"/>
</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-04-17T03:24:38.367354" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:24:38.569127" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:24:38.972521" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:24:38.975871" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:24:38.363760" elapsed="0.619065">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:24:38.361251" elapsed="0.622384">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:38.984671" elapsed="0.000071"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:38.983883" elapsed="0.000990"/>
</branch>
<status status="FAIL" start="2026-04-17T03:24:38.361225" elapsed="0.623743">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:38.986281" elapsed="0.000099"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:38.986704" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:38.986603" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:38.986550" elapsed="0.000324"/>
</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-04-17T03:24:38.987299" elapsed="0.000056"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:24:38.987474" elapsed="0.000039"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:24:38.355800" elapsed="0.632018">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:38.988059" elapsed="0.000042"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:24:38.171371" elapsed="0.816941">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:38.989114" elapsed="0.000062"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:38.988589" elapsed="0.000761"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:38.988548" elapsed="0.003588"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:38.992196" elapsed="0.000027"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}bgp_peer</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Put_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-04-17T03:24:38.166357" elapsed="0.826019">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:24:38.994444" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:38.993837" elapsed="0.000694"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:38.993813" elapsed="0.000752"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:38.994789" elapsed="0.000590"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:24:39.002953" 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-04-17T03:24:39.002378" elapsed="0.000620"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-17T03:24:39.003225" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:39.003076" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:39.003056" elapsed="0.000232"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:24:39.003750" 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-04-17T03:24:39.003441" elapsed="0.000336"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:24:39.004298" level="INFO">${reference} = bgpcep_userfeatures_txt_Ibgp_Peer_Lsp_TC1_Configure_iBGP_Peer</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-04-17T03:24:39.003960" elapsed="0.000365"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-17T03:24:39.004687" level="INFO">${reference} = bgpcep_userfeatures_txt_ibgp_peer_lsp_tc1_configure_ibgp_peer</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-17T03:24:39.004491" elapsed="0.000221"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:24:39.005282" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"bgpcep_userfeatures_txt_ibgp_peer_lsp_tc1_configure_ibgp_peer"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:39.004873" elapsed="0.000442"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:24:39.005823" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=bgpcep_userfeatures_txt_ibgp_peer_lsp_tc1_configure_ibgp_peer&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:39.005500" elapsed="0.000351"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-17T03:24:39.006493" 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_tc1_configure_ibgp_peer"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=bgpcep_userfeatures_txt_ibgp_peer_lsp_tc1_configure_ibgp_peer&amp;order=bug_status"

ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-17T03:24:39.006036" elapsed="0.000511"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:39.007060" level="INFO">... click for list of related bugs or create a new one if needed (with the
"bgpcep_userfeatures_txt_ibgp_peer_lsp_tc1_configure_ibgp_peer"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=bgpcep_userfeatures_txt_ibgp_peer_lsp_tc1_configure_ibgp_peer&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-04-17T03:24:39.006710" elapsed="0.000422"/>
</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-04-17T03:24:39.001898" elapsed="0.005292"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:38.993538" elapsed="0.013708"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-17T03:24:38.992883" elapsed="0.014405"/>
</kw>
<doc>Configure BGP peer module with initiate-connection set to false.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:24:38.093986" elapsed="0.913344">... click for list of related bugs or create a new one if needed (with the
"bgpcep_userfeatures_txt_ibgp_peer_lsp_tc1_configure_ibgp_peer"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=bgpcep_userfeatures_txt_ibgp_peer_lsp_tc1_configure_ibgp_peer&amp;order=bug_status"

ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:24:39.011171" elapsed="0.000400"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:24:39.010662" elapsed="0.001042"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:24:39.013685" elapsed="0.000067"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:39.013494" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:39.013462" elapsed="0.000387"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:24:39.021155" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:39.021012" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:39.020983" elapsed="0.000283"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:24:39.022712" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:24:39.022147" elapsed="0.000598"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:24:39.023404" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:24:39.022976" elapsed="0.000466"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:24:39.023502" elapsed="0.000047"/>
</return>
<msg time="2026-04-17T03:24:39.023688" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:24:39.021686" elapsed="0.002028"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:24:39.030857" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:39.030659" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:39.030619" elapsed="0.000348"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:24:39.032545" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:39.032396" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:39.032361" elapsed="0.000255"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:24:39.033415" level="INFO">${karaf_connection_index} = 21</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:24:39.032823" elapsed="0.000634"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:39.033896" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:24:39.033644" elapsed="0.000302"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:24:39.034958" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:24:39.034609" elapsed="0.001186">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:24:39.036061" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:24:39.036109" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:39.034165" elapsed="0.001980"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:24:39.036989" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:24:39.036707" elapsed="0.001111">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:24:39.038062" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:24:39.038111" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:39.036326" elapsed="0.001808"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:24:39.039268" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC1_Check_Example_Bgp_Rib_Is_Empty"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:24:39.038478" elapsed="0.000861">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC1_Check_Example_Bgp_Rib_Is_Empty"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:24:39.038223" elapsed="0.001211">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC1_Check_Example_Bgp_Rib_Is_Empty"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:24:39.038196" elapsed="0.001679">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC1_Check_Example_Bgp_Rib_Is_Empty"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:39.040121" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:39.040370" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:39.040217" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:39.040199" elapsed="0.000250"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:24:39.040498" elapsed="0.000021"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:24:39.043592" elapsed="0.000169"/>
</kw>
<msg time="2026-04-17T03:24:39.043831" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:39.042359" elapsed="0.001775"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:39.044485" elapsed="0.000093"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:39.045005" 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-04-17T03:24:39.041529" elapsed="0.003705"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:24:39.040832" 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="FAIL" start="2026-04-17T03:24:39.032020" elapsed="0.013390">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC1_Check_Example_Bgp_Rib_Is_Empty"</status>
</kw>
<msg time="2026-04-17T03:24:39.045522" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:24:39.045566" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC1_Check_Example_Bgp_Rib_Is_Empty"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:39.031171" elapsed="0.014419"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:24:39.045784" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:39.045670" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:39.045650" elapsed="0.000201"/>
</if>
<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-04-17T03:24:39.046730" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:39.046622" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:39.046605" elapsed="0.000191"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:39.047135" level="INFO">index=15
host=10.30.171.238
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-04-17T03:24:39.047245" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
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-04-17T03:24:39.046983" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:39.047766" level="INFO">{1: 21}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:39.047483" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:39.048316" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:39.047988" elapsed="0.000409"/>
</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-04-17T03:24:39.049109" elapsed="0.000486"/>
</kw>
<msg time="2026-04-17T03:24:39.049738" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:24:39.049787" level="INFO">${old_connection_index} = 21</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:39.048590" elapsed="0.001221"/>
</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-04-17T03:24:39.051115" elapsed="0.000361"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:24:39.053241" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:24:39.052591" elapsed="0.001862">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:39.051850" elapsed="0.002760"/>
</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-04-17T03:24:39.055456" elapsed="0.000339"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:39.054847" elapsed="0.001053"/>
</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-04-17T03:24:39.050217" elapsed="0.005750"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:39.049906" elapsed="0.006121"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:39.049883" elapsed="0.006177"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:24:39.057225" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:24:39.056807" elapsed="0.000450"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:24:39.057312" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:24:39.057503" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:24:39.056333" elapsed="0.001195"/>
</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-04-17T03:24:39.057742" elapsed="0.000502"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:39.058604" level="INFO">index=22
host=10.30.170.120
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-04-17T03:24:39.058826" level="INFO">${karaf_connection_object} = index=22
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:24:39.058470" elapsed="0.000384"/>
</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-04-17T03:24:39.059062" elapsed="0.003883"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:24:39.063807" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:24:39.065368" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:24:39.063309" elapsed="0.002845">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:24:39.083623" elapsed="0.000481"/>
</kw>
<msg time="2026-04-17T03:24:39.084249" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:39.081566" elapsed="0.002874"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:39.084651" elapsed="0.000034"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:39.084847" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:24:39.067618" elapsed="0.017351"/>
</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-04-17T03:24:39.066731" elapsed="0.018342"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:24:39.046310" elapsed="0.038903">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:39.085742" elapsed="0.000039"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:24:39.085840" elapsed="0.000032"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:24:39.030129" elapsed="0.055889">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:24:39.086147" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:24:39.086193" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:39.024219" elapsed="0.061997"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:39.086610" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:39.086312" elapsed="0.000352"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:39.086287" elapsed="0.000403"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:24:39.024054" elapsed="0.062662"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:24:39.023781" elapsed="0.062973"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:24:39.020459" elapsed="0.066360"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:24:39.012769" elapsed="0.074110"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:39.012084" elapsed="0.075105"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:24:39.008153" elapsed="0.079111"/>
</kw>
<kw name="Check_Example_Bgp_Rib_Does_Not_Contain" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:24:39.091363" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig</msg>
<msg time="2026-04-17T03:24:39.292746" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig</msg>
<msg time="2026-04-17T03:24:39.695093" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig</msg>
<msg time="2026-04-17T03:24:39.698604" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:24:39.088046" elapsed="0.614808">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:39.703344" elapsed="0.000055"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:39.703718" elapsed="0.000039"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>${substr}</arg>
<arg>${error_message}</arg>
<arg>values=False</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:39.704084" elapsed="0.000038"/>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>${JSONKEYSTR}</arg>
<doc>Check the example-bgp-rib does not contain the string</doc>
<status status="FAIL" start="2026-04-17T03:24:39.087529" elapsed="0.616779">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:24:39.707895" elapsed="0.000066"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:39.706489" elapsed="0.001539"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:39.706455" elapsed="0.001625"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:39.708421" elapsed="0.000861"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:24:39.715548" 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-04-17T03:24:39.715020" elapsed="0.000561"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-17T03:24:39.715835" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:39.715678" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:39.715653" elapsed="0.000251"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:24:39.716397" 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-04-17T03:24:39.716081" elapsed="0.000345"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:24:39.716970" level="INFO">${reference} = bgpcep_userfeatures_txt_Ibgp_Peer_Lsp_TC1_Check_Example_Bgp_Rib_Is_Empty</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-04-17T03:24:39.716636" elapsed="0.000363"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-17T03:24:39.717415" level="INFO">${reference} = bgpcep_userfeatures_txt_ibgp_peer_lsp_tc1_check_example_bgp_rib_is_empty</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-17T03:24:39.717203" elapsed="0.000239"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:24:39.718059" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"bgpcep_userfeatures_txt_ibgp_peer_lsp_tc1_check_example_bgp_rib_is_empty"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:39.717634" elapsed="0.000462"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:24:39.718659" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=bgpcep_userfeatures_txt_ibgp_peer_lsp_tc1_check_example_bgp_rib_is_empty&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:39.718278" elapsed="0.000419"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-17T03:24:39.719575" 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_tc1_check_example_bgp_rib_is_empty"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=bgpcep_userfeatures_txt_ibgp_peer_lsp_tc1_check_example_bgp_rib_is_empty&amp;order=bug_status"

ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-17T03:24:39.718917" elapsed="0.000718"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:39.720229" level="INFO">... click for list of related bugs or create a new one if needed (with the
"bgpcep_userfeatures_txt_ibgp_peer_lsp_tc1_check_example_bgp_rib_is_empty"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=bgpcep_userfeatures_txt_ibgp_peer_lsp_tc1_check_example_bgp_rib_is_empty&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-04-17T03:24:39.719822" elapsed="0.000460"/>
</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-04-17T03:24:39.714554" elapsed="0.005943"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:39.706137" elapsed="0.014427"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-17T03:24:39.705262" elapsed="0.015356"/>
</kw>
<doc>Check RIB for none linkstate-routes</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:24:39.007605" elapsed="0.713080">... click for list of related bugs or create a new one if needed (with the
"bgpcep_userfeatures_txt_ibgp_peer_lsp_tc1_check_example_bgp_rib_is_empty"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=bgpcep_userfeatures_txt_ibgp_peer_lsp_tc1_check_example_bgp_rib_is_empty&amp;order=bug_status"

ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:24:39.724682" elapsed="0.000307"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:24:39.724361" elapsed="0.000695"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:24:39.726296" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:39.726131" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:39.726104" 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-04-17T03:24:39.731947" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:39.731769" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:39.731741" elapsed="0.000290"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:24:39.733360" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:24:39.732806" elapsed="0.000593"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:24:39.734013" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:24:39.733599" elapsed="0.000450"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:24:39.734099" elapsed="0.000212"/>
</return>
<msg time="2026-04-17T03:24:39.734494" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:24:39.732346" elapsed="0.002181"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:24:39.742267" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:39.742095" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:39.742061" elapsed="0.000328"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:24:39.744066" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:39.743912" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:39.743891" elapsed="0.000249"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:24:39.744672" level="INFO">${karaf_connection_index} = 22</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:24:39.744304" elapsed="0.000400"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:39.745180" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:24:39.744925" elapsed="0.000282"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:24:39.746137" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:24:39.745786" elapsed="0.001112">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:24:39.747117" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:24:39.747164" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:39.745380" elapsed="0.001808"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:24:39.748041" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:24:39.747733" elapsed="0.001053">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:24:39.749033" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:24:39.749082" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:39.747367" elapsed="0.001810"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:24:39.750299" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC1_Connect_BGP_Peer"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:24:39.749525" elapsed="0.000861">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC1_Connect_BGP_Peer"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:24:39.749267" elapsed="0.001220">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC1_Connect_BGP_Peer"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:24:39.749244" elapsed="0.001295">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC1_Connect_BGP_Peer"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:39.750740" elapsed="0.000032"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:39.751014" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:39.750844" elapsed="0.000252"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:39.750825" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:24:39.751177" 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-04-17T03:24:39.755411" elapsed="0.000337"/>
</kw>
<msg time="2026-04-17T03:24:39.755885" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:39.753151" elapsed="0.002991"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:39.756627" elapsed="0.000152"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:39.757409" elapsed="0.000153"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:24:39.752204" elapsed="0.005571"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:24:39.751554" elapsed="0.006323"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:24:39.743528" elapsed="0.014539">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC1_Connect_BGP_Peer"</status>
</kw>
<msg time="2026-04-17T03:24:39.758282" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:24:39.758379" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC1_Connect_BGP_Peer"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:39.742663" elapsed="0.015768"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:24:39.758798" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:39.758587" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:39.758552" elapsed="0.000368"/>
</if>
<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-04-17T03:24:39.761302" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:39.760909" elapsed="0.000486"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:39.760825" elapsed="0.000620"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:39.762075" level="INFO">index=15
host=10.30.171.238
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-04-17T03:24:39.762291" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
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-04-17T03:24:39.761794" elapsed="0.000552"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:39.763288" level="INFO">{1: 22}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:39.762691" elapsed="0.000693"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:39.764163" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:39.763703" elapsed="0.000527"/>
</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-04-17T03:24:39.765297" elapsed="0.000420"/>
</kw>
<msg time="2026-04-17T03:24:39.765862" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:24:39.765948" level="INFO">${old_connection_index} = 22</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:39.764484" elapsed="0.001500"/>
</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-04-17T03:24:39.767519" elapsed="0.000377"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:24:39.770199" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:24:39.769368" elapsed="0.002681">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:39.768259" elapsed="0.003989"/>
</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-04-17T03:24:39.773508" elapsed="0.000296"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:39.772623" elapsed="0.001266"/>
</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-04-17T03:24:39.766512" elapsed="0.007457"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:39.766092" elapsed="0.007931"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:39.766066" elapsed="0.007990"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:24:39.775336" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:24:39.774880" elapsed="0.000492"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:24:39.775444" elapsed="0.000050"/>
</return>
<msg time="2026-04-17T03:24:39.775662" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:24:39.774362" elapsed="0.001334"/>
</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-04-17T03:24:39.775917" elapsed="0.000627"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:39.777013" level="INFO">index=23
host=10.30.170.120
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-04-17T03:24:39.777161" level="INFO">${karaf_connection_object} = index=23
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:24:39.776807" elapsed="0.000393"/>
</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-04-17T03:24:39.777428" elapsed="0.003636"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:24:39.781744" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:24:39.783504" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:24:39.781350" elapsed="0.002705">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:24:39.799331" elapsed="0.000458"/>
</kw>
<msg time="2026-04-17T03:24:39.799900" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:39.797420" elapsed="0.002667"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:39.800262" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:39.800435" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:24:39.785219" elapsed="0.015301"/>
</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-04-17T03:24:39.784498" elapsed="0.016071"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:24:39.760228" elapsed="0.040436">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:39.801205" elapsed="0.000030"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:24:39.801290" 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="FAIL" start="2026-04-17T03:24:39.741515" elapsed="0.059894">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:24:39.801721" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:24:39.801765" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:39.735068" elapsed="0.066721"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:39.802274" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:39.801990" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:39.801914" elapsed="0.000441"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:24:39.734824" elapsed="0.067558"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:24:39.734593" elapsed="0.067824"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:24:39.731302" elapsed="0.071173"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:24:39.725746" elapsed="0.076790"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:39.725224" elapsed="0.077360"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:24:39.721824" elapsed="0.080816"/>
</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-04-17T03:24:39.810623" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:39.810481" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:39.810454" elapsed="0.000246"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:24:39.811791" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:24:39.811379" elapsed="0.000440"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:24:39.812312" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:24:39.812003" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:24:39.812382" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:24:39.812541" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:24:39.810976" elapsed="0.001589"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:24:39.818897" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:39.818773" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:39.818752" 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-04-17T03:24:39.820226" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:39.820118" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:39.820100" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:24:39.820696" level="INFO">${karaf_connection_index} = 23</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:24:39.820451" elapsed="0.000273"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:39.821167" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:24:39.820946" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:24:39.822163" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:24:39.821919" elapsed="0.000943">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:24:39.822998" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:24:39.823045" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:39.821372" elapsed="0.001697"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:24:39.823794" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:24:39.823603" elapsed="0.000710">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:24:39.824426" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:24:39.824472" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:39.823245" elapsed="0.001252"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:24:39.825274" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Error = WELL_KNOWN_ATTR_MISSING is EXPECTED in this test case, and should be thrown when missing mandatory attributes."</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:24:39.824921" elapsed="0.000414">Failed to send the command: log:log "ROBOT MESSAGE: Error = WELL_KNOWN_ATTR_MISSING is EXPECTED in this test case, and should be thrown when missing mandatory attributes."</status>
</kw>
<status status="FAIL" start="2026-04-17T03:24:39.824582" elapsed="0.000907">Failed to send the command: log:log "ROBOT MESSAGE: Error = WELL_KNOWN_ATTR_MISSING is EXPECTED in this test case, and should be thrown when missing mandatory attributes."</status>
</branch>
<status status="FAIL" start="2026-04-17T03:24:39.824558" elapsed="0.000967">Failed to send the command: log:log "ROBOT MESSAGE: Error = WELL_KNOWN_ATTR_MISSING is EXPECTED in this test case, and should be thrown when missing mandatory attributes."</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:39.825694" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:39.825942" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:39.825780" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:39.825763" elapsed="0.000257"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:24:39.826055" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:24:39.828017" elapsed="0.000218"/>
</kw>
<msg time="2026-04-17T03:24:39.828392" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:39.827354" elapsed="0.001107"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:39.828627" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:39.828796" elapsed="0.000038"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:24:39.826969" elapsed="0.001929"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:24:39.826362" elapsed="0.002605"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:24:39.819792" elapsed="0.009257">Failed to send the command: log:log "ROBOT MESSAGE: Error = WELL_KNOWN_ATTR_MISSING is EXPECTED in this test case, and should be thrown when missing mandatory attributes."</status>
</kw>
<msg time="2026-04-17T03:24:39.829155" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:24:39.829199" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Error = WELL_KNOWN_ATTR_MISSING is EXPECTED in this test case, and should be thrown when missing mandatory attributes."</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:39.819163" elapsed="0.010059"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:24:39.829411" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:39.829300" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:39.829281" elapsed="0.000200"/>
</if>
<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-04-17T03:24:39.830539" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:39.830432" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:39.830413" elapsed="0.000193"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:39.830900" level="INFO">index=15
host=10.30.171.238
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-04-17T03:24:39.831034" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
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-04-17T03:24:39.830767" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:39.831499" level="INFO">{1: 23}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:39.831219" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:39.831960" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:39.831700" elapsed="0.000306"/>
</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-04-17T03:24:39.832575" elapsed="0.000186"/>
</kw>
<msg time="2026-04-17T03:24:39.832877" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:24:39.832940" level="INFO">${old_connection_index} = 23</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:39.832172" elapsed="0.000793"/>
</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-04-17T03:24:39.833786" elapsed="0.000187"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:24:39.834690" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:24:39.834509" elapsed="0.000839">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:39.834159" elapsed="0.001264"/>
</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-04-17T03:24:39.836096" elapsed="0.000105"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:39.835736" elapsed="0.000511"/>
</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-04-17T03:24:39.833271" elapsed="0.003021"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:39.833041" elapsed="0.003300"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:39.833022" elapsed="0.003348"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:24:39.837344" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:24:39.837056" elapsed="0.000315"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:24:39.837427" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:24:39.837590" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:24:39.836635" elapsed="0.000980"/>
</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-04-17T03:24:39.837774" elapsed="0.000494"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:39.838571" level="INFO">index=24
host=10.30.170.120
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-04-17T03:24:39.838674" level="INFO">${karaf_connection_object} = index=24
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:24:39.838451" elapsed="0.000268"/>
</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-04-17T03:24:39.838908" elapsed="0.002419"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:24:39.841818" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:24:39.843188" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:24:39.841542" elapsed="0.002127">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:24:39.848084" elapsed="0.000225"/>
</kw>
<msg time="2026-04-17T03:24:39.848364" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:39.847395" elapsed="0.001042"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:39.848601" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:39.848770" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:24:39.844677" elapsed="0.004205"/>
</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-04-17T03:24:39.844065" elapsed="0.004885"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:24:39.829897" elapsed="0.019144">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:39.849453" elapsed="0.000033"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:24:39.849547" 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="FAIL" start="2026-04-17T03:24:39.818352" elapsed="0.031311">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:24:39.849778" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:24:39.849822" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:39.813033" elapsed="0.036812"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:39.850256" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:39.849945" elapsed="0.000384"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:39.849909" elapsed="0.000498"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:24:39.812797" elapsed="0.037638"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:24:39.812619" elapsed="0.037850"/>
</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-04-17T03:24:39.808134" elapsed="0.042396"/>
</kw>
<arg>KarafKeywords.Log_Message_To_Controller_Karaf</arg>
<arg>Error = WELL_KNOWN_ATTR_MISSING is EXPECTED in this test case, and should be thrown when missing mandatory attributes.</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:39.802819" elapsed="0.047762"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:24:39.860060" level="INFO">${start_cmd} = python3 play.py --amount 1 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --peerport=1790 --debug --logfile bgp_peer.log --bgpls True --skipattr &amp;&gt;bgp_peer.log</msg>
<var>${start_cmd}</var>
<arg>${command} ${tool_opt}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:39.859638" elapsed="0.000455"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:39.860643" level="INFO">python3 play.py --amount 1 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --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-04-17T03:24:39.860303" elapsed="0.000405"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:24:39.865028" level="INFO">python3 play.py --amount 1 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --peerport=1790 --debug --logfile bgp_peer.log --bgpls True --skipattr &amp;&gt;bgp_peer.log</msg>
<msg time="2026-04-17T03:24:39.865146" level="INFO">${output} =  python3 play.py --amount 1 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --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-04-17T03:24:39.860951" elapsed="0.004223"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:39.865641" level="INFO"> python3 play.py --amount 1 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --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-04-17T03:24:39.865358" elapsed="0.000330"/>
</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-04-17T03:24:39.859113" elapsed="0.006636"/>
</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-04-17T03:24:49.868103" 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-04-17T03:24:39.867486" elapsed="10.001426">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-04-17T03:24:49.869276" 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-04-17T03:24:39.867202" elapsed="10.002258">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-04-17T03:24:39.866755" elapsed="10.002849"/>
</kw>
<msg time="2026-04-17T03:24:49.869747" 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-04-17T03:24:39.866372" elapsed="10.003401"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-04-17T03:24:49.870004" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-04-17T03:24:49.869881" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:49.869843" elapsed="0.000252"/>
</if>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<doc>Send all output produced by the play.py utility to Robot logs.
This needs to be called if your suite detects play.py crashing and bypasses
Kill_BGP_Speaker in that case otherwise the output of play.py (which most
likely contains clues about why it crashed) will be lost.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:49.870339" elapsed="0.000028"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was seen but it was not expected yet</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:49.870520" elapsed="0.000021"/>
</kw>
<doc>Try to read SSH to see prompt, but expect to see no prompt within SSHLibrary's timeout.</doc>
<status status="PASS" start="2026-04-17T03:24:39.866065" elapsed="10.004536"/>
</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-04-17T03:24:49.872019" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:49.871594" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:49.871575" elapsed="0.000553"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:49.872285" elapsed="0.000406"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:24:49.878465" 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-04-17T03:24:49.877916" elapsed="0.000580"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-04-17T03:24:49.878867" elapsed="0.000050"/>
</return>
<status status="PASS" start="2026-04-17T03:24:49.878701" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:49.878676" elapsed="0.000355"/>
</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-04-17T03:24:49.879197" elapsed="0.000024"/>
</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-04-17T03:24:49.879388" 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-04-17T03:24:49.879584" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:49.879759" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:49.880111" elapsed="0.000025"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:49.880294" 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-04-17T03:24:49.880464" 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-04-17T03:24:49.877524" elapsed="0.003018"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:49.871379" elapsed="0.009215"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-17T03:24:49.870904" elapsed="0.009732"/>
</kw>
<doc>Connect BGP peer with advertising the routes without mandatory params like LOC_PREF.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-04-17T03:24:39.721070" elapsed="10.159612"/>
</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-04-17T03:24:49.884452" elapsed="0.000256"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:24:49.884163" 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-04-17T03:24:49.885854" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:49.885727" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:49.885706" elapsed="0.000241"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:24:49.891333" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:49.891206" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:49.891183" elapsed="0.000225"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:24:49.892574" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:24:49.892125" elapsed="0.000478"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:24:49.893119" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:24:49.892772" elapsed="0.000374"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:24:49.893190" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:24:49.893354" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:24:49.891674" elapsed="0.001704"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:24:49.902291" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:49.902148" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:49.902122" elapsed="0.000257"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:24:49.903878" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:49.903746" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:49.903722" elapsed="0.000272"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:24:49.904590" level="INFO">${karaf_connection_index} = 24</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:24:49.904208" elapsed="0.000413"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:49.905110" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:24:49.904819" elapsed="0.000320"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:24:49.906174" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:24:49.905819" elapsed="0.001060">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:24:49.907099" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:24:49.907146" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:49.905339" elapsed="0.001831"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:24:49.907953" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:24:49.907693" elapsed="0.000968">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:24:49.908853" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:24:49.908900" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:49.907344" elapsed="0.001579"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:24:49.909875" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC1_Check_Example_Bgp_Rib"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:24:49.909254" elapsed="0.000703">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC1_Check_Example_Bgp_Rib"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:24:49.909023" elapsed="0.001005">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC1_Check_Example_Bgp_Rib"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:24:49.909003" elapsed="0.001072">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC1_Check_Example_Bgp_Rib"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:49.910243" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:49.910473" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:49.910328" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:49.910311" elapsed="0.000237"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:24:49.910581" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:24:49.913309" elapsed="0.000150"/>
</kw>
<msg time="2026-04-17T03:24:49.913533" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:49.912138" elapsed="0.001527"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:49.913961" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:49.914298" 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-04-17T03:24:49.911440" elapsed="0.003040"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:24:49.910871" elapsed="0.003687"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:24:49.903390" elapsed="0.011252">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC1_Check_Example_Bgp_Rib"</status>
</kw>
<msg time="2026-04-17T03:24:49.914744" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:24:49.914801" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC1_Check_Example_Bgp_Rib"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:49.902585" elapsed="0.012240"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:24:49.915032" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:49.914900" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:49.914882" elapsed="0.000216"/>
</if>
<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-04-17T03:24:49.916177" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:49.916055" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:49.916034" elapsed="0.000210"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:49.916539" level="INFO">index=15
host=10.30.171.238
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-04-17T03:24:49.916657" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
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-04-17T03:24:49.916404" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:49.917214" level="INFO">{1: 24}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:49.916845" elapsed="0.000473"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:49.917742" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:49.917487" elapsed="0.000299"/>
</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-04-17T03:24:49.918364" elapsed="0.000281"/>
</kw>
<msg time="2026-04-17T03:24:49.918760" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:24:49.918807" level="INFO">${old_connection_index} = 24</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:49.917965" elapsed="0.000865"/>
</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-04-17T03:24:49.919729" elapsed="0.000350"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:24:49.921204" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:24:49.920758" elapsed="0.001515">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:49.920260" elapsed="0.002117"/>
</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-04-17T03:24:49.923084" elapsed="0.000324"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:49.922562" elapsed="0.000934"/>
</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-04-17T03:24:49.919194" elapsed="0.004349"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:49.918904" elapsed="0.004689"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:49.918887" elapsed="0.004736"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:24:49.924647" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:24:49.924320" elapsed="0.000355"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:24:49.924727" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:24:49.924909" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:24:49.923877" elapsed="0.001074"/>
</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-04-17T03:24:49.925119" elapsed="0.000463"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:49.925877" level="INFO">index=25
host=10.30.170.120
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-04-17T03:24:49.926001" level="INFO">${karaf_connection_object} = index=25
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:24:49.925761" elapsed="0.000275"/>
</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-04-17T03:24:49.926211" elapsed="0.002420"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:24:49.929099" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:24:49.930574" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:24:49.928807" elapsed="0.002200">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:24:49.947045" elapsed="0.000625"/>
</kw>
<msg time="2026-04-17T03:24:49.947826" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:49.944879" elapsed="0.003372"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:49.948548" elapsed="0.000045"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:49.948874" elapsed="0.000034"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:24:49.932094" elapsed="0.016950"/>
</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-04-17T03:24:49.931347" elapsed="0.017781"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:24:49.915518" elapsed="0.033769">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:49.950271" elapsed="0.000037"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:24:49.950378" elapsed="0.000029"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:24:49.901518" elapsed="0.049042">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:24:49.950710" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:24:49.950769" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:49.893776" elapsed="0.057026"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:49.951319" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:49.950908" elapsed="0.000487"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:49.950882" elapsed="0.000548"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:24:49.893617" elapsed="0.057849"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:24:49.893434" elapsed="0.058079"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:24:49.890753" elapsed="0.060837"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:24:49.885421" elapsed="0.066242"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:49.884939" elapsed="0.066774"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:24:49.881799" elapsed="0.070007"/>
</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-04-17T03:24:49.960571" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig</msg>
<msg time="2026-04-17T03:24:50.162154" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig</msg>
<msg time="2026-04-17T03:24:50.564888" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig</msg>
<msg time="2026-04-17T03:24:50.567536" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:24:49.957321" elapsed="0.616681">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:50.574658" elapsed="0.000105"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:50.575216" elapsed="0.000093"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>${substr}</arg>
<arg>${error_message}</arg>
<arg>values=False</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:50.575762" elapsed="0.000109"/>
</kw>
<arg>config-session</arg>
<arg>"linkstate-route"</arg>
<doc>Check the example-bgp-rib does not contain the string</doc>
<status status="FAIL" start="2026-04-17T03:24:49.956836" elapsed="0.619462">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:24:50.576555" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:24:50.576632" level="INFO">${output} = ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig (Caused by NewConnectionError("HT...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:49.956321" elapsed="0.620347"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-17T03:24:50.577018" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-04-17T03:24:50.576801" elapsed="0.000368"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:50.576764" elapsed="0.000433"/>
</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-04-17T03:24:50.577397" elapsed="0.000031"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:50.577633" elapsed="0.000024"/>
</kw>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="PASS" start="2026-04-17T03:24:49.955812" elapsed="0.621964"/>
</kw>
<arg>${timeout}</arg>
<arg>${refresh}</arg>
<arg>Invert_Failure</arg>
<arg>@{cell_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-17T03:24:49.955167" elapsed="0.622662"/>
</kw>
<msg time="2026-04-17T03:24:50.577886" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>${timeout}</arg>
<arg>${refresh}</arg>
<arg>Invert_Failure</arg>
<arg>@{cell_list}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:49.954759" elapsed="0.623199"/>
</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="PASS" start="2026-04-17T03:24:49.954384" elapsed="0.623683"/>
</kw>
<msg time="2026-04-17T03:24:50.578175" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:24:50.578219" level="INFO">${output} = ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig (Caused by NewConnectionError("HT...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>@{cell_sequence}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:49.953688" elapsed="0.624556"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-04-17T03:24:50.578425" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:50.578314" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:50.578297" elapsed="0.000194"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:24:50.579094" level="INFO">${output} = ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig (Caused by NewConnectionError("HT...</msg>
<var>${output}</var>
<arg>${output}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:24:50.578640" elapsed="0.000492"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:24:50.579822" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:24:50.579362" elapsed="0.000548">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>Confirm_Keyword_Fails_Within_Timeout</arg>
<arg>${timeout}</arg>
<arg>${refresh}</arg>
<arg>@{cell_list}</arg>
<doc>The response of Keyword execution is either a return value or a failure message.
This keyword calls the argument keyword and returns its failure message string,
or fails with its return value converted to string.</doc>
<status status="FAIL" start="2026-04-17T03:24:49.953266" elapsed="0.626802">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:24:50.580150" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Invert_Failure</arg>
<arg>Confirm_Keyword_Fails_Within_Timeout</arg>
<arg>${timeout}</arg>
<arg>${refresh}</arg>
<arg>@{cell_list}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="FAIL" start="2026-04-17T03:24:49.952640" elapsed="0.627565"/>
</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="FAIL" start="2026-04-17T03:24:49.952146" elapsed="0.628157">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:24:50.581783" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:50.581376" elapsed="0.000469"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:50.581356" elapsed="0.000515"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:50.582074" elapsed="0.000439"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:24:50.588406" 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-04-17T03:24:50.587890" elapsed="0.000546"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-17T03:24:50.588739" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:50.588583" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:50.588561" elapsed="0.000271"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:24:50.589399" 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-04-17T03:24:50.589071" elapsed="0.000355"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:24:50.589875" level="INFO">${reference} = bgpcep_userfeatures_txt_Ibgp_Peer_Lsp_TC1_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-04-17T03:24:50.589598" elapsed="0.000303"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-17T03:24:50.590371" level="INFO">${reference} = bgpcep_userfeatures_txt_ibgp_peer_lsp_tc1_check_example_bgp_rib</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-17T03:24:50.590123" elapsed="0.000285"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:24:50.591105" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"bgpcep_userfeatures_txt_ibgp_peer_lsp_tc1_check_example_bgp_rib"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:50.590639" elapsed="0.000502"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:24:50.591655" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=bgpcep_userfeatures_txt_ibgp_peer_lsp_tc1_check_example_bgp_rib&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:50.591314" elapsed="0.000406"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-17T03:24:50.592527" 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_tc1_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_tc1_check_example_bgp_rib&amp;order=bug_status"

ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-17T03:24:50.591964" elapsed="0.000618"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:50.593102" level="INFO">... click for list of related bugs or create a new one if needed (with the
"bgpcep_userfeatures_txt_ibgp_peer_lsp_tc1_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_tc1_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-04-17T03:24:50.592757" elapsed="0.000414"/>
</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-04-17T03:24:50.587481" elapsed="0.005776"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:50.581151" elapsed="0.012186"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-17T03:24:50.580657" elapsed="0.012737"/>
</kw>
<doc>Check RIB for not containig linkstate-route(s), because update messages were not good.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:24:49.881165" elapsed="0.712292">... click for list of related bugs or create a new one if needed (with the
"bgpcep_userfeatures_txt_ibgp_peer_lsp_tc1_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_tc1_check_example_bgp_rib&amp;order=bug_status"

ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:24:50.602086" elapsed="0.000516"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:24:50.601414" elapsed="0.001325"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:24:50.604477" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:50.604286" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:50.604248" elapsed="0.000315"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:24:50.611600" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:50.611431" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:50.611400" elapsed="0.000371"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:24:50.613352" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:24:50.612712" elapsed="0.000683"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:24:50.614103" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:24:50.613640" elapsed="0.000502"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:24:50.614304" elapsed="0.000054"/>
</return>
<msg time="2026-04-17T03:24:50.614538" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:24:50.612173" elapsed="0.002400"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:24:50.622607" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:50.622441" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:50.622410" elapsed="0.000301"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:24:50.624268" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:50.624145" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:50.624119" elapsed="0.000219"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:24:50.624838" level="INFO">${karaf_connection_index} = 25</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:24:50.624499" elapsed="0.000369"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:50.625340" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:24:50.625075" elapsed="0.000299"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:24:50.626280" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:24:50.625908" elapsed="0.001475">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:24:50.627629" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:24:50.627715" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:50.625547" elapsed="0.002201"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:24:50.628838" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:24:50.628490" elapsed="0.001260">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:24:50.629970" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:24:50.630028" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:50.628018" elapsed="0.002044"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:24:50.631111" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC1_Disconnect_BGP_Peer"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:24:50.630417" elapsed="0.000760">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC1_Disconnect_BGP_Peer"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:24:50.630167" elapsed="0.001087">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC1_Disconnect_BGP_Peer"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:24:50.630142" elapsed="0.001148">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC1_Disconnect_BGP_Peer"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:50.631500" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:50.631806" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:50.631599" elapsed="0.000268"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:50.631580" elapsed="0.000311"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:24:50.631943" elapsed="0.000020"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:24:50.634923" elapsed="0.000181"/>
</kw>
<msg time="2026-04-17T03:24:50.635180" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:50.633661" elapsed="0.001698"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:50.635728" elapsed="0.000085"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:50.636112" 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-04-17T03:24:50.632914" elapsed="0.003393"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:24:50.632273" elapsed="0.004108"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:24:50.623782" elapsed="0.012768">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC1_Disconnect_BGP_Peer"</status>
</kw>
<msg time="2026-04-17T03:24:50.636669" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:24:50.636714" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC1_Disconnect_BGP_Peer"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:50.622981" elapsed="0.013758"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:24:50.637046" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:50.636824" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:50.636803" elapsed="0.000339"/>
</if>
<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-04-17T03:24:50.638150" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:50.638011" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:50.637989" elapsed="0.000236"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:50.638542" level="INFO">index=15
host=10.30.171.238
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-04-17T03:24:50.638692" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
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-04-17T03:24:50.638388" elapsed="0.000342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:50.639233" level="INFO">{1: 25}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:50.638896" elapsed="0.000385"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:50.639717" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:50.639443" elapsed="0.000332"/>
</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-04-17T03:24:50.640428" elapsed="0.000315"/>
</kw>
<msg time="2026-04-17T03:24:50.640848" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:24:50.640905" level="INFO">${old_connection_index} = 25</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:50.639992" elapsed="0.001092"/>
</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-04-17T03:24:50.642009" elapsed="0.000237"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:24:50.643563" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:24:50.643000" elapsed="0.002224">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:50.642428" elapsed="0.002937"/>
</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-04-17T03:24:50.646327" elapsed="0.000390"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:50.645633" elapsed="0.001205"/>
</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-04-17T03:24:50.641444" elapsed="0.005463"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:50.641174" elapsed="0.005825"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:50.641153" elapsed="0.005889"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:24:50.648358" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:24:50.647905" elapsed="0.000490"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:24:50.648464" elapsed="0.000052"/>
</return>
<msg time="2026-04-17T03:24:50.648692" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:24:50.647367" elapsed="0.001361"/>
</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-04-17T03:24:50.648992" elapsed="0.000569"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:50.650042" level="INFO">index=26
host=10.30.170.120
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-04-17T03:24:50.650182" level="INFO">${karaf_connection_object} = index=26
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:24:50.649841" elapsed="0.000376"/>
</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-04-17T03:24:50.650436" elapsed="0.003031"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:24:50.654029" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:24:50.655296" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:24:50.653720" elapsed="0.002076">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:24:50.671137" elapsed="0.000429"/>
</kw>
<msg time="2026-04-17T03:24:50.671728" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:50.669380" elapsed="0.002521"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:50.672095" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:50.672270" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:24:50.656805" elapsed="0.015553"/>
</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-04-17T03:24:50.656191" elapsed="0.016220"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:24:50.637649" elapsed="0.034862">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:50.673159" elapsed="0.000030"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:24:50.673245" elapsed="0.000024"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:24:50.621875" elapsed="0.051495">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:24:50.673496" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:24:50.673541" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:50.615179" elapsed="0.058386"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:50.673947" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:50.673657" elapsed="0.000350"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:50.673635" elapsed="0.000408"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:24:50.614946" elapsed="0.059134"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:24:50.614657" elapsed="0.059473"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:24:50.610854" elapsed="0.063345"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:24:50.603891" elapsed="0.070369"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:50.603085" elapsed="0.071226"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:24:50.594469" elapsed="0.079907"/>
</kw>
<kw name="Stop_Console_Tool" owner="BGPcliKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:24:50.675638" 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-04-17T03:24:50.675307" elapsed="0.000383"/>
</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-04-17T03:24:50.675856" elapsed="0.000347"/>
</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-04-17T03:24:50.675025" elapsed="0.001240"/>
</kw>
<kw name="Read" owner="SSHLibrary">
<msg time="2026-04-17T03:24:52.677106" level="INFO">^C
[?2004h[jenkins@releng-26932-188-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-04-17T03:24:52.677434" level="INFO">${output} = ^C
[?2004h[jenkins@releng-26932-188-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-04-17T03:24:50.676433" elapsed="2.001066"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:52.678754" level="INFO">^C
[?2004h[jenkins@releng-26932-188-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-04-17T03:24:52.678024" elapsed="0.000881"/>
</kw>
<doc>Stop the tool if still running.</doc>
<status status="PASS" start="2026-04-17T03:24:50.674670" elapsed="2.004430"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:24:52.694684" level="INFO">Executing command 'cat bgp_peer.log'.</msg>
<msg time="2026-04-17T03:24:52.708236" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:24:52.708476" level="INFO">${output_log} = 2026-04-17 03:24:39,930 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:24:39,930 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.238
2026-04-17 03:24:39,930 DEBUG BGP-Thr...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-17T03:24:52.694435" elapsed="0.014101"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:52.709638" level="INFO">2026-04-17 03:24:39,930 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:24:39,930 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.238
2026-04-17 03:24:39,930 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-04-17 03:24:39,930 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.120
2026-04-17 03:24:39,930 DEBUG BGP-Thread-1 (job): Remote port: 1790
Exception in thread Thread-1 (job):
Traceback (most recent call last):
  File "/usr/lib/python3.10/threading.py", line 1016, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.10/threading.py", line 953, in run
    self._target(*self._args, **self._kwargs)
  File "/home/jenkins/play.py", line 2406, in job
    bgp_socket = establish_connection(arguments)
  File "/home/jenkins/play.py", line 284, in establish_connection
    talking_socket.connect((str(arguments.peerip), arguments.peerport))
ConnectionRefusedError: [Errno 111] Connection refused
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-04-17T03:24:52.708986" elapsed="0.000782"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-04-17T03:24:52.711094" 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-04-17T03:24:52.710258" elapsed="0.000968"/>
</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-04-17T03:24:52.693894" elapsed="0.017472"/>
</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-04-17T03:24:52.714331" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:52.713412" elapsed="0.001059"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:52.713366" elapsed="0.001165"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:52.714964" elapsed="0.000735"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:24:52.722995" 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-04-17T03:24:52.722370" elapsed="0.000665"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-04-17T03:24:52.723344" elapsed="0.000045"/>
</return>
<status status="PASS" start="2026-04-17T03:24:52.723142" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:52.723116" elapsed="0.000350"/>
</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-04-17T03:24:52.723698" elapsed="0.000041"/>
</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-04-17T03:24:52.724021" elapsed="0.000038"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:52.724326" elapsed="0.000031"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:52.724573" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:52.724812" elapsed="0.000028"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:52.725080" 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-04-17T03:24:52.725352" elapsed="0.000031"/>
</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-04-17T03:24:52.721906" elapsed="0.003565"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:52.712888" elapsed="0.012680"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-17T03:24:52.712034" elapsed="0.013610"/>
</kw>
<doc>Stop BGP peer &amp; store logs</doc>
<tag>critical</tag>
<status status="PASS" start="2026-04-17T03:24:50.593898" elapsed="2.131801"/>
</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-04-17T03:24:52.730421" elapsed="0.000213"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:24:52.730150" elapsed="0.000610"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:24:52.731799" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:52.731689" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:52.731670" elapsed="0.000211"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:24:52.736963" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:52.736842" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:52.736824" elapsed="0.000207"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:24:52.738055" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:24:52.737651" elapsed="0.000431"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:24:52.738545" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:24:52.738248" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:24:52.738615" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:24:52.738786" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:24:52.737267" elapsed="0.001543"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:24:52.744458" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:52.744350" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:52.744332" 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-04-17T03:24:52.745708" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:52.745602" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:52.745584" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:24:52.746395" level="INFO">${karaf_connection_index} = 26</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:24:52.745953" elapsed="0.000469"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:52.746867" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:24:52.746588" elapsed="0.000305"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:24:52.747791" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:24:52.747530" elapsed="0.001084">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:24:52.748827" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:24:52.748884" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:52.747182" elapsed="0.001727"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:24:52.749733" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:24:52.749483" elapsed="0.000914">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:24:52.750584" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:24:52.750630" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:52.749128" elapsed="0.001524"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:24:52.751611" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC1_Deconfigure_iBGP_Peer"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:24:52.751006" elapsed="0.000667">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC1_Deconfigure_iBGP_Peer"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:24:52.750752" elapsed="0.000992">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC1_Deconfigure_iBGP_Peer"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:24:52.750733" elapsed="0.001043">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC1_Deconfigure_iBGP_Peer"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:52.751957" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:52.752188" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:52.752043" elapsed="0.000233"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:52.752027" elapsed="0.000273"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:24:52.752333" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:24:52.754951" elapsed="0.000149"/>
</kw>
<msg time="2026-04-17T03:24:52.755165" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:52.753793" 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-04-17T03:24:52.755571" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:52.755911" 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-04-17T03:24:52.753168" elapsed="0.002948"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:24:52.752610" elapsed="0.003571"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:24:52.745299" elapsed="0.010967">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC1_Deconfigure_iBGP_Peer"</status>
</kw>
<msg time="2026-04-17T03:24:52.756369" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:24:52.756412" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC1_Deconfigure_iBGP_Peer"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:52.744685" elapsed="0.011751"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:24:52.756617" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:52.756511" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:52.756493" elapsed="0.000188"/>
</if>
<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-04-17T03:24:52.757548" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:52.757445" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:52.757428" elapsed="0.000185"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:52.757895" level="INFO">index=15
host=10.30.171.238
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-04-17T03:24:52.758016" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
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-04-17T03:24:52.757769" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:52.758457" level="INFO">{1: 26}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:52.758198" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:52.758939" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:52.758681" elapsed="0.000306"/>
</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-04-17T03:24:52.759523" elapsed="0.000258"/>
</kw>
<msg time="2026-04-17T03:24:52.759883" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:24:52.759944" level="INFO">${old_connection_index} = 26</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:52.759149" elapsed="0.000819"/>
</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-04-17T03:24:52.760769" elapsed="0.000287"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:24:52.762279" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:24:52.761710" elapsed="0.001513">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:52.761230" elapsed="0.002093"/>
</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-04-17T03:24:52.763999" elapsed="0.000278"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:52.763504" elapsed="0.000860"/>
</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-04-17T03:24:52.760265" elapsed="0.004145"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:52.760042" elapsed="0.004417"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:52.760024" elapsed="0.004461"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:24:52.765403" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:24:52.765057" elapsed="0.000373"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:24:52.765479" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:24:52.765633" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:24:52.764698" elapsed="0.000959"/>
</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-04-17T03:24:52.765821" elapsed="0.000438"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:52.766541" level="INFO">index=27
host=10.30.170.120
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-04-17T03:24:52.766646" level="INFO">${karaf_connection_object} = index=27
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:24:52.766435" elapsed="0.000270"/>
</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-04-17T03:24:52.766860" elapsed="0.002278"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:24:52.769567" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:24:52.770740" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:24:52.769307" elapsed="0.001825">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:24:52.785267" elapsed="0.000390"/>
</kw>
<msg time="2026-04-17T03:24:52.785748" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:52.783812" elapsed="0.002086"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:52.786077" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:52.786244" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:24:52.771987" elapsed="0.014337"/>
</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-04-17T03:24:52.771421" elapsed="0.014949"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:24:52.757155" elapsed="0.029296">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:52.786813" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:24:52.786885" 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="FAIL" start="2026-04-17T03:24:52.744008" elapsed="0.043001">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:24:52.787119" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:24:52.787162" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:52.739208" elapsed="0.047976"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:52.787522" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:52.787263" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:52.787243" elapsed="0.000357"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:24:52.739059" elapsed="0.048565"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:24:52.738867" elapsed="0.048788"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:24:52.736479" elapsed="0.051233"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:24:52.731397" elapsed="0.056371"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:52.730951" elapsed="0.056862"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:24:52.727339" elapsed="0.060533"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:24:52.789032" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | BGP_NAME=example-bgp-peer | IP=10.30.171.238 | 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-04-17T03:24:52.788436" elapsed="0.000624"/>
</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-04-17T03:24:52.832788" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:52.832391" elapsed="0.000427"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:24:52.833592" 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-04-17T03:24:52.833353" elapsed="0.000311">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-04-17T03:24:52.833758" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:24:52.833014" elapsed="0.000768"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:24:52.834347" 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-04-17T03:24:52.833963" elapsed="0.000411"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:24:52.834704" 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-04-17T03:24:52.834876" 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-04-17T03:24:52.834537" elapsed="0.000365"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:52.835337" 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-04-17T03:24:52.835085" 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-04-17T03:24:52.836360" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.238', '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-04-17T03:24:52.836104" elapsed="0.000301"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:24:52.836828" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:24:52.836566" elapsed="0.000287"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:24:52.837538" 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-04-17T03:24:52.837237" elapsed="0.000326"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:24:52.838307" 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-04-17T03:24:52.838088" elapsed="0.000245"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:24:52.838382" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:24:52.838536" 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-04-17T03:24:52.837751" elapsed="0.000809"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:24:52.838737" elapsed="0.000250"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-04-17T03:24:52.837095" elapsed="0.001932"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:24:52.839574" 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-04-17T03:24:52.839281" elapsed="0.000318"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:24:52.842169" 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-04-17T03:24:52.840121" elapsed="0.002077"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:24:52.842250" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:24:52.842409" 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-04-17T03:24:52.839784" elapsed="0.002651"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:24:52.842595" elapsed="0.000281"/>
</kw>
<var name="${key}">BGP_NAME</var>
<var name="${value}">example-bgp-peer</var>
<status status="PASS" start="2026-04-17T03:24:52.839145" elapsed="0.003869"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:24:52.843581" level="INFO">${value} = 10.30.171.238</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:24:52.843275" elapsed="0.000331"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:24:52.844351" level="INFO">${encoded} = 10.30.171.238</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:24:52.844138" elapsed="0.000240"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:24:52.844454" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:24:52.844666" level="INFO">${encoded_value} = 10.30.171.238</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:24:52.843797" 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-04-17T03:24:52.844861" elapsed="0.000248"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.238</var>
<status status="PASS" start="2026-04-17T03:24:52.843134" elapsed="0.002016"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:24:52.845694" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:24:52.845397" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:24:52.846452" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:24:52.846242" elapsed="0.000236"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:24:52.846527" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:24:52.846701" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:24:52.845906" elapsed="0.000820"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:24:52.846880" elapsed="0.000403"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:24:52.845261" elapsed="0.002063"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:24:52.836903" elapsed="0.010455"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:24:52.847402" elapsed="0.000027"/>
</return>
<msg time="2026-04-17T03:24:52.847561" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.238', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:24:52.835758" elapsed="0.011829"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:52.835452" elapsed="0.012166"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:52.847797" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:52.847644" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:52.835431" elapsed="0.012442"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:24:52.848838" 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-04-17T03:24:52.848214" elapsed="0.000653"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:24:52.848916" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:24:52.831722" elapsed="0.017318"/>
</kw>
<msg time="2026-04-17T03:24:52.849094" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:52.818839" elapsed="0.030319"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:24:52.861948" 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-04-17T03:24:52.874713" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:52.887591" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:52.887795" 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-04-17T03:24:52.887991" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:52.888369" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:52.888219" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:52.888204" 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-04-17T03:24:52.888591" 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-04-17T03:24:52.888761" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:52.888948" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:24:52.888174" elapsed="0.000829"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:24:52.888069" elapsed="0.000960"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:52.889179" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:52.889254" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:24:52.889381" 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-04-17T03:24:52.814411" elapsed="0.074997"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:52.890535" 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.238</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:52.890281" 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-04-17T03:24:52.895846" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:24:53.097391" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:24:53.500181" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:24:53.502217" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:24:52.893059" elapsed="0.612155">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:24:52.890692" elapsed="0.614767">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:24:53.505777" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:53.505516" elapsed="0.000364"/>
</branch>
<status status="FAIL" start="2026-04-17T03:24:52.890675" elapsed="0.615236">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:24:53.506570" elapsed="0.000031"/>
</kw>
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:53.506659" elapsed="0.000027"/>
</return>
<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-04-17T03:24:52.889678" elapsed="0.617119">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:53.506871" elapsed="0.000018"/>
</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="FAIL" start="2026-04-17T03:24:52.789294" elapsed="0.717726">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:24:53.508683" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:53.508234" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:53.508212" elapsed="0.000572"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:53.508984" elapsed="0.000405"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:24:53.515228" 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-04-17T03:24:53.514705" elapsed="0.000555"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-17T03:24:53.515523" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:53.515351" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:53.515327" elapsed="0.000268"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:24:53.516164" 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-04-17T03:24:53.515753" elapsed="0.000451"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:24:53.516837" level="INFO">${reference} = bgpcep_userfeatures_txt_Ibgp_Peer_Lsp_TC1_Deconfigure_iBGP_Peer</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-04-17T03:24:53.516447" elapsed="0.000430"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-17T03:24:53.517404" level="INFO">${reference} = bgpcep_userfeatures_txt_ibgp_peer_lsp_tc1_deconfigure_ibgp_peer</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-17T03:24:53.517143" elapsed="0.000299"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:24:53.518227" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"bgpcep_userfeatures_txt_ibgp_peer_lsp_tc1_deconfigure_ibgp_peer"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:53.517683" elapsed="0.000585"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:24:53.519025" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=bgpcep_userfeatures_txt_ibgp_peer_lsp_tc1_deconfigure_ibgp_peer&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:53.518578" elapsed="0.000476"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-17T03:24:53.519770" 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_tc1_deconfigure_ibgp_peer"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=bgpcep_userfeatures_txt_ibgp_peer_lsp_tc1_deconfigure_ibgp_peer&amp;order=bug_status"

ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-17T03:24:53.519302" elapsed="0.000524"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:53.520304" level="INFO">... click for list of related bugs or create a new one if needed (with the
"bgpcep_userfeatures_txt_ibgp_peer_lsp_tc1_deconfigure_ibgp_peer"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=bgpcep_userfeatures_txt_ibgp_peer_lsp_tc1_deconfigure_ibgp_peer&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-04-17T03:24:53.520003" elapsed="0.000349"/>
</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-04-17T03:24:53.514319" elapsed="0.006095"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:53.507971" elapsed="0.012499"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-17T03:24:53.507408" elapsed="0.013107"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="FAIL" start="2026-04-17T03:24:52.726247" elapsed="0.794319">... click for list of related bugs or create a new one if needed (with the
"bgpcep_userfeatures_txt_ibgp_peer_lsp_tc1_deconfigure_ibgp_peer"
reference somewhere inside)
"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=bgpcep_userfeatures_txt_ibgp_peer_lsp_tc1_deconfigure_ibgp_peer&amp;order=bug_status"

ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:24:53.524532" elapsed="0.000226"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:24:53.524242" elapsed="0.000574"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:24:53.525941" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:53.525772" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:53.525749" elapsed="0.000303"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:24:53.531495" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:53.531365" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:53.531341" elapsed="0.000228"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:24:53.532703" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:24:53.532257" elapsed="0.000476"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:24:53.533237" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:24:53.532907" elapsed="0.000356"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:24:53.533308" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:24:53.533476" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:24:53.531834" elapsed="0.001667"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:24:53.539833" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:53.539697" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:53.539671" elapsed="0.000241"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:24:53.541311" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:53.541200" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:53.541181" elapsed="0.000200"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:24:53.541864" level="INFO">${karaf_connection_index} = 27</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:24:53.541537" elapsed="0.000358"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:53.542425" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:24:53.542154" elapsed="0.000298"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:24:53.543344" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:24:53.543059" elapsed="0.000982">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:24:53.544235" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:24:53.544282" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:53.542621" elapsed="0.001685"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:24:53.545203" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:24:53.544856" elapsed="0.001216">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:24:53.546306" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:24:53.546361" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:53.544483" elapsed="0.001903"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:24:53.547592" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC2_Configure_iBGP_Peer"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:24:53.546776" elapsed="0.000902">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC2_Configure_iBGP_Peer"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:24:53.546484" elapsed="0.001286">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC2_Configure_iBGP_Peer"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:24:53.546456" elapsed="0.001359">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC2_Configure_iBGP_Peer"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:53.548066" elapsed="0.000031"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:53.548372" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:53.548176" elapsed="0.000269"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:53.548156" elapsed="0.000322"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:24:53.548528" 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-04-17T03:24:53.552098" elapsed="0.000227"/>
</kw>
<msg time="2026-04-17T03:24:53.552429" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:53.550645" elapsed="0.001966"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:53.553002" elapsed="0.000095"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:53.553445" 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-04-17T03:24:53.549729" elapsed="0.003957"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:24:53.548975" elapsed="0.004801"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:24:53.540821" elapsed="0.013076">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC2_Configure_iBGP_Peer"</status>
</kw>
<msg time="2026-04-17T03:24:53.554156" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:24:53.554214" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC2_Configure_iBGP_Peer"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:53.540120" elapsed="0.014129"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:24:53.554590" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:53.554421" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:53.554388" elapsed="0.000304"/>
</if>
<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-04-17T03:24:53.556223" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:53.556094" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:53.556064" elapsed="0.000228"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:53.556655" level="INFO">index=15
host=10.30.171.238
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-04-17T03:24:53.556805" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
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-04-17T03:24:53.556460" elapsed="0.000465"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:53.557483" level="INFO">{1: 27}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:53.557174" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:53.557999" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:53.557689" elapsed="0.000370"/>
</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-04-17T03:24:53.558709" elapsed="0.000340"/>
</kw>
<msg time="2026-04-17T03:24:53.559154" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:24:53.559201" level="INFO">${old_connection_index} = 27</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:53.558257" elapsed="0.000966"/>
</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-04-17T03:24:53.560096" elapsed="0.000200"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:24:53.561491" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:24:53.561049" elapsed="0.001606">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:53.560473" elapsed="0.002297"/>
</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-04-17T03:24:53.563648" elapsed="0.000423"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:53.563010" elapsed="0.001161"/>
</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-04-17T03:24:53.559538" elapsed="0.004690"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:53.559302" elapsed="0.004985"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:53.559283" elapsed="0.005041"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:24:53.565589" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:24:53.565162" elapsed="0.000464"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:24:53.565694" elapsed="0.000054"/>
</return>
<msg time="2026-04-17T03:24:53.565921" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:24:53.564657" elapsed="0.001326"/>
</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-04-17T03:24:53.566217" elapsed="0.000610"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:53.567234" level="INFO">index=28
host=10.30.170.120
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-04-17T03:24:53.567376" level="INFO">${karaf_connection_object} = index=28
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:24:53.567072" elapsed="0.000340"/>
</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-04-17T03:24:53.567616" elapsed="0.003063"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:24:53.571256" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:24:53.572762" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:24:53.570908" elapsed="0.002321">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:24:53.588950" elapsed="0.000424"/>
</kw>
<msg time="2026-04-17T03:24:53.589484" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:53.587099" elapsed="0.002548"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:53.589824" elapsed="0.000029"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:53.590072" elapsed="0.000034"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:24:53.574368" elapsed="0.015829"/>
</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-04-17T03:24:53.573582" elapsed="0.016669"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:24:53.555315" elapsed="0.035152">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:53.590908" elapsed="0.000272"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:24:53.591235" elapsed="0.000024"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:24:53.539235" elapsed="0.052123">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:24:53.591480" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:24:53.591524" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:53.533905" elapsed="0.057643"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:53.591922" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:53.591637" elapsed="0.000358"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:53.591615" elapsed="0.000407"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:24:53.533754" elapsed="0.058293"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:24:53.533562" elapsed="0.058522"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:24:53.530895" elapsed="0.061251"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:24:53.525465" elapsed="0.066740"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:53.524999" elapsed="0.067255"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:24:53.521616" elapsed="0.070695"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:24:53.593329" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | BGP_NAME=example-bgp-peer | IP=10.30.171.238 | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | RIB_INSTANCE_NAME=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_OPENC...</msg>
<var>&amp;{mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</arg>
<arg>BGP_NAME=${BGP_PEER_NAME}</arg>
<arg>IP=${TOOLS_SYSTEM_IP}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>INITIATE=false</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<arg>PASSIVE_MODE=true</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:24:53.592503" elapsed="0.000856"/>
</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-04-17T03:24:53.634052" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:53.633511" elapsed="0.000579"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:24:53.635816" 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-04-17T03:24:53.635423" elapsed="0.000537">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-04-17T03:24:53.636108" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:24:53.635003" elapsed="0.001142"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:24:53.636813" 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-04-17T03:24:53.636400" elapsed="0.000440"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:24:53.637302" 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-04-17T03:24:53.637557" 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-04-17T03:24:53.637096" elapsed="0.000490"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:53.638054" 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-04-17T03:24:53.637778" elapsed="0.000429"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:53.639495" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.238', '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-04-17T03:24:53.639174" elapsed="0.000386"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:24:53.640163" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:24:53.639790" elapsed="0.000401"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:24:53.641515" 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-04-17T03:24:53.640695" elapsed="0.000861"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:24:53.642603" 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-04-17T03:24:53.642291" elapsed="0.000350"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:24:53.642716" elapsed="0.000051"/>
</return>
<msg time="2026-04-17T03:24:53.643007" 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-04-17T03:24:53.641835" 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-04-17T03:24:53.643281" elapsed="0.000345"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-04-17T03:24:53.640487" elapsed="0.003201"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:24:53.644333" 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-04-17T03:24:53.644022" elapsed="0.000337"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:24:53.645176" 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-04-17T03:24:53.644914" elapsed="0.000288"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:24:53.645253" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:24:53.645407" 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-04-17T03:24:53.644558" elapsed="0.000874"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:24:53.645642" elapsed="0.000325"/>
</kw>
<var name="${key}">BGP_NAME</var>
<var name="${value}">example-bgp-peer</var>
<status status="PASS" start="2026-04-17T03:24:53.643851" elapsed="0.002171"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:24:53.646669" level="INFO">${value} = 10.30.171.238</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:24:53.646359" elapsed="0.000336"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:24:53.647491" level="INFO">${encoded} = 10.30.171.238</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:24:53.647234" elapsed="0.000285"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:24:53.647570" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:24:53.647725" level="INFO">${encoded_value} = 10.30.171.238</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:24:53.646890" 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-04-17T03:24:53.647904" elapsed="0.000243"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.238</var>
<status status="PASS" start="2026-04-17T03:24:53.646160" elapsed="0.002029"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:24:53.648790" 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-04-17T03:24:53.648440" elapsed="0.000376"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:24:53.649570" 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-04-17T03:24:53.649357" elapsed="0.000244"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:24:53.649652" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:24:53.649833" 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-04-17T03:24:53.649033" 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-04-17T03:24:53.650064" elapsed="0.000280"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:24:53.648302" elapsed="0.002090"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:24:53.651012" 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-04-17T03:24:53.650655" elapsed="0.000386"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:24:53.651813" 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-04-17T03:24:53.651593" elapsed="0.000312"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:24:53.651974" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:24:53.652133" 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-04-17T03:24:53.651232" 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-04-17T03:24:53.652315" elapsed="0.000224"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:24:53.650515" elapsed="0.002067"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:24:53.653210" 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-04-17T03:24:53.652835" elapsed="0.000402"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:24:53.654259" 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-04-17T03:24:53.653805" elapsed="0.000482"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:24:53.654338" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:24:53.654494" 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-04-17T03:24:53.653432" elapsed="0.001087"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:24:53.654674" elapsed="0.000225"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:24:53.652697" elapsed="0.002258"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:24:53.655559" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:24:53.655207" elapsed="0.000378"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:24:53.656337" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:24:53.656126" elapsed="0.000237"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:24:53.656411" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:24:53.656564" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:24:53.655779" elapsed="0.000810"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:24:53.656742" elapsed="0.000237"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:24:53.655069" elapsed="0.001950"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:24:53.657567" 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-04-17T03:24:53.657268" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:24:53.658444" 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-04-17T03:24:53.658170" elapsed="0.000300"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:24:53.658519" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:24:53.658672" 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-04-17T03:24:53.657783" 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-04-17T03:24:53.658852" elapsed="0.000283"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:24:53.657133" elapsed="0.002057"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:24:53.659890" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:24:53.659526" elapsed="0.000391"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:24:53.660807" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:24:53.660520" elapsed="0.000323"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:24:53.660909" elapsed="0.000061"/>
</return>
<msg time="2026-04-17T03:24:53.661141" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:24:53.660126" elapsed="0.001049"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:24:53.661346" elapsed="0.000266"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:24:53.659337" elapsed="0.002331"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:24:53.640246" elapsed="0.021470"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:24:53.661776" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:24:53.661981" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.238', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'RIB_INSTANCE_NAME': 'example-bgp-rib', 'PASSI...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:24:53.638747" elapsed="0.023331"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:53.638318" elapsed="0.023810"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:53.662344" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:53.662159" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:53.638289" elapsed="0.024145"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:24:53.663562" 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-04-17T03:24:53.662605" elapsed="0.000988"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:24:53.663649" 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//bgp_peer.vanadium/${file_name} 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-04-17T03:24:53.632583" elapsed="0.031240"/>
</kw>
<msg time="2026-04-17T03:24:53.663892" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:53.614628" elapsed="0.049341"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:24:53.679477" 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//bgp_peer.vanadium/${file_name} 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-04-17T03:24:53.696169" elapsed="0.000070"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:24:53.712451" elapsed="0.000065"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:53.712846" 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-04-17T03:24:53.713137" 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-04-17T03:24:53.713733" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:53.713513" elapsed="0.000301"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:53.713489" 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-04-17T03:24:53.714088" elapsed="0.000030"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:53.714380" elapsed="0.000029"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:53.714622" elapsed="0.000026"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:24:53.713435" elapsed="0.001259"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:24:53.713251" elapsed="0.001482"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:53.714968" elapsed="0.000029"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:53.715078" elapsed="0.000025"/>
</return>
<msg time="2026-04-17T03:24:53.715308" 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-04-17T03:24:53.610060" elapsed="0.105379"/>
</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-04-17T03:24:53.749638" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:53.749201" elapsed="0.000472"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:24:53.750515" 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-04-17T03:24:53.750253" elapsed="0.000341">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-04-17T03:24:53.750689" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:24:53.749856" elapsed="0.000856"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:24:53.751320" 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-04-17T03:24:53.750892" elapsed="0.000455"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:24:53.751653" 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-04-17T03:24:53.751819" 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-04-17T03:24:53.751511" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:53.752271" 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-04-17T03:24:53.752021" 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-04-17T03:24:53.752772" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:53.752412" elapsed="0.000419"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:24:53.753327" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.238', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'RIB_INSTANCE_NAME': 'example-bgp-rib', 'PASSI...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:53.753024" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:53.752859" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:53.752386" elapsed="0.001025"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:24:53.754417" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.238&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflec...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:24:53.753562" elapsed="0.000885"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:24:53.754499" 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//bgp_peer.vanadium/${file_name} 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-04-17T03:24:53.748438" elapsed="0.006199"/>
</kw>
<msg time="2026-04-17T03:24:53.754749" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:53.733246" elapsed="0.021554"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:24:53.768968" 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//bgp_peer.vanadium/${file_name} 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-04-17T03:24:53.782080" elapsed="0.000050"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:24:53.796144" elapsed="0.000079"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:53.796547" 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-04-17T03:24:53.796787" 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-04-17T03:24:53.797371" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:53.797162" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:53.797140" 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-04-17T03:24:53.797684" 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-04-17T03:24:53.797919" 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-04-17T03:24:53.798127" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:24:53.797090" elapsed="0.001123"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:24:53.796893" elapsed="0.001350"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:53.798399" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:53.798488" elapsed="0.000023"/>
</return>
<msg time="2026-04-17T03:24:53.798696" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.238&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflec...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:24:53.729692" elapsed="0.069036"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:24:53.800331" 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-04-17T03:24:53.800025" elapsed="0.000385">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-04-17T03:24:53.800507" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:24:53.799582" elapsed="0.000950"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:53.801218" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:53.800686" elapsed="0.000606"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:24:53.801882" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:53.801567" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:53.801324" elapsed="0.000639"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:53.800665" elapsed="0.001321"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:24:53.804887" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:24:53.802147" elapsed="0.002768"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:24:53.804985" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:24:53.805164" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:24:53.799191" elapsed="0.006005"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:53.806895" 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.238</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:53.806562" elapsed="0.000422"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:53.807411" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.238&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-04-17T03:24:53.807155" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:53.807915" 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-04-17T03:24:53.807662" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:53.808386" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:53.808136" elapsed="0.000306"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:24:53.809385" 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-04-17T03:24:53.809161" elapsed="0.000252"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:24:53.809776" 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-04-17T03:24:53.809598" 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-04-17T03:24:53.809986" elapsed="0.000244"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:53.810648" 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-04-17T03:24:53.810399" elapsed="0.000293"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:24:53.810735" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:24:53.810903" 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-04-17T03:24:53.808696" elapsed="0.002250"/>
</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-04-17T03:24:53.816698" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:24:54.018509" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:24:54.421168" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:24:54.423814" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:24:53.813741" elapsed="0.613493">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:24:53.811023" elapsed="0.616361">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:54.427755" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:54.427445" elapsed="0.000413"/>
</branch>
<status status="FAIL" start="2026-04-17T03:24:53.811004" elapsed="0.616889">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:54.428525" elapsed="0.000043"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:54.428795" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:54.428735" elapsed="0.000123"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:54.428683" elapsed="0.000205"/>
</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-04-17T03:24:54.429129" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:24:54.429227" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:24:53.805596" elapsed="0.623790">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:54.429495" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:24:53.598460" elapsed="0.831172">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:54.430185" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:54.429788" elapsed="0.000498"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:54.429764" elapsed="0.000555"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:24:54.430364" elapsed="0.000021"/>
</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="FAIL" start="2026-04-17T03:24:53.593647" elapsed="0.836858">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:24:54.432085" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:54.431651" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:54.431633" elapsed="0.000538"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:54.432329" elapsed="0.000373"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:24:54.439152" 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-04-17T03:24:54.438668" elapsed="0.000520"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-17T03:24:54.439438" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:54.439288" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:54.439266" elapsed="0.000235"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:24:54.439976" 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-04-17T03:24:54.439655" elapsed="0.000350"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:24:54.440444" level="INFO">${reference} = bgpcep_userfeatures_txt_Ibgp_Peer_Lsp_TC2_Configure_iBGP_Peer</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-04-17T03:24:54.440174" elapsed="0.000298"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-17T03:24:54.440818" level="INFO">${reference} = bgpcep_userfeatures_txt_ibgp_peer_lsp_tc2_configure_ibgp_peer</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-17T03:24:54.440640" elapsed="0.000204"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:24:54.441366" 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_configure_ibgp_peer"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:54.441019" elapsed="0.000373"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:24:54.441950" 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_configure_ibgp_peer&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:54.441551" elapsed="0.000437"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-17T03:24:54.442614" 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_configure_ibgp_peer"
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_configure_ibgp_peer&amp;order=bug_status"

ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-17T03:24:54.442156" elapsed="0.000513"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:54.443161" level="INFO">... click for list of related bugs or create a new one if needed (with the
"bgpcep_userfeatures_txt_ibgp_peer_lsp_tc2_configure_ibgp_peer"
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_configure_ibgp_peer&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-04-17T03:24:54.442840" elapsed="0.000368"/>
</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-04-17T03:24:54.438304" elapsed="0.004962"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:54.431439" elapsed="0.011879"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-17T03:24:54.431028" elapsed="0.012333"/>
</kw>
<doc>Configures BGP peer module with initiate-connection set to false.</doc>
<status status="FAIL" start="2026-04-17T03:24:53.521025" elapsed="0.922384">... click for list of related bugs or create a new one if needed (with the
"bgpcep_userfeatures_txt_ibgp_peer_lsp_tc2_configure_ibgp_peer"
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_configure_ibgp_peer&amp;order=bug_status"

ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:24:54.447195" elapsed="0.000228"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:24:54.446888" elapsed="0.000595"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:24:54.448658" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:54.448522" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:54.448495" 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-04-17T03:24:54.455232" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:54.455026" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:54.454999" elapsed="0.000378"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:24:54.457161" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:24:54.456514" elapsed="0.000689"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:24:54.457976" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:24:54.457439" elapsed="0.000577"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:24:54.458079" elapsed="0.000051"/>
</return>
<msg time="2026-04-17T03:24:54.458310" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:24:54.455862" elapsed="0.002482"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:24:54.466419" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:54.466295" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:54.466272" elapsed="0.000221"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:24:54.467758" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:54.467648" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:54.467630" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:24:54.468355" level="INFO">${karaf_connection_index} = 28</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:24:54.468012" elapsed="0.000371"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:54.468774" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:24:54.468552" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:24:54.469631" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:24:54.469345" elapsed="0.001051">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:24:54.470600" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:24:54.470647" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:54.468986" elapsed="0.001685"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:24:54.471466" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:24:54.471220" elapsed="0.000936">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:24:54.472351" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:24:54.472398" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:54.470848" elapsed="0.001573"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:24:54.473392" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC2_Check_Example_Bgp_Rib_Is_Empty"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:24:54.472740" elapsed="0.000716">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC2_Check_Example_Bgp_Rib_Is_Empty"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:24:54.472503" elapsed="0.001023">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC2_Check_Example_Bgp_Rib_Is_Empty"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:24:54.472481" elapsed="0.001079">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC2_Check_Example_Bgp_Rib_Is_Empty"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:54.473732" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:54.474007" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:54.473818" elapsed="0.000304"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:54.473802" elapsed="0.000347"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:24:54.474185" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:24:54.476891" elapsed="0.000193"/>
</kw>
<msg time="2026-04-17T03:24:54.477156" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:54.475728" elapsed="0.001564"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:54.477605" elapsed="0.000096"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:54.478044" 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-04-17T03:24:54.475079" 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-04-17T03:24:54.474498" elapsed="0.003810"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:24:54.467339" elapsed="0.011064">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC2_Check_Example_Bgp_Rib_Is_Empty"</status>
</kw>
<msg time="2026-04-17T03:24:54.478517" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:24:54.478561" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC2_Check_Example_Bgp_Rib_Is_Empty"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:54.466666" elapsed="0.011919"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:24:54.478790" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:54.478671" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:54.478649" elapsed="0.000208"/>
</if>
<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-04-17T03:24:54.479986" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:54.479856" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:54.479835" elapsed="0.000216"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:54.480353" level="INFO">index=15
host=10.30.171.238
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-04-17T03:24:54.480475" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
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-04-17T03:24:54.480211" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:54.481040" level="INFO">{1: 28}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:54.480663" elapsed="0.000430"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:54.481556" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:54.481280" elapsed="0.000321"/>
</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-04-17T03:24:54.482251" elapsed="0.000275"/>
</kw>
<msg time="2026-04-17T03:24:54.482629" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:24:54.482676" level="INFO">${old_connection_index} = 28</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:54.481800" elapsed="0.000900"/>
</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-04-17T03:24:54.483561" elapsed="0.000198"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:24:54.485107" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:24:54.484471" elapsed="0.001636">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:54.483953" elapsed="0.002258"/>
</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-04-17T03:24:54.486871" elapsed="0.000302"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:54.486395" elapsed="0.000862"/>
</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-04-17T03:24:54.483033" elapsed="0.004271"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:54.482776" elapsed="0.004578"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:54.482758" elapsed="0.004623"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:24:54.488309" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:24:54.487993" elapsed="0.000406"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:24:54.488452" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:24:54.488613" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:24:54.487616" elapsed="0.001022"/>
</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-04-17T03:24:54.488800" elapsed="0.000481"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:54.489577" level="INFO">index=29
host=10.30.170.120
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-04-17T03:24:54.489679" level="INFO">${karaf_connection_object} = index=29
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:24:54.489458" elapsed="0.000247"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:24:54.489905" elapsed="0.002339"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:24:54.492676" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:24:54.494011" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:24:54.492416" elapsed="0.001999">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:24:54.508717" elapsed="0.000725"/>
</kw>
<msg time="2026-04-17T03:24:54.509541" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:54.507229" elapsed="0.002468"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:54.509886" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:54.510076" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:24:54.495312" elapsed="0.014849"/>
</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-04-17T03:24:54.494742" elapsed="0.015468"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:24:54.479318" elapsed="0.030981">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:54.510686" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:24:54.510763" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:24:54.465875" elapsed="0.045010">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:24:54.511042" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:24:54.511089" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:54.458922" elapsed="0.052189"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:54.511460" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:54.511196" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:54.511175" elapsed="0.000364"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:24:54.458704" elapsed="0.052859"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:24:54.458421" elapsed="0.053175"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:24:54.454480" elapsed="0.057172"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:24:54.448190" elapsed="0.063518"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:54.447675" elapsed="0.064078"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:24:54.444506" elapsed="0.067301"/>
</kw>
<kw name="Check_Example_Bgp_Rib_Does_Not_Contain" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:24:54.515364" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig</msg>
<msg time="2026-04-17T03:24:54.716698" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig</msg>
<msg time="2026-04-17T03:24:55.119435" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig</msg>
<msg time="2026-04-17T03:24:55.121655" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:24:54.512552" elapsed="0.612367">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:55.125300" elapsed="0.000040"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:55.125591" elapsed="0.000032"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>${substr}</arg>
<arg>${error_message}</arg>
<arg>values=False</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:55.125848" elapsed="0.000035"/>
</kw>
<arg>${CONFIG_SESSION}</arg>
<arg>${JSONKEYSTR}</arg>
<doc>Check the example-bgp-rib does not contain the string</doc>
<status status="FAIL" start="2026-04-17T03:24:54.512110" elapsed="0.613989">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:24:55.128232" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:55.127599" elapsed="0.000726"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:55.127567" elapsed="0.000797"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:55.128595" elapsed="0.000552"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:24:55.135170" 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-04-17T03:24:55.134692" elapsed="0.000507"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-17T03:24:55.135431" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:55.135275" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:55.135256" elapsed="0.000242"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:24:55.135974" 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-04-17T03:24:55.135652" elapsed="0.000351"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:24:55.136620" level="INFO">${reference} = bgpcep_userfeatures_txt_Ibgp_Peer_Lsp_TC2_Check_Example_Bgp_Rib_Is_Empty</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-04-17T03:24:55.136345" elapsed="0.000301"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-17T03:24:55.137007" level="INFO">${reference} = bgpcep_userfeatures_txt_ibgp_peer_lsp_tc2_check_example_bgp_rib_is_empty</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-17T03:24:55.136812" elapsed="0.000221"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:24:55.137585" 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_is_empty"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:55.137199" elapsed="0.000414"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:24:55.138118" 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_is_empty&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:55.137778" elapsed="0.000367"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-17T03:24:55.138749" 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_is_empty"
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_is_empty&amp;order=bug_status"

ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-17T03:24:55.138305" elapsed="0.000551"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:55.139331" 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_is_empty"
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_is_empty&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-04-17T03:24:55.139031" elapsed="0.000348"/>
</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-04-17T03:24:55.134365" elapsed="0.005070"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:55.127269" elapsed="0.012215"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-17T03:24:55.126615" elapsed="0.012911"/>
</kw>
<doc>Check RIB for none linkstate-routes</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:24:54.443852" elapsed="0.695713">... 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_is_empty"
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_is_empty&amp;order=bug_status"

ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:24:55.143066" elapsed="0.000212"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:24:55.142758" 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-04-17T03:24:55.144384" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:55.144260" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:55.144241" elapsed="0.000210"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:24:55.149546" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:55.149425" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:55.149407" elapsed="0.000207"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:24:55.150639" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:24:55.150251" elapsed="0.000415"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:24:55.151159" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:24:55.150832" elapsed="0.000354"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:24:55.151230" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:24:55.151390" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:24:55.149849" elapsed="0.001565"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:24:55.158024" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:55.157881" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:55.157854" 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-04-17T03:24:55.159310" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:55.159204" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:55.159186" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:24:55.159838" level="INFO">${karaf_connection_index} = 29</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:24:55.159537" elapsed="0.000327"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:55.160283" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:24:55.160053" elapsed="0.000256"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:24:55.161119" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:24:55.160829" elapsed="0.000962">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:24:55.162002" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:24:55.162049" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:55.160486" elapsed="0.001599"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:24:55.162947" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:24:55.162672" elapsed="0.000943">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:24:55.163801" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:24:55.163847" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:55.162304" elapsed="0.001566"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:24:55.164799" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC2_Connect_BGP_Peer"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:24:55.164195" elapsed="0.000665">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC2_Connect_BGP_Peer"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:24:55.163967" elapsed="0.000977">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC2_Connect_BGP_Peer"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:24:55.163947" elapsed="0.001032">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC2_Connect_BGP_Peer"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:55.165146" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:55.165392" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:55.165245" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:24:55.165228" elapsed="0.000239"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:24:55.165499" 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-04-17T03:24:55.168142" elapsed="0.000174"/>
</kw>
<msg time="2026-04-17T03:24:55.168384" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:55.167049" elapsed="0.001464"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:55.168796" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:55.169176" 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-04-17T03:24:55.166388" 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-04-17T03:24:55.165818" elapsed="0.003609"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:24:55.158877" elapsed="0.010683">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC2_Connect_BGP_Peer"</status>
</kw>
<msg time="2026-04-17T03:24:55.169668" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:24:55.169712" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC2_Connect_BGP_Peer"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:55.158260" elapsed="0.011475"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:24:55.169918" elapsed="0.000105"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:55.169811" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:55.169793" elapsed="0.000296"/>
</if>
<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-04-17T03:24:55.171095" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:24:55.170987" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:55.170969" elapsed="0.000193"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:55.171446" level="INFO">index=15
host=10.30.171.238
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-04-17T03:24:55.171551" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
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-04-17T03:24:55.171322" elapsed="0.000256"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:55.172021" level="INFO">{1: 29}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:55.171735" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:55.172471" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:24:55.172224" elapsed="0.000291"/>
</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-04-17T03:24:55.173070" elapsed="0.000262"/>
</kw>
<msg time="2026-04-17T03:24:55.173432" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:24:55.173535" level="INFO">${old_connection_index} = 29</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:55.172680" elapsed="0.000881"/>
</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-04-17T03:24:55.174485" elapsed="0.000196"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:24:55.175762" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:24:55.175357" elapsed="0.001278">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:55.174856" elapsed="0.001877"/>
</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-04-17T03:24:55.177395" elapsed="0.000291"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:55.176909" elapsed="0.000861"/>
</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-04-17T03:24:55.173868" elapsed="0.003947"/>
</kw>
<status status="PASS" start="2026-04-17T03:24:55.173638" elapsed="0.004227"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:55.173619" elapsed="0.004271"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:24:55.178801" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:24:55.178492" elapsed="0.000335"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:24:55.178874" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:24:55.179045" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:24:55.178163" elapsed="0.000906"/>
</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-04-17T03:24:55.179233" elapsed="0.000420"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:24:55.179947" level="INFO">index=30
host=10.30.170.120
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-04-17T03:24:55.180055" level="INFO">${karaf_connection_object} = index=30
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:24:55.179825" elapsed="0.000255"/>
</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-04-17T03:24:55.180233" elapsed="0.002339"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:24:55.183019" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:24:55.184316" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:24:55.182740" elapsed="0.001958">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:24:55.199837" elapsed="0.000446"/>
</kw>
<msg time="2026-04-17T03:24:55.200379" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:24:55.198458" elapsed="0.002078"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:55.200707" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:55.200880" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:24:55.185620" elapsed="0.015404"/>
</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-04-17T03:24:55.185034" elapsed="0.016041"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:24:55.170491" elapsed="0.030671">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:55.201575" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:24:55.201655" 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="FAIL" start="2026-04-17T03:24:55.157344" elapsed="0.044428">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:24:55.202010" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:24:55.202060" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:55.151810" elapsed="0.050276"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:24:55.202456" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:24:55.202172" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-04-17T03:24:55.202151" elapsed="0.000388"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:24:55.151661" elapsed="0.050904"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:24:55.151483" elapsed="0.051116"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:24:55.149063" elapsed="0.053605"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:24:55.143964" elapsed="0.058799"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:24:55.143502" elapsed="0.059323"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:24:55.140434" elapsed="0.062474"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:24:55.212823" level="INFO">${start_cmd} = python3 play.py --amount 1 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --peerport=1790 --debug --logfile bgp_peer.log --bgpls True &amp;&gt;bgp_peer.log</msg>
<var>${start_cmd}</var>
<arg>${command} ${tool_opt}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:24:55.212425" elapsed="0.000428"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:55.213387" level="INFO">python3 play.py --amount 1 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --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-04-17T03:24:55.213048" elapsed="0.000396"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:24:55.219239" level="INFO">python3 play.py --amount 1 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --peerport=1790 --debug --logfile bgp_peer.log --bgpls True &amp;&gt;bgp_peer.log</msg>
<msg time="2026-04-17T03:24:55.219391" level="INFO">${output} = python3 play.py --amount 1 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --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-04-17T03:24:55.213631" elapsed="0.005804"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:24:55.220172" level="INFO">python3 play.py --amount 1 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --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-04-17T03:24:55.219726" elapsed="0.000521"/>
</kw>
<arg>${BGP_PEER_COMMAND}</arg>
<arg>${BGP_PEER_OPTIONS}</arg>
<doc>Start the tool ${command} ${tool_opt}</doc>
<status status="PASS" start="2026-04-17T03:24:55.211886" elapsed="0.008448"/>
</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-04-17T03:25:05.223631" 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-04-17T03:24:55.223047" elapsed="10.001466">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-04-17T03:25:05.224902" elapsed="0.000049"/>
</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-04-17T03:24:55.222550" elapsed="10.002538">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-04-17T03:24:55.221822" elapsed="10.003405"/>
</kw>
<msg time="2026-04-17T03:25:05.225354" 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-04-17T03:24:55.221214" elapsed="10.004166"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-04-17T03:25:05.225571" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-04-17T03:25:05.225476" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:05.225449" elapsed="0.000214"/>
</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-04-17T03:25:05.225904" elapsed="0.000041"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was seen but it was not expected yet</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:05.226101" 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-04-17T03:24:55.220744" elapsed="10.005438"/>
</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-04-17T03:25:05.227686" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:05.227267" elapsed="0.000482"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:05.227246" elapsed="0.000528"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:05.227949" elapsed="0.000384"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:25:05.235062" 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-04-17T03:25:05.234529" elapsed="0.000565"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-04-17T03:25:05.235337" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-04-17T03:25:05.235183" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:05.235160" elapsed="0.000269"/>
</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-04-17T03:25:05.235588" 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-04-17T03:25:05.235777" elapsed="0.000022"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:05.235974" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:05.236149" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:05.236325" elapsed="0.000022"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:05.236538" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:05.236949" 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-04-17T03:25:05.234150" elapsed="0.002891"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:05.227048" elapsed="0.010046"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-17T03:25:05.226475" elapsed="0.010662"/>
</kw>
<doc>Connect BGP peer</doc>
<tag>critical</tag>
<status status="PASS" start="2026-04-17T03:24:55.139803" elapsed="10.097378"/>
</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-04-17T03:25:05.240792" elapsed="0.000243"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:25:05.240469" elapsed="0.000623"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:25:05.242146" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:05.242033" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:05.242013" 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-04-17T03:25:05.247483" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:05.247374" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:05.247355" elapsed="0.000204"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:05.248827" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:25:05.248332" elapsed="0.000525"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:25:05.249349" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:25:05.249044" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:25:05.249420" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:25:05.249583" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:25:05.247890" elapsed="0.001718"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:25:05.255884" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:05.255769" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:05.255748" elapsed="0.000308"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:25:05.257344" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:05.257234" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:05.257215" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:25:05.257884" level="INFO">${karaf_connection_index} = 30</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:25:05.257565" elapsed="0.000346"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:05.258326" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:25:05.258101" elapsed="0.000250"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:25:05.259152" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:25:05.258863" elapsed="0.000989">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:25:05.260062" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:25:05.260108" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:05.258517" elapsed="0.001615"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:25:05.261258" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:25:05.260963" elapsed="0.001125">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:25:05.262276" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:25:05.262323" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:05.260306" elapsed="0.002040"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:25:05.263337" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC2_Check_Example_Bgp_Rib"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:25:05.262650" elapsed="0.000750">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC2_Check_Example_Bgp_Rib"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:05.262422" elapsed="0.001052">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC2_Check_Example_Bgp_Rib"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:25:05.262402" elapsed="0.001104">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC2_Check_Example_Bgp_Rib"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:05.263677" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:05.263908" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:05.263763" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:05.263747" elapsed="0.000255"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:25:05.264035" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:25:05.266956" elapsed="0.000201"/>
</kw>
<msg time="2026-04-17T03:25:05.267264" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:05.265582" elapsed="0.001873"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:05.267838" elapsed="0.000127"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:05.268345" 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-04-17T03:25:05.264899" elapsed="0.003702"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:25:05.264329" elapsed="0.004383"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:25:05.256892" elapsed="0.011944">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC2_Check_Example_Bgp_Rib"</status>
</kw>
<msg time="2026-04-17T03:25:05.269132" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:25:05.269198" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC2_Check_Example_Bgp_Rib"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:05.256227" elapsed="0.013005"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:25:05.269584" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:05.269351" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:05.269320" elapsed="0.000368"/>
</if>
<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-04-17T03:25:05.271361" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:05.271247" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:05.271228" elapsed="0.000204"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:05.271805" level="INFO">index=15
host=10.30.171.238
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-04-17T03:25:05.271922" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
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-04-17T03:25:05.271614" elapsed="0.000474"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:05.272603" level="INFO">{1: 30}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:05.272254" elapsed="0.000395"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:05.273133" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:05.272862" elapsed="0.000316"/>
</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-04-17T03:25:05.273762" elapsed="0.000305"/>
</kw>
<msg time="2026-04-17T03:25:05.274170" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:25:05.274217" level="INFO">${old_connection_index} = 30</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:05.273347" elapsed="0.000895"/>
</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-04-17T03:25:05.275194" elapsed="0.000203"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:25:05.276666" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:25:05.276149" elapsed="0.001558">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:05.275576" elapsed="0.002233"/>
</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-04-17T03:25:05.278484" elapsed="0.000285"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:05.278003" elapsed="0.000872"/>
</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-04-17T03:25:05.274559" elapsed="0.004418"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:05.274327" elapsed="0.004720"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:05.274308" elapsed="0.004778"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:25:05.280331" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:25:05.279905" elapsed="0.000458"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:25:05.280429" elapsed="0.000047"/>
</return>
<msg time="2026-04-17T03:25:05.280623" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:25:05.279416" elapsed="0.001233"/>
</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-04-17T03:25:05.280836" elapsed="0.000475"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:05.281597" level="INFO">index=31
host=10.30.170.120
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-04-17T03:25:05.281700" level="INFO">${karaf_connection_object} = index=31
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:25:05.281486" elapsed="0.000240"/>
</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-04-17T03:25:05.281879" elapsed="0.002917"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:25:05.285332" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:25:05.286498" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:25:05.285061" elapsed="0.001826">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:25:05.303005" elapsed="0.000591"/>
</kw>
<msg time="2026-04-17T03:25:05.303805" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:05.300860" elapsed="0.003180"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:05.304247" elapsed="0.000032"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:05.304454" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:25:05.287760" elapsed="0.016782"/>
</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-04-17T03:25:05.287224" elapsed="0.017382"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:25:05.270644" elapsed="0.034143">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:05.305210" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:25:05.305288" elapsed="0.000023"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:25:05.255395" elapsed="0.050012">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:25:05.305522" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:25:05.305566" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:05.250018" elapsed="0.055572"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:05.306110" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:05.305675" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:05.305654" elapsed="0.000540"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:25:05.249851" elapsed="0.056368"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:25:05.249668" elapsed="0.056587"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:25:05.247005" elapsed="0.059310"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:25:05.241711" elapsed="0.064662"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:05.241251" elapsed="0.065167"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:25:05.238183" elapsed="0.068291"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:25:05.307178" level="INFO">&amp;{mapping} = { IP=10.30.171.238 | 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-04-17T03:25:05.306680" elapsed="0.000527"/>
</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-04-17T03:25:05.359266" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:05.358812" elapsed="0.000489"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:05.360157" 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-04-17T03:25:05.359832" elapsed="0.000402">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-04-17T03:25:05.360331" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:05.359481" elapsed="0.000875"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:05.360985" 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-04-17T03:25:05.360524" elapsed="0.000489"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:25:05.361396" 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-04-17T03:25:05.361571" 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-04-17T03:25:05.361178" elapsed="0.000421"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:05.362043" 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-04-17T03:25:05.361775" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:05.363155" level="INFO">mapping: {'IP': '10.30.171.238', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:05.362872" elapsed="0.000327"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:25:05.363630" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:25:05.363361" elapsed="0.000294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:25:05.364386" level="INFO">${value} = 10.30.171.238</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:25:05.364040" elapsed="0.000372"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:25:05.365355" level="INFO">${encoded} = 10.30.171.238</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:25:05.365006" elapsed="0.000375"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:25:05.365434" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:25:05.365597" level="INFO">${encoded_value} = 10.30.171.238</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:25:05.364606" elapsed="0.001015"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:25:05.365777" elapsed="0.000307"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.238</var>
<status status="PASS" start="2026-04-17T03:25:05.363883" elapsed="0.002241"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:25:05.366694" 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-04-17T03:25:05.366373" elapsed="0.000346"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:25:05.367606" 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-04-17T03:25:05.367274" elapsed="0.000358"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:25:05.367679" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:25:05.367829" 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-04-17T03:25:05.366907" 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-04-17T03:25:05.368020" elapsed="0.000271"/>
</kw>
<var name="${key}">ROUTE_KEY</var>
<var name="${value}">AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</var>
<status status="PASS" start="2026-04-17T03:25:05.366238" elapsed="0.002093"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:25:05.363706" elapsed="0.004659"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:25:05.368407" elapsed="0.000027"/>
</return>
<msg time="2026-04-17T03:25:05.368563" level="INFO">${mapping_to_use} = {'IP': '10.30.171.238', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:25:05.362546" elapsed="0.006042"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:05.362175" elapsed="0.006444"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:05.368823" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:05.368644" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:05.362149" elapsed="0.006750"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:25:05.369662" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-l...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:25:05.369068" elapsed="0.000623"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:25:05.369738" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:25:05.358042" elapsed="0.011821"/>
</kw>
<msg time="2026-04-17T03:25:05.369972" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:05.344630" elapsed="0.025395"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:25:05.384433" 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-04-17T03:25:05.397274" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:05.410069" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:05.410301" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:05.410487" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:05.410892" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:05.410736" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:05.410719" 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-04-17T03:25:05.411141" 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-04-17T03:25:05.411314" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:05.411482" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:25:05.410683" elapsed="0.000850"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:25:05.410567" elapsed="0.000994"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:05.411711" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:05.411787" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:25:05.411952" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-l...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:25:05.339879" elapsed="0.072104"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:05.413428" 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-04-17T03:25:05.413109" elapsed="0.000394">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-04-17T03:25:05.413598" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:05.412706" elapsed="0.000917"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:05.414036" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:05.413752" elapsed="0.000342"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:05.414617" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:05.414314" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:05.414120" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:05.413733" elapsed="0.000968"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:05.417154" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:25:05.414858" elapsed="0.002323"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:25:05.417232" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:25:05.417392" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:25:05.412334" elapsed="0.005083"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:05.418660" 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-04-17T03:25:05.418422" elapsed="0.000302">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-04-17T03:25:05.418818" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:05.418078" elapsed="0.000764"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:25:05.419062" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-17T03:25:05.418911" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:05.418893" elapsed="0.000251"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:05.419295" 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-04-17T03:25:05.419469" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:25:05.419533" elapsed="0.000014"/>
</return>
<msg time="2026-04-17T03:25:05.421711" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:25:05.417730" elapsed="0.004007"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:05.423167" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:25:05.422893" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:05.423617" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:05.423373" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:25:05.428993" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<msg time="2026-04-17T03:25:05.630790" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<msg time="2026-04-17T03:25:06.034251" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<msg time="2026-04-17T03:25:06.046814" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:25:05.425892" elapsed="0.626195">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:05.423724" elapsed="0.628732">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:06.053025" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:06.052552" elapsed="0.000632"/>
</branch>
<status status="FAIL" start="2026-04-17T03:25:05.423707" elapsed="0.629532">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:06.054303" elapsed="0.000067"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:06.054643" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:06.054549" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:06.054506" elapsed="0.000327"/>
</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-04-17T03:25:06.055301" elapsed="0.000067"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:25:06.055496" elapsed="0.000037"/>
</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-04-17T03:25:05.422071" elapsed="0.633774">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:06.056126" elapsed="0.000043"/>
</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-04-17T03:25:05.317092" elapsed="0.739423">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:06.057357" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:06.056833" elapsed="0.000608"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:06.056780" elapsed="0.000687"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:06.057517" elapsed="0.000026"/>
</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-04-17T03:25:05.312519" elapsed="0.745142">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:07.119205" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:07.118750" elapsed="0.000491"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:07.120100" 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-04-17T03:25:07.119787" elapsed="0.000393">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-04-17T03:25:07.120369" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:07.119426" elapsed="0.000977"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:07.121013" 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-04-17T03:25:07.120585" elapsed="0.000456"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:25:07.121359" 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-04-17T03:25:07.121525" 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-04-17T03:25:07.121212" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:07.122039" 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-04-17T03:25:07.121757" elapsed="0.000333"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:07.123197" level="INFO">mapping: {'IP': '10.30.171.238', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:07.122898" elapsed="0.000346"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:25:07.123690" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:25:07.123413" elapsed="0.000303"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:25:07.124596" level="INFO">${value} = 10.30.171.238</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:25:07.124193" elapsed="0.000433"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:25:07.125684" level="INFO">${encoded} = 10.30.171.238</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:25:07.125292" elapsed="0.000422"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:25:07.125775" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:25:07.125982" level="INFO">${encoded_value} = 10.30.171.238</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:25:07.124853" elapsed="0.001158"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:25:07.126200" elapsed="0.000329"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.238</var>
<status status="PASS" start="2026-04-17T03:25:07.124017" elapsed="0.002557"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:25:07.127467" 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-04-17T03:25:07.126855" elapsed="0.000642"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:25:07.128477" 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-04-17T03:25:07.128099" elapsed="0.000405"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:25:07.128555" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:25:07.128713" 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-04-17T03:25:07.127695" elapsed="0.001043"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:25:07.128896" elapsed="0.000355"/>
</kw>
<var name="${key}">ROUTE_KEY</var>
<var name="${value}">AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</var>
<status status="PASS" start="2026-04-17T03:25:07.126698" elapsed="0.002607"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:25:07.123769" elapsed="0.005577"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:25:07.129396" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:25:07.129563" level="INFO">${mapping_to_use} = {'IP': '10.30.171.238', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:25:07.122540" elapsed="0.007049"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:07.122173" 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 variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:07.129846" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:07.129650" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:07.122148" elapsed="0.007816"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:25:07.130828" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-l...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:25:07.130123" elapsed="0.000735"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:25:07.130982" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:25:07.117977" elapsed="0.013142"/>
</kw>
<msg time="2026-04-17T03:25:07.131193" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:07.103544" elapsed="0.027707"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:25:07.146206" elapsed="0.000070"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:25:07.160884" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:07.175304" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:07.175566" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:07.175780" elapsed="0.000070"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:07.176311" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:07.176134" elapsed="0.000238"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:07.176114" 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-04-17T03:25:07.176572" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:07.176761" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:07.176970" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:25:07.176072" elapsed="0.000957"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:25:07.175921" elapsed="0.001139"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:07.177231" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:07.177316" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:25:07.177504" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-l...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:25:07.098600" elapsed="0.078935"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:07.179211" 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-04-17T03:25:07.178879" elapsed="0.000414">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-04-17T03:25:07.179401" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:07.178418" elapsed="0.001010"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:07.179817" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:07.179505" elapsed="0.000374"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:07.180460" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:07.180141" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:07.179906" elapsed="0.000620"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:07.179486" elapsed="0.001062"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:07.183500" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:25:07.180722" elapsed="0.002807"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:25:07.183587" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:25:07.183760" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:25:07.178009" elapsed="0.005792"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:07.185194" 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-04-17T03:25:07.184918" elapsed="0.000347">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-04-17T03:25:07.185365" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:07.184541" elapsed="0.000850"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:25:07.185614" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:25:07.185467" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:07.185447" elapsed="0.000256"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:07.185871" 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-04-17T03:25:07.186084" elapsed="0.000023"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:25:07.186156" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:25:07.188444" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:25:07.184171" elapsed="0.004301"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:07.190061" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:25:07.189764" elapsed="0.000349"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:07.190552" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:07.190290" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:25:07.196541" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<msg time="2026-04-17T03:25:07.398190" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<msg time="2026-04-17T03:25:07.803884" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<msg time="2026-04-17T03:25:07.806553" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:25:07.193120" elapsed="0.618973">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:07.190670" elapsed="0.621644">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:07.812835" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:07.812407" elapsed="0.000608"/>
</branch>
<status status="FAIL" start="2026-04-17T03:25:07.190650" elapsed="0.622422">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:07.814022" elapsed="0.000064"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:07.814440" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:07.814349" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:07.814293" elapsed="0.000298"/>
</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-04-17T03:25:07.815018" elapsed="0.000060"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:25:07.815197" elapsed="0.000034"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:25:07.188834" elapsed="0.626610">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:07.815693" elapsed="0.000036"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:25:07.073465" elapsed="0.742448">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:07.816500" elapsed="0.000279"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:07.816215" elapsed="0.000621"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:07.816171" elapsed="0.000690"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:07.816895" elapsed="0.000015"/>
</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-04-17T03:25:07.066976" elapsed="0.750050">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:08.880486" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:08.879727" elapsed="0.000811"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:08.882569" 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-04-17T03:25:08.882092" elapsed="0.000633">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-04-17T03:25:08.882959" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:08.880904" elapsed="0.002135"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:08.884296" 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-04-17T03:25:08.883425" elapsed="0.000927"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:25:08.885063" 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-04-17T03:25:08.885364" 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-04-17T03:25:08.884700" elapsed="0.000723"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:08.886357" 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-04-17T03:25:08.885773" elapsed="0.000684"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:08.889431" level="INFO">mapping: {'IP': '10.30.171.238', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:08.888952" elapsed="0.000549"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:25:08.890033" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:25:08.889696" elapsed="0.000364"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:25:08.890841" level="INFO">${value} = 10.30.171.238</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:25:08.890482" elapsed="0.000386"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:25:08.891983" level="INFO">${encoded} = 10.30.171.238</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:25:08.891592" elapsed="0.000419"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:25:08.892067" elapsed="0.000047"/>
</return>
<msg time="2026-04-17T03:25:08.892246" level="INFO">${encoded_value} = 10.30.171.238</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:25:08.891186" elapsed="0.001085"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:25:08.892437" elapsed="0.000670"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.238</var>
<status status="PASS" start="2026-04-17T03:25:08.890333" elapsed="0.002818"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:25:08.893739" 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-04-17T03:25:08.893410" elapsed="0.000355"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:25:08.894709" 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-04-17T03:25:08.894374" elapsed="0.000362"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:25:08.894786" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:25:08.894983" 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-04-17T03:25:08.894023" elapsed="0.000986"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:25:08.895170" elapsed="0.000280"/>
</kw>
<var name="${key}">ROUTE_KEY</var>
<var name="${value}">AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</var>
<status status="PASS" start="2026-04-17T03:25:08.893268" elapsed="0.002224"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:25:08.890122" elapsed="0.005587"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:25:08.895753" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:25:08.895993" level="INFO">${mapping_to_use} = {'IP': '10.30.171.238', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:25:08.887367" elapsed="0.008654"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:08.886647" elapsed="0.009408"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:08.896247" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:08.896085" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:08.886569" elapsed="0.009756"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:25:08.897249" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-l...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:25:08.896476" elapsed="0.000802"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:25:08.897328" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:25:08.878738" elapsed="0.018717"/>
</kw>
<msg time="2026-04-17T03:25:08.897513" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:08.864826" elapsed="0.032741"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:25:08.910267" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:08.922797" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:08.935942" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:08.936148" 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-04-17T03:25:08.936330" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:08.936704" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:08.936553" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:08.936538" 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-04-17T03:25:08.936942" 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-04-17T03:25:08.937116" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:08.937283" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:25:08.936507" elapsed="0.000828"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:25:08.936407" elapsed="0.000952"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:08.937508" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:08.937619" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:25:08.937750" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-l...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:25:08.859313" elapsed="0.078463"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:08.939112" 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-04-17T03:25:08.938815" elapsed="0.000375">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-04-17T03:25:08.939284" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:08.938462" elapsed="0.000847"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:08.939631" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:08.939378" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:08.940211" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:08.939899" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:08.939711" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:08.939361" elapsed="0.000931"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:08.942860" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:25:08.940446" elapsed="0.002441"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:25:08.942984" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:25:08.943146" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:25:08.938130" elapsed="0.005042"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:08.944405" 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-04-17T03:25:08.944176" elapsed="0.000292">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-04-17T03:25:08.944563" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:08.943814" elapsed="0.000773"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:25:08.944790" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:25:08.944656" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:08.944638" elapsed="0.000235"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:08.945039" 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-04-17T03:25:08.945215" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:25:08.945280" elapsed="0.000014"/>
</return>
<msg time="2026-04-17T03:25:08.947268" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:25:08.943485" elapsed="0.003810"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:08.948692" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:25:08.948442" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:08.949154" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:08.948895" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:25:08.954315" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<msg time="2026-04-17T03:25:09.155853" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<msg time="2026-04-17T03:25:09.558914" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<msg time="2026-04-17T03:25:09.562105" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:25:08.951393" elapsed="0.616454">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:08.949262" elapsed="0.618751">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:09.568371" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:09.568074" elapsed="0.000395"/>
</branch>
<status status="FAIL" start="2026-04-17T03:25:08.949244" elapsed="0.619259">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:09.569157" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:09.569358" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:09.569302" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:09.569277" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:09.569683" elapsed="0.000039"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:25:09.569805" 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-04-17T03:25:08.947606" elapsed="0.622409">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:09.570130" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:25:08.831353" elapsed="0.738918">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:09.570718" elapsed="0.000463"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:09.570406" elapsed="0.000853"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:09.570382" elapsed="0.000979"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:09.571417" elapsed="0.000023"/>
</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-04-17T03:25:08.823518" elapsed="0.748053">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:10.631894" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:10.631332" elapsed="0.000625"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:10.633047" 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-04-17T03:25:10.632700" elapsed="0.000443">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-04-17T03:25:10.633286" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:10.632212" elapsed="0.001110"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:10.634085" 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-04-17T03:25:10.633568" elapsed="0.000549"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:25:10.634552" 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-04-17T03:25:10.634984" 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-04-17T03:25:10.634349" elapsed="0.000671"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:10.635615" 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-04-17T03:25:10.635255" elapsed="0.000432"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:10.636972" level="INFO">mapping: {'IP': '10.30.171.238', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:10.636613" elapsed="0.000419"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:25:10.637537" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:25:10.637219" elapsed="0.000358"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:25:10.638405" level="INFO">${value} = 10.30.171.238</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:25:10.638016" elapsed="0.000415"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:25:10.639947" level="INFO">${encoded} = 10.30.171.238</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:25:10.639199" elapsed="0.000788"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:25:10.640058" elapsed="0.000053"/>
</return>
<msg time="2026-04-17T03:25:10.640284" level="INFO">${encoded_value} = 10.30.171.238</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:25:10.638679" elapsed="0.001642"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:25:10.640532" elapsed="0.000309"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.238</var>
<status status="PASS" start="2026-04-17T03:25:10.637852" elapsed="0.003032"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:25:10.641587" 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-04-17T03:25:10.641237" elapsed="0.000377"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:25:10.642595" 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-04-17T03:25:10.642227" elapsed="0.000396"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:25:10.642734" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:25:10.642896" 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-04-17T03:25:10.641813" elapsed="0.001109"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:25:10.643130" elapsed="0.000285"/>
</kw>
<var name="${key}">ROUTE_KEY</var>
<var name="${value}">AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</var>
<status status="PASS" start="2026-04-17T03:25:10.641094" elapsed="0.002362"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:25:10.637648" elapsed="0.005843"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:25:10.643535" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:25:10.643726" level="INFO">${mapping_to_use} = {'IP': '10.30.171.238', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:25:10.636216" elapsed="0.007535"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:10.635779" elapsed="0.008005"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:10.643995" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:10.643812" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:10.635752" elapsed="0.008322"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:25:10.644911" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-l...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:25:10.644230" elapsed="0.000729"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:25:10.645010" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:25:10.630268" elapsed="0.014875"/>
</kw>
<msg time="2026-04-17T03:25:10.645200" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:10.613360" elapsed="0.031894"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:25:10.659260" elapsed="0.000074"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:25:10.674724" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:25:10.688100" elapsed="0.000056"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:10.688416" 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-04-17T03:25:10.688649" 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-04-17T03:25:10.689133" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:10.688972" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:10.688953" 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-04-17T03:25:10.689393" elapsed="0.000030"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:10.689691" 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-04-17T03:25:10.689870" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:25:10.688896" elapsed="0.001044"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:25:10.688739" elapsed="0.001232"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:10.690150" elapsed="0.000029"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:10.690259" elapsed="0.000023"/>
</return>
<msg time="2026-04-17T03:25:10.690436" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-l...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:25:10.608477" elapsed="0.081989"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:10.692087" 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-04-17T03:25:10.691760" elapsed="0.000410">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-04-17T03:25:10.692266" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:10.691242" elapsed="0.001049"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:10.692630" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:10.692361" elapsed="0.000326"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:10.693230" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:10.692905" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:10.692711" elapsed="0.000581"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:10.692343" elapsed="0.000969"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:10.696015" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:25:10.693466" elapsed="0.002576"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:25:10.696095" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:25:10.696254" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:25:10.690855" elapsed="0.005423"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:10.697522" 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-04-17T03:25:10.697287" elapsed="0.000299">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-17T03:25:10.697680" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:10.696939" elapsed="0.000766"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:25:10.697910" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-04-17T03:25:10.697774" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:10.697756" elapsed="0.000255"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:10.698221" 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-04-17T03:25:10.698423" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:25:10.698490" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:25:10.700525" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:25:10.696594" elapsed="0.003959"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:10.702150" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:25:10.701831" elapsed="0.000370"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:10.702730" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:10.702391" 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-04-17T03:25:10.708178" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<msg time="2026-04-17T03:25:10.909977" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<msg time="2026-04-17T03:25:11.312703" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<msg time="2026-04-17T03:25:11.315579" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:25:10.705165" elapsed="0.614475">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:10.702843" elapsed="0.616911">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:11.320062" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:11.319802" elapsed="0.000332"/>
</branch>
<status status="FAIL" start="2026-04-17T03:25:10.702825" elapsed="0.617334">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:11.320620" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:11.320763" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:11.320723" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:11.320704" elapsed="0.000126"/>
</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-04-17T03:25:11.321001" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:25:11.321073" 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-04-17T03:25:10.700948" elapsed="0.620240">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:11.321264" 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-04-17T03:25:10.583237" elapsed="0.738124">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:11.321964" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:11.321735" elapsed="0.000305"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:11.321488" elapsed="0.000576"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:11.322098" elapsed="0.000015"/>
</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-04-17T03:25:10.577525" elapsed="0.744676">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:12.383676" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:12.383263" elapsed="0.000459"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:12.384671" 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-04-17T03:25:12.384325" elapsed="0.000429">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-04-17T03:25:12.384853" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:12.383964" elapsed="0.000913"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:12.385505" 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-04-17T03:25:12.385070" elapsed="0.000465"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:25:12.385845" 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-04-17T03:25:12.386033" 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-04-17T03:25:12.385701" elapsed="0.000360"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:12.386486" 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-04-17T03:25:12.386229" 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-04-17T03:25:12.387562" level="INFO">mapping: {'IP': '10.30.171.238', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:12.387303" elapsed="0.000306"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:25:12.388086" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:25:12.387774" elapsed="0.000348"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:25:12.388897" level="INFO">${value} = 10.30.171.238</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:25:12.388543" elapsed="0.000416"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:25:12.391795" level="INFO">${encoded} = 10.30.171.238</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:25:12.389539" elapsed="0.002284"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:25:12.391879" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:25:12.392069" level="INFO">${encoded_value} = 10.30.171.238</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:25:12.389168" elapsed="0.002978"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:25:12.392332" elapsed="0.000353"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.238</var>
<status status="PASS" start="2026-04-17T03:25:12.388398" elapsed="0.004333"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:25:12.393482" 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-04-17T03:25:12.393039" elapsed="0.000471"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:25:12.394487" 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-04-17T03:25:12.394133" elapsed="0.000385"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:25:12.394570" elapsed="0.000049"/>
</return>
<msg time="2026-04-17T03:25:12.394760" 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-04-17T03:25:12.393708" elapsed="0.001077"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:25:12.394960" elapsed="0.000279"/>
</kw>
<var name="${key}">ROUTE_KEY</var>
<var name="${value}">AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</var>
<status status="PASS" start="2026-04-17T03:25:12.392849" elapsed="0.002432"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:25:12.388192" elapsed="0.007125"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:25:12.395360" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:25:12.395518" level="INFO">${mapping_to_use} = {'IP': '10.30.171.238', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:25:12.386967" elapsed="0.008577"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:12.386616" elapsed="0.008959"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:12.395794" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:12.395601" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:12.386590" elapsed="0.009284"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:25:12.396646" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-l...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:25:12.396044" elapsed="0.000632"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:25:12.396724" 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//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-04-17T03:25:12.382598" elapsed="0.014251"/>
</kw>
<msg time="2026-04-17T03:25:12.396905" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:12.368887" elapsed="0.028085"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:25:12.410090" 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-04-17T03:25:12.423177" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:25:12.437010" elapsed="0.000047"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:12.437408" 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-04-17T03:25:12.437599" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:12.438085" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:12.437866" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:12.437849" 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-04-17T03:25:12.438356" 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-04-17T03:25:12.438536" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:12.438706" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:25:12.437810" elapsed="0.000950"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:25:12.437683" elapsed="0.001104"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:12.438985" elapsed="0.000027"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:12.439107" elapsed="0.000026"/>
</return>
<msg time="2026-04-17T03:25:12.439315" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-l...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:25:12.363074" elapsed="0.076275"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:12.441108" 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-04-17T03:25:12.440779" elapsed="0.000427">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-04-17T03:25:12.441364" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:12.440288" elapsed="0.001110"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:12.441855" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:12.441492" elapsed="0.000459"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:12.442609" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:12.442237" elapsed="0.000406"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:12.441984" elapsed="0.000703"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:12.441469" elapsed="0.001244"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:12.445888" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:25:12.442916" elapsed="0.003002"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:25:12.445991" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:25:12.446157" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:25:12.439787" elapsed="0.006396"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:12.447798" 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-04-17T03:25:12.447491" elapsed="0.000389">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-04-17T03:25:12.448025" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:12.447038" elapsed="0.001018"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:25:12.448316" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-04-17T03:25:12.448146" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:12.448124" elapsed="0.000364"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:12.448702" 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-04-17T03:25:12.448985" elapsed="0.000030"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:25:12.449079" elapsed="0.000023"/>
</return>
<msg time="2026-04-17T03:25:12.451297" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:25:12.446564" elapsed="0.004761"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:12.452865" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:25:12.452574" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:12.453384" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:12.453094" elapsed="0.000335"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:25:12.458848" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<msg time="2026-04-17T03:25:12.660588" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<msg time="2026-04-17T03:25:13.063690" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<msg time="2026-04-17T03:25:13.067332" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:25:12.455646" elapsed="0.616356">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:12.453497" elapsed="0.618666">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:13.072581" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:13.072230" elapsed="0.000461"/>
</branch>
<status status="FAIL" start="2026-04-17T03:25:12.453479" elapsed="0.619247">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:13.073457" elapsed="0.000042"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:13.073692" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:13.073632" elapsed="0.000159"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:13.073601" elapsed="0.000236"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:13.074125" elapsed="0.000035"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:25:13.074234" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:25:12.451694" elapsed="0.622711">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:13.074626" elapsed="0.000031"/>
</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-04-17T03:25:12.336300" elapsed="0.738490">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:13.075292" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:13.075001" elapsed="0.000401"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:13.074910" elapsed="0.000527"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:13.075486" elapsed="0.000021"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}/lsp/effective_rib_in</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-04-17T03:25:12.328740" elapsed="0.746911">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:14.131962" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:14.131518" elapsed="0.000479"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:14.132851" 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-04-17T03:25:14.132589" elapsed="0.000355">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-04-17T03:25:14.133045" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:14.132180" elapsed="0.000890"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:14.133656" 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-04-17T03:25:14.133259" elapsed="0.000424"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:25:14.134010" 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-04-17T03:25:14.134181" 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-04-17T03:25:14.133851" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:14.134708" 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-04-17T03:25:14.134412" 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-04-17T03:25:14.136040" level="INFO">mapping: {'IP': '10.30.171.238', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:14.135684" elapsed="0.000403"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:25:14.136704" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:25:14.136358" elapsed="0.000373"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:25:14.137486" level="INFO">${value} = 10.30.171.238</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:25:14.137131" elapsed="0.000382"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:25:14.138559" level="INFO">${encoded} = 10.30.171.238</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:25:14.138132" elapsed="0.000461"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:25:14.138663" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:25:14.138837" level="INFO">${encoded_value} = 10.30.171.238</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:25:14.137743" elapsed="0.001119"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:25:14.139060" elapsed="0.000349"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.238</var>
<status status="PASS" start="2026-04-17T03:25:14.136984" elapsed="0.002471"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:25:14.140102" 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-04-17T03:25:14.139752" elapsed="0.000377"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:25:14.141254" 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-04-17T03:25:14.140890" elapsed="0.000391"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:25:14.141332" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:25:14.141486" 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-04-17T03:25:14.140534" elapsed="0.000977"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:25:14.141669" elapsed="0.000289"/>
</kw>
<var name="${key}">ROUTE_KEY</var>
<var name="${value}">AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</var>
<status status="PASS" start="2026-04-17T03:25:14.139591" elapsed="0.002410"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:25:14.136786" elapsed="0.005250"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:25:14.142079" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:25:14.142273" level="INFO">${mapping_to_use} = {'IP': '10.30.171.238', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:25:14.135239" elapsed="0.007060"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:14.134840" elapsed="0.007493"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:14.142515" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:14.142360" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:14.134815" elapsed="0.007777"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:25:14.143385" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-l...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:25:14.142743" elapsed="0.000671"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:25:14.143465" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:25:14.130764" elapsed="0.012830"/>
</kw>
<msg time="2026-04-17T03:25:14.143651" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:14.117363" elapsed="0.026340"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:25:14.157197" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//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-04-17T03:25:14.170464" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:25:14.183860" elapsed="0.000051"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:14.184169" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:14.184358" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:14.184836" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:14.184676" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:14.184659" 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-04-17T03:25:14.185087" 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-04-17T03:25:14.185259" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:14.185428" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:25:14.184619" elapsed="0.000861"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:25:14.184443" elapsed="0.001066"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:14.185664" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:14.185745" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:25:14.185913" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-l...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:25:14.112610" elapsed="0.073347"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:14.187498" 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-04-17T03:25:14.187203" elapsed="0.000374">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-04-17T03:25:14.187674" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:14.186766" elapsed="0.000939"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:14.188114" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:14.187790" elapsed="0.000383"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:14.188716" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:14.188391" elapsed="0.000352"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:14.188199" elapsed="0.000579"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:14.187766" elapsed="0.001033"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:14.191471" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:25:14.188968" elapsed="0.002530"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:25:14.191551" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:25:14.191711" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:25:14.186391" elapsed="0.005345"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:14.193095" 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-04-17T03:25:14.192841" elapsed="0.000318">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-04-17T03:25:14.193254" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:14.192494" elapsed="0.000785"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:25:14.193487" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-17T03:25:14.193350" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:14.193332" 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-04-17T03:25:14.193725" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:14.193901" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:25:14.193983" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:25:14.196008" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:25:14.192129" elapsed="0.003906"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:14.197540" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:25:14.197273" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:14.198010" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:14.197746" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:25:14.203273" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<msg time="2026-04-17T03:25:14.404712" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<msg time="2026-04-17T03:25:14.807371" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<msg time="2026-04-17T03:25:14.809681" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:25:14.200308" elapsed="0.615047">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:14.198143" elapsed="0.617443">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:14.816231" elapsed="0.000078"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:14.815680" elapsed="0.000737"/>
</branch>
<status status="FAIL" start="2026-04-17T03:25:14.198118" elapsed="0.618355">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:14.817540" elapsed="0.000061"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:14.817852" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:14.817765" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:14.817726" elapsed="0.000300"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:14.818365" elapsed="0.000047"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:25:14.818519" elapsed="0.000032"/>
</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-04-17T03:25:14.196358" elapsed="0.622403">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:14.818980" elapsed="0.000037"/>
</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-04-17T03:25:14.086480" elapsed="0.732725">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:14.819821" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:14.819412" elapsed="0.000601"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:14.819376" elapsed="0.000694"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:14.820164" elapsed="0.000033"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}/lsp/effective_rib_in</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-04-17T03:25:14.081118" elapsed="0.739266">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:15.882443" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:15.882022" elapsed="0.000456"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:15.883287" 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-04-17T03:25:15.883028" elapsed="0.000337">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/lsp/effective_rib_in.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-17T03:25:15.883470" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:15.882660" elapsed="0.000835"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:15.884104" 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-04-17T03:25:15.883688" elapsed="0.000444"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:25:15.884442" 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-04-17T03:25:15.884612" 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-04-17T03:25:15.884298" elapsed="0.000411"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:15.885146" 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-04-17T03:25:15.884874" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:15.886249" level="INFO">mapping: {'IP': '10.30.171.238', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:15.885985" elapsed="0.000312"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:25:15.886738" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:25:15.886462" elapsed="0.000303"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:25:15.887506" level="INFO">${value} = 10.30.171.238</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:25:15.887155" elapsed="0.000377"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:25:15.888491" level="INFO">${encoded} = 10.30.171.238</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:25:15.888140" elapsed="0.000378"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:25:15.888571" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:25:15.888743" level="INFO">${encoded_value} = 10.30.171.238</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:25:15.887764" elapsed="0.001005"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:25:15.888962" elapsed="0.000297"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.238</var>
<status status="PASS" start="2026-04-17T03:25:15.887012" elapsed="0.002289"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:25:15.890096" 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-04-17T03:25:15.889556" elapsed="0.000566"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:25:15.891022" 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-04-17T03:25:15.890668" elapsed="0.000381"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:25:15.891099" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:25:15.891253" 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-04-17T03:25:15.890317" elapsed="0.000961"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:25:15.891438" elapsed="0.000349"/>
</kw>
<var name="${key}">ROUTE_KEY</var>
<var name="${value}">AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</var>
<status status="PASS" start="2026-04-17T03:25:15.889418" elapsed="0.002421"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:25:15.886817" elapsed="0.005064"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:25:15.891940" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:25:15.892105" level="INFO">${mapping_to_use} = {'IP': '10.30.171.238', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:25:15.885630" elapsed="0.006501"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:15.885275" elapsed="0.006888"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:15.892344" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:15.892189" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:15.885251" elapsed="0.007169"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:25:15.893203" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-l...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:25:15.892569" elapsed="0.000664"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:25:15.893282" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//lsp/effective_rib_in/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:25:15.881322" elapsed="0.012087"/>
</kw>
<msg time="2026-04-17T03:25:15.893464" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:15.867589" elapsed="0.025926"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:25:15.907055" 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//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-04-17T03:25:15.921293" elapsed="0.000062"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:25:15.936448" elapsed="0.000073"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:15.936853" 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-04-17T03:25:15.937138" 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-04-17T03:25:15.937748" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:15.937512" elapsed="0.000322"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:15.937487" elapsed="0.000389"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:15.938100" 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-04-17T03:25:15.938336" elapsed="0.000029"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:15.938580" elapsed="0.000030"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:25:15.937437" elapsed="0.001219"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:25:15.937254" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:15.938898" elapsed="0.000046"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:15.939026" elapsed="0.000027"/>
</return>
<msg time="2026-04-17T03:25:15.939268" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-l...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:25:15.862859" elapsed="0.076462"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:15.941032" 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-04-17T03:25:15.940690" elapsed="0.000434">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-04-17T03:25:15.941225" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:15.940219" 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-04-17T03:25:15.941613" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:15.941324" elapsed="0.000348"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:15.942291" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:15.941982" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:15.941762" elapsed="0.000592"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:15.941305" elapsed="0.001071"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:15.945730" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:25:15.942535" elapsed="0.003227"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:25:15.945825" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:25:15.946019" level="INFO">${jmes_expression} = </msg>
<var>${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-04-17T03:25:15.939808" elapsed="0.006236"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:15.947659" 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-04-17T03:25:15.947346" elapsed="0.000389">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-04-17T03:25:15.947831" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:15.946768" elapsed="0.001086"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:25:15.948089" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:25:15.947941" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:15.947908" 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-04-17T03:25:15.948325" 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-04-17T03:25:15.948531" elapsed="0.000029"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:25:15.948619" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:25:15.951032" level="INFO">${volatiles_list} = </msg>
<var>${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-04-17T03:25:15.946406" elapsed="0.004653"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:15.952577" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:25:15.952293" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:15.953204" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:15.952787" 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-04-17T03:25:15.958514" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<msg time="2026-04-17T03:25:16.159905" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<msg time="2026-04-17T03:25:16.562441" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<msg time="2026-04-17T03:25:16.566470" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:25:15.955474" elapsed="0.616832">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:15.953318" elapsed="0.619225">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:16.573247" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:16.572743" elapsed="0.000672"/>
</branch>
<status status="FAIL" start="2026-04-17T03:25:15.953299" elapsed="0.620174">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:16.574500" elapsed="0.000063"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:16.574859" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:16.574755" elapsed="0.000243"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:16.574705" elapsed="0.000348"/>
</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-04-17T03:25:16.575556" elapsed="0.000070"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:25:16.575774" elapsed="0.000026"/>
</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-04-17T03:25:15.951400" elapsed="0.624515">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:16.576012" 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-04-17T03:25:15.836964" elapsed="0.739147">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:16.576400" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:16.576207" elapsed="0.000266"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:16.576189" elapsed="0.000308"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:16.576530" elapsed="0.000014"/>
</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-04-17T03:25:15.828754" elapsed="0.747875">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:25:16.576745" level="FAIL">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:05.307381" elapsed="11.269468">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying for 10 seconds. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:16.578557" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:16.578150" elapsed="0.000470"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:16.578133" elapsed="0.000511"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:16.578804" elapsed="0.000393"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:25:16.584431" 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-04-17T03:25:16.583986" elapsed="0.000472"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-17T03:25:16.584673" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:16.584532" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:16.584513" elapsed="0.000222"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:25:16.585204" 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-04-17T03:25:16.584885" elapsed="0.000345"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:25:16.585659" 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-04-17T03:25:16.585394" elapsed="0.000290"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-17T03:25:16.586042" 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-04-17T03:25:16.585848" elapsed="0.000220"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:16.586570" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"bgpcep_userfeatures_txt_ibgp_peer_lsp_tc2_check_example_bgp_rib"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:16.586225" elapsed="0.000371"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:16.587081" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=bgpcep_userfeatures_txt_ibgp_peer_lsp_tc2_check_example_bgp_rib&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:16.586754" elapsed="0.000355"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-17T03:25:16.587734" 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: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-17T03:25:16.587268" elapsed="0.000520"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:16.588262" 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-04-17T03:25:16.587966" elapsed="0.000343"/>
</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-04-17T03:25:16.583660" elapsed="0.004704"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:16.577922" elapsed="0.010491"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-17T03:25:16.577479" elapsed="0.010974"/>
</kw>
<doc>Check RIB for linkstate-route(s) and check all of their attributes.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:25:05.237609" elapsed="11.350884">... 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: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:16.592028" elapsed="0.000211"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:25:16.591590" 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-04-17T03:25:16.593295" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:16.593187" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:16.593169" 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-04-17T03:25:16.598542" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:16.598436" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:16.598419" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:16.599644" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:25:16.599242" elapsed="0.000429"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:25:16.600151" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:25:16.599835" elapsed="0.000342"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:25:16.600221" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:25:16.600377" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:25:16.598841" elapsed="0.001561"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:25:16.605995" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:16.605873" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:16.605855" elapsed="0.000206"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:25:16.607252" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:16.607147" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:16.607130" elapsed="0.000204"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:25:16.607788" level="INFO">${karaf_connection_index} = 31</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:25:16.607485" elapsed="0.000330"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:16.608217" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:25:16.607997" elapsed="0.000246"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:25:16.609024" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:25:16.608747" elapsed="0.000905">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:25:16.609847" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:25:16.609893" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:16.608407" elapsed="0.001510"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:25:16.610695" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:25:16.610454" elapsed="0.000935">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:25:16.611574" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:25:16.611619" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:16.610110" elapsed="0.001532"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:25:16.612718" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC2_Disconnect_BGP_Peer"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:25:16.611961" elapsed="0.000819">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC2_Disconnect_BGP_Peer"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:16.611716" elapsed="0.001132">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC2_Disconnect_BGP_Peer"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:25:16.611698" elapsed="0.001183">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC2_Disconnect_BGP_Peer"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:16.613061" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:16.613290" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:16.613146" elapsed="0.000234"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:16.613130" elapsed="0.000275"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:25:16.613437" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:25:16.616001" elapsed="0.000145"/>
</kw>
<msg time="2026-04-17T03:25:16.616211" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:16.614889" elapsed="0.001451"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:16.616616" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:16.616979" 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-04-17T03:25:16.614273" elapsed="0.002891"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:25:16.613719" 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="FAIL" start="2026-04-17T03:25:16.606813" elapsed="0.010497">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC2_Disconnect_BGP_Peer"</status>
</kw>
<msg time="2026-04-17T03:25:16.617410" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:25:16.617454" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC2_Disconnect_BGP_Peer"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:16.606222" elapsed="0.011255"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:25:16.617657" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:16.617552" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:16.617534" elapsed="0.000188"/>
</if>
<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-04-17T03:25:16.618659" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:16.618545" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:16.618528" elapsed="0.000204"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:16.619045" level="INFO">index=15
host=10.30.171.238
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-04-17T03:25:16.619151" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
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-04-17T03:25:16.618888" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:16.619611" level="INFO">{1: 31}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:16.619348" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:16.620129" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:16.619808" elapsed="0.000365"/>
</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-04-17T03:25:16.620716" elapsed="0.000280"/>
</kw>
<msg time="2026-04-17T03:25:16.621095" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:25:16.621141" level="INFO">${old_connection_index} = 31</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:16.620333" elapsed="0.000831"/>
</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-04-17T03:25:16.622004" elapsed="0.000194"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:25:16.623316" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:25:16.622845" elapsed="0.001477">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:16.622367" elapsed="0.002053"/>
</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-04-17T03:25:16.625079" elapsed="0.000278"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:16.624595" elapsed="0.000844"/>
</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-04-17T03:25:16.621463" elapsed="0.004020"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:16.621238" elapsed="0.004293"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:16.621220" elapsed="0.004337"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:25:16.626517" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:25:16.626206" elapsed="0.000339"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:25:16.626594" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:25:16.626788" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:25:16.625778" elapsed="0.001039"/>
</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-04-17T03:25:16.627004" elapsed="0.000468"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:16.628026" level="INFO">index=32
host=10.30.170.120
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-04-17T03:25:16.628130" level="INFO">${karaf_connection_object} = index=32
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:25:16.627658" elapsed="0.000498"/>
</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-04-17T03:25:16.628312" elapsed="0.002268"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:25:16.631040" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:25:16.632272" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:25:16.630749" elapsed="0.001939">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:25:16.647209" elapsed="0.000441"/>
</kw>
<msg time="2026-04-17T03:25:16.647751" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:16.645472" elapsed="0.002439"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:16.648097" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:16.648264" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:25:16.633614" elapsed="0.014733"/>
</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-04-17T03:25:16.633054" elapsed="0.015340"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:25:16.618250" elapsed="0.030232">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:16.648875" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:25:16.648981" elapsed="0.000023"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:25:16.605531" elapsed="0.043569">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:25:16.649211" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:25:16.649255" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:16.600779" elapsed="0.048500"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:16.649632" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:16.649362" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:16.649342" elapsed="0.000374"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:25:16.600631" elapsed="0.049109"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:25:16.600456" elapsed="0.049317"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:25:16.598070" elapsed="0.051763"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:25:16.592883" elapsed="0.057006"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:16.592449" elapsed="0.057748"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:25:16.589259" elapsed="0.061054"/>
</kw>
<kw name="Stop_Console_Tool" owner="BGPcliKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:25:16.651521" 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-04-17T03:25:16.651172" elapsed="0.000376"/>
</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-04-17T03:25:16.651713" elapsed="0.000359"/>
</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-04-17T03:25:16.650875" elapsed="0.001257"/>
</kw>
<kw name="Read" owner="SSHLibrary">
<msg time="2026-04-17T03:25:18.653099" level="INFO">^C
[?2004h[jenkins@releng-26932-188-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-04-17T03:25:18.653521" level="INFO">${output} = ^C
[?2004h[jenkins@releng-26932-188-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-04-17T03:25:16.652295" elapsed="2.001317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:18.655374" level="INFO">^C
[?2004h[jenkins@releng-26932-188-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-04-17T03:25:18.654365" elapsed="0.001167"/>
</kw>
<doc>Stop the tool if still running.</doc>
<status status="PASS" start="2026-04-17T03:25:16.650549" elapsed="2.005185"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:25:18.671093" level="INFO">Executing command 'cat bgp_peer.log'.</msg>
<msg time="2026-04-17T03:25:18.684488" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:25:18.684714" level="INFO">${output_log} = 2026-04-17 03:24:55,282 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:24:55,282 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.238
2026-04-17 03:24:55,282 DEBUG BGP-Thr...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-17T03:25:18.670909" elapsed="0.013864"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:18.685816" level="INFO">2026-04-17 03:24:55,282 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:24:55,282 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.238
2026-04-17 03:24:55,282 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-04-17 03:24:55,282 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.120
2026-04-17 03:24:55,282 DEBUG BGP-Thread-1 (job): Remote port: 1790
Exception in thread Thread-1 (job):
Traceback (most recent call last):
  File "/usr/lib/python3.10/threading.py", line 1016, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.10/threading.py", line 953, in run
    self._target(*self._args, **self._kwargs)
  File "/home/jenkins/play.py", line 2406, in job
    bgp_socket = establish_connection(arguments)
  File "/home/jenkins/play.py", line 284, in establish_connection
    talking_socket.connect((str(arguments.peerip), arguments.peerport))
ConnectionRefusedError: [Errno 111] Connection refused
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-04-17T03:25:18.685209" elapsed="0.000766"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-04-17T03:25:18.687423" 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-04-17T03:25:18.686563" elapsed="0.000985"/>
</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-04-17T03:25:18.670433" elapsed="0.017256"/>
</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-04-17T03:25:18.692876" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:18.689752" elapsed="0.003241"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:18.689704" elapsed="0.003328"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:18.693275" elapsed="0.000610"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:25:18.701317" 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-04-17T03:25:18.700697" elapsed="0.000660"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-04-17T03:25:18.701670" elapsed="0.000048"/>
</return>
<status status="PASS" start="2026-04-17T03:25:18.701465" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:18.701438" elapsed="0.000358"/>
</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-04-17T03:25:18.702038" elapsed="0.000034"/>
</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-04-17T03:25:18.702383" elapsed="0.000037"/>
</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-04-17T03:25:18.702655" elapsed="0.000029"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:18.702854" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:18.703099" elapsed="0.000022"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:18.703290" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${msg}${newline}${bugs}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:18.703462" 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-04-17T03:25:18.700246" elapsed="0.003294"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:18.689249" elapsed="0.014340"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-17T03:25:18.688348" elapsed="0.015282"/>
</kw>
<doc>Stop BGP peer &amp; store logs</doc>
<tag>critical</tag>
<status status="PASS" start="2026-04-17T03:25:16.588770" elapsed="2.114902"/>
</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-04-17T03:25:18.707199" elapsed="0.000237"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:25:18.706911" 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-04-17T03:25:18.708526" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:18.708414" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:18.708394" 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-04-17T03:25:18.713841" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:18.713731" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:18.713712" elapsed="0.000198"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:18.715126" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:25:18.714658" elapsed="0.000497"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:25:18.715636" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:25:18.715324" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:25:18.715710" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:25:18.715874" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:25:18.714165" elapsed="0.001735"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:25:18.721971" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:18.721837" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:18.721817" elapsed="0.000226"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:25:18.723331" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:18.723209" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:18.723179" elapsed="0.000220"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:25:18.723903" level="INFO">${karaf_connection_index} = 32</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:25:18.723552" elapsed="0.000414"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:18.724365" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:25:18.724137" elapsed="0.000254"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:25:18.725230" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:25:18.724949" elapsed="0.000967">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:25:18.726124" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:25:18.726171" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:18.724560" elapsed="0.001634"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:25:18.727192" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:25:18.726806" elapsed="0.001431">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:25:18.728600" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:25:18.728668" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:18.726410" elapsed="0.002293"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:25:18.730217" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC2_Deconfigure_iBGP_Peer"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:25:18.729231" elapsed="0.001105">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC2_Deconfigure_iBGP_Peer"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:18.728822" elapsed="0.001626">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC2_Deconfigure_iBGP_Peer"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:25:18.728791" elapsed="0.001711">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC2_Deconfigure_iBGP_Peer"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:18.730793" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:18.731225" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:18.730960" elapsed="0.000351"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:18.730909" elapsed="0.000441"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:25:18.731408" 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-04-17T03:25:18.735817" elapsed="0.000214"/>
</kw>
<msg time="2026-04-17T03:25:18.736113" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:18.734509" elapsed="0.001758"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:18.736587" elapsed="0.000085"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:18.737031" 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-04-17T03:25:18.733217" elapsed="0.004020"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:25:18.731967" elapsed="0.005345"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:25:18.722864" elapsed="0.014553">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC2_Deconfigure_iBGP_Peer"</status>
</kw>
<msg time="2026-04-17T03:25:18.737543" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:25:18.737594" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Ibgp Peer Lsp.TC2_Deconfigure_iBGP_Peer"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:18.722209" elapsed="0.015413"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:25:18.737859" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:18.737721" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:18.737695" elapsed="0.000259"/>
</if>
<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-04-17T03:25:18.739286" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:18.739161" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:18.739137" elapsed="0.000224"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:18.739705" level="INFO">index=15
host=10.30.171.238
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-04-17T03:25:18.739827" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
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-04-17T03:25:18.739551" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:18.740398" level="INFO">{1: 32}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:18.740076" elapsed="0.000373"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:18.740918" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:18.740642" elapsed="0.000433"/>
</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-04-17T03:25:18.741739" elapsed="0.000323"/>
</kw>
<msg time="2026-04-17T03:25:18.742175" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:25:18.742226" level="INFO">${old_connection_index} = 32</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:18.741270" elapsed="0.000981"/>
</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-04-17T03:25:18.743352" elapsed="0.000219"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:25:18.744832" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:25:18.744358" elapsed="0.001592">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:18.743772" elapsed="0.002291"/>
</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-04-17T03:25:18.746822" elapsed="0.000331"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:18.746286" elapsed="0.000960"/>
</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-04-17T03:25:18.742736" elapsed="0.004564"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:18.742461" elapsed="0.004896"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:18.742438" elapsed="0.004953"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:25:18.748495" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:25:18.748132" elapsed="0.000394"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:25:18.748583" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:25:18.748774" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:25:18.747676" elapsed="0.001125"/>
</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-04-17T03:25:18.749022" elapsed="0.000513"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:18.749889" level="INFO">index=33
host=10.30.170.120
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-04-17T03:25:18.750022" level="INFO">${karaf_connection_object} = index=33
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:25:18.749746" elapsed="0.000306"/>
</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-04-17T03:25:18.750234" elapsed="0.003001"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:25:18.753770" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:25:18.754924" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:25:18.753455" elapsed="0.001994">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:25:18.771985" elapsed="0.000429"/>
</kw>
<msg time="2026-04-17T03:25:18.772525" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:18.770331" elapsed="0.002362"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:18.772865" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:18.773292" elapsed="0.000023"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:25:18.756563" elapsed="0.016819"/>
</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-04-17T03:25:18.755843" elapsed="0.017589"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:25:18.738498" elapsed="0.035027">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:18.773994" elapsed="0.000033"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:25:18.774085" 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="FAIL" start="2026-04-17T03:25:18.721482" elapsed="0.052740">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:25:18.774407" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:25:18.774460" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:18.716311" elapsed="0.058252"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:18.774998" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:18.774659" elapsed="0.000395"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:18.774637" elapsed="0.000450"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:25:18.716158" elapsed="0.058963"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:25:18.715974" elapsed="0.059188"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:25:18.713291" elapsed="0.061941"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:25:18.708103" elapsed="0.067198"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:18.707647" elapsed="0.067708"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:25:18.704618" elapsed="0.070802"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:25:18.776390" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | BGP_NAME=example-bgp-peer | IP=10.30.171.238 | 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-04-17T03:25:18.775644" elapsed="0.000783"/>
</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-04-17T03:25:18.825020" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:18.824526" elapsed="0.000530"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:18.825894" 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-04-17T03:25:18.825592" elapsed="0.000397">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-04-17T03:25:18.826090" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:18.825239" elapsed="0.000876"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:18.826722" 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-04-17T03:25:18.826320" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:25:18.827080" 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-04-17T03:25:18.827247" 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-04-17T03:25:18.826918" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:18.827734" 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-04-17T03:25:18.827474" 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-04-17T03:25:18.828898" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.238', '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-04-17T03:25:18.828591" elapsed="0.000390"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:25:18.829584" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:25:18.829208" elapsed="0.000411"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:25:18.830412" 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-04-17T03:25:18.830070" elapsed="0.000368"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:25:18.831601" 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-04-17T03:25:18.831294" elapsed="0.000342"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:25:18.831709" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:25:18.832021" 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-04-17T03:25:18.830636" 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-04-17T03:25:18.832248" elapsed="0.000248"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-04-17T03:25:18.829905" elapsed="0.002634"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:25:18.833124" 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-04-17T03:25:18.832796" elapsed="0.000357"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:25:18.834178" 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-04-17T03:25:18.833729" elapsed="0.000475"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:25:18.834277" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:25:18.834438" 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-04-17T03:25:18.833353" elapsed="0.001110"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:25:18.834620" elapsed="0.000231"/>
</kw>
<var name="${key}">BGP_NAME</var>
<var name="${value}">example-bgp-peer</var>
<status status="PASS" start="2026-04-17T03:25:18.832656" elapsed="0.002236"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:25:18.835515" level="INFO">${value} = 10.30.171.238</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:25:18.835160" elapsed="0.000386"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:25:18.836453" level="INFO">${encoded} = 10.30.171.238</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:25:18.836228" elapsed="0.000251"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:25:18.836530" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:25:18.836685" level="INFO">${encoded_value} = 10.30.171.238</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:25:18.835795" 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-04-17T03:25:18.837061" elapsed="0.000244"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.238</var>
<status status="PASS" start="2026-04-17T03:25:18.835023" elapsed="0.002325"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:25:18.837905" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:25:18.837600" elapsed="0.000349"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:25:18.838853" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:25:18.838588" elapsed="0.000292"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:25:18.838947" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:25:18.839107" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:25:18.838152" 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-04-17T03:25:18.839287" elapsed="0.000227"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:25:18.837462" elapsed="0.002093"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:25:18.829688" elapsed="0.009902"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:25:18.839644" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:25:18.839822" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.238', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:25:18.828233" elapsed="0.011615"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:18.827863" elapsed="0.012019"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:18.840084" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:18.839911" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:18.827838" elapsed="0.012323"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:25:18.840980" 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-04-17T03:25:18.840310" elapsed="0.000701"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:25:18.841059" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:25:18.823659" elapsed="0.017528"/>
</kw>
<msg time="2026-04-17T03:25:18.841298" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:18.809103" elapsed="0.032255"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:25:18.856006" 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/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-04-17T03:25:18.869586" elapsed="0.000042"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:25:18.882638" elapsed="0.000032"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:18.882901" elapsed="0.000042"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:18.883118" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:18.883671" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:18.883450" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:18.883425" elapsed="0.000359"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:18.883997" 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-04-17T03:25:18.884178" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:18.884348" elapsed="0.000025"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:25:18.883369" elapsed="0.001050"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:25:18.883208" elapsed="0.001249"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:18.884672" elapsed="0.000029"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:18.884784" elapsed="0.000024"/>
</return>
<msg time="2026-04-17T03:25:18.885012" 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-04-17T03:25:18.804351" elapsed="0.080697"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:18.886511" 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.238</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:18.886154" elapsed="0.000413"/>
</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-04-17T03:25:18.892057" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:25:19.093599" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:25:19.496455" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:25:19.509317" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:18.888881" elapsed="0.625107">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:18.886634" elapsed="0.627583">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:19.514779" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:19.514314" elapsed="0.000678"/>
</branch>
<status status="FAIL" start="2026-04-17T03:25:18.886616" elapsed="0.628440">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:25:19.516104" elapsed="0.000063"/>
</kw>
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:19.516289" elapsed="0.000042"/>
</return>
<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-04-17T03:25:18.885389" elapsed="0.631167">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:19.516714" elapsed="0.000036"/>
</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="FAIL" start="2026-04-17T03:25:18.776732" elapsed="0.740239">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:19.519630" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:19.518967" elapsed="0.000761"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:19.518947" elapsed="0.000835"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>'${SetupUtils__Known_Bug_ID}' != ''</arg>
<arg>Set_Known_Bug_Id</arg>
<arg>${EMPTY}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:19.519998" elapsed="0.000410"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:25:19.525702" 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-04-17T03:25:19.525260" elapsed="0.000470"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-17T03:25:19.526040" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:19.525805" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:19.525786" elapsed="0.000322"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:25:19.526649" 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-04-17T03:25:19.526264" elapsed="0.000414"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:25:19.527143" level="INFO">${reference} = bgpcep_userfeatures_txt_Ibgp_Peer_Lsp_TC2_Deconfigure_iBGP_Peer</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-04-17T03:25:19.526848" elapsed="0.000323"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-17T03:25:19.527518" level="INFO">${reference} = bgpcep_userfeatures_txt_ibgp_peer_lsp_tc2_deconfigure_ibgp_peer</msg>
<var>${reference}</var>
<arg>${reference}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-17T03:25:19.527337" elapsed="0.000206"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:19.528131" 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_deconfigure_ibgp_peer"
reference somewhere inside)</msg>
<var>${msg}</var>
<arg>... click for list of related bugs or create a new one if needed (with the${newline}"${reference}"${newline}reference somewhere inside)</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:19.527722" elapsed="0.000437"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:19.528677" 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_deconfigure_ibgp_peer&amp;order=bug_status"</msg>
<var>${bugs}</var>
<arg>"https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=${reference}&amp;order=bug_status"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:19.528322" elapsed="0.000388"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-17T03:25:19.529453" 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_deconfigure_ibgp_peer"
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_deconfigure_ibgp_peer&amp;order=bug_status"

ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-17T03:25:19.528906" elapsed="0.000613"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:19.530132" level="INFO">... click for list of related bugs or create a new one if needed (with the
"bgpcep_userfeatures_txt_ibgp_peer_lsp_tc2_deconfigure_ibgp_peer"
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_deconfigure_ibgp_peer&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-04-17T03:25:19.529712" elapsed="0.000480"/>
</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-04-17T03:25:19.524942" elapsed="0.005309"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:19.518732" elapsed="0.011570"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-17T03:25:19.517731" elapsed="0.012613"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="FAIL" start="2026-04-17T03:25:18.704021" elapsed="0.826370">... click for list of related bugs or create a new one if needed (with the
"bgpcep_userfeatures_txt_ibgp_peer_lsp_tc2_deconfigure_ibgp_peer"
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_deconfigure_ibgp_peer&amp;order=bug_status"

ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:25:19.532341" level="INFO">Executing command 'ps -elf | egrep python | egrep 'play.py' | egrep -v grep'.</msg>
<msg time="2026-04-17T03:25:19.555455" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-17T03:25:19.555657" 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-04-17T03:25:19.532189" elapsed="0.023505"/>
</kw>
<return>
<value>${processes}</value>
<status status="PASS" start="2026-04-17T03:25:19.555786" elapsed="0.000246"/>
</return>
<msg time="2026-04-17T03:25:19.556236" 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-04-17T03:25:19.531869" elapsed="0.024403"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:19.557139" level="INFO"/>
<arg>${processes}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:19.556537" elapsed="0.000667"/>
</kw>
<kw name="Kill_Remote_Processes" owner="KillPythonTool">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-17T03:25:19.558519" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:25:19.558630" 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-04-17T03:25:19.558105" elapsed="0.000558"/>
</kw>
<if>
<branch type="IF" condition="${arg_length} == 0">
<return>
<status status="PASS" start="2026-04-17T03:25:19.559076" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-17T03:25:19.558867" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:19.558832" elapsed="0.000360"/>
</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-04-17T03:25:19.559415" elapsed="0.000031"/>
</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-04-17T03:25:19.559660" elapsed="0.000029"/>
</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-04-17T03:25:19.559903" elapsed="0.000048"/>
</kw>
<arg>${processes}</arg>
<doc>Kill processes by PIDs from given list (no-op if the list is empty), using specified signal. Log the kill commands used.</doc>
<status status="PASS" start="2026-04-17T03:25:19.557591" elapsed="0.002455"/>
</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-04-17T03:25:19.531549" elapsed="0.028570"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-17T03:25:19.560435" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-17T03:25:19.560328" elapsed="0.000218"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-04-17T03:25:19.560758" elapsed="0.000428"/>
</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-04-17T03:25:19.531246" elapsed="0.030021"/>
</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-04-17T03:24:29.479590" elapsed="50.081725"/>
</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-04-17T03:25:19.658156" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:25:19.653558" elapsed="0.004654"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-17T03:25:19.653305" elapsed="0.004979"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-17T03:25:19.663304" 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-04-17T03:25:19.659401" elapsed="0.003932"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-17T03:25:19.663546" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:19.663420" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:19.663396" elapsed="0.000217"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:19.664152" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:25:19.663774" elapsed="0.000421"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-17T03:25:19.664686" 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-04-17T03:25:19.664360" elapsed="0.000352"/>
</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-04-17T03:25:19.665250" elapsed="0.000285"/>
</kw>
<msg time="2026-04-17T03:25:19.665632" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:25:19.665680" level="INFO">${possibly_int_of_members} = 1</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:19.664882" elapsed="0.000821"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:19.666298" 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-04-17T03:25:19.665904" elapsed="0.000420"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:25:19.667328" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:25:19.667064" elapsed="0.000290"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:25:19.667758" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:25:19.667505" elapsed="0.000279"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:25:19.668253" 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-04-17T03:25:19.667958" elapsed="0.000321"/>
</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-04-17T03:25:19.671593" elapsed="0.000213"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:19.672310" level="INFO">${member_ip} = 10.30.170.120</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:19.671983" elapsed="0.000353"/>
</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-04-17T03:25:19.672524" elapsed="0.000229"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:19.673645" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:19.673349" elapsed="0.000323"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-17T03:25:19.673720" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:25:19.673883" 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-04-17T03:25:19.673050" elapsed="0.000859"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:25:19.674523" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.120:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a44175cb450&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-04-17T03:25:19.674088" elapsed="0.000576"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-17T03:25:19.674860" elapsed="0.000215"/>
</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-04-17T03:25:19.671021" elapsed="0.004113"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:25:19.670808" elapsed="0.004369"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-04-17T03:25:19.668336" elapsed="0.006873"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:19.675787" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:25:19.675374" elapsed="0.000457"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:19.676468" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.120'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:25:19.676011" elapsed="0.000501"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:19.677089" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:25:19.676677" elapsed="0.000455"/>
</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-04-17T03:25:19.666590" elapsed="0.010599"/>
</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-04-17T03:25:19.659051" elapsed="0.018191"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:25:19.677426" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:19.677309" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:19.677290" elapsed="0.000203"/>
</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-04-17T03:25:19.680670" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:25:19.680284" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:25:19.681180" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:25:19.680860" elapsed="0.000346"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:25:19.681250" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:25:19.681406" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:25:19.679914" elapsed="0.001517"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:25:19.682445" level="INFO">${member_ip} = 10.30.170.120</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-04-17T03:25:19.682176" elapsed="0.000296"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:19.683248" 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-04-17T03:25:19.683349" 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-04-17T03:25:19.683086" elapsed="0.000288"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:19.688207" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:19.687559" elapsed="0.000801"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:19.687536" elapsed="0.000864"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:19.689100" 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-04-17T03:25:19.689341" 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-04-17T03:25:19.688611" elapsed="0.000781"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:19.690352" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.120" 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-04-17T03:25:19.689660" elapsed="0.000798"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:19.691648" 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-04-17T03:25:19.690734" elapsed="0.000965"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-17T03:25:19.693481" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:25:19.693660" 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-04-17T03:25:19.693116" elapsed="0.000588"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:19.694065" elapsed="0.000464"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:25:19.695674" level="INFO">Logging into '10.30.170.120:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:25:20.161847" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 17 03:24:29 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:24:34 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:25:19.695352" elapsed="0.466699"/>
</kw>
<msg time="2026-04-17T03:25:20.162151" 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-04-17T03:25:19.694882" elapsed="0.467466"/>
</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-04-17T03:25:19.692207" elapsed="0.470337"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:25:20.163498" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-17T03:25:20.177382" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-17T03:25:20.178070" level="INFO">${stdout} = </msg>
<msg time="2026-04-17T03:25:20.178380" 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-04-17T03:25:20.162982" elapsed="0.015636"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:25:20.179590" elapsed="0.001514"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:20.184377" 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-04-17T03:25:20.182880" elapsed="0.001761"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-17T03:25:20.185822" elapsed="0.000239"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:20.185094" elapsed="0.001164"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:20.185019" elapsed="0.001333"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:25:20.187035" elapsed="0.000093"/>
</return>
<status status="PASS" start="2026-04-17T03:25:20.186549" elapsed="0.000665"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:20.186507" elapsed="0.000747"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-17T03:25:20.187319" elapsed="0.000016"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:20.191622" 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-04-17T03:25:20.192697" elapsed="0.000405"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:25:20.193590" elapsed="0.000362"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:25:20.187899" elapsed="0.006161"/>
</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-04-17T03:25:19.686601" elapsed="0.507705"/>
</kw>
<msg time="2026-04-17T03:25:20.194392" 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-04-17T03:25:19.685961" elapsed="0.508518"/>
</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-04-17T03:25:19.684065" elapsed="0.510531"/>
</kw>
<msg time="2026-04-17T03:25:20.194655" 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-04-17T03:25:19.683533" elapsed="0.511188"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:20.198591" elapsed="0.000488"/>
</kw>
<kw name="Open 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-04-17T03:25:20.199321" elapsed="0.000217"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:25:20.199755" elapsed="0.000139"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:25:20.195270" elapsed="0.004729"/>
</kw>
<msg time="2026-04-17T03:25:20.200130" 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-04-17T03:25:19.682695" elapsed="0.517471"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:20.200817" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:20.200464" elapsed="0.000411"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-17T03:25:20.201203" 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-04-17T03:25:19.681791" elapsed="0.519600"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:25:19.681609" elapsed="0.519834"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:25:19.681482" elapsed="0.520015"/>
</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-04-17T03:25:19.677718" elapsed="0.523864"/>
</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-04-17T03:25:20.201896" elapsed="0.000466"/>
</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-04-17T03:25:20.219540" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:20.219387" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:20.219360" elapsed="0.000266"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:20.220067" 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-04-17T03:25:20.220190" 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-04-17T03:25:20.219850" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:20.220707" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:20.220384" elapsed="0.000370"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:20.221193" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:20.220920" elapsed="0.000319"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:25:20.222153" 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-04-17T03:25:20.221888" elapsed="0.000379">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-17T03:25:20.222378" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:25:20.222424" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:20.221410" elapsed="0.001037"/>
</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-04-17T03:25:20.222755" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:20.222522" elapsed="0.000641"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:20.222504" elapsed="0.000688"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:25:20.224017" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:25:20.223717" elapsed="0.000327"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:25:20.224093" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:25:20.224253" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:25:20.223432" elapsed="0.000845"/>
</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-04-17T03:25:20.224441" elapsed="0.000450"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:20.225200" level="INFO">index=4
host=10.30.170.120
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-04-17T03:25:20.225302" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.120
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-04-17T03:25:20.225090" elapsed="0.000239"/>
</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-04-17T03:25:20.225551" elapsed="0.002998"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:25:20.229121" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:25:20.230180" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:25:20.228798" elapsed="0.001922">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:20.234336" elapsed="0.000508"/>
</kw>
<kw name="Open 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-04-17T03:25:20.235099" elapsed="0.000204"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:25:20.235462" elapsed="0.000105"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:25:20.231825" elapsed="0.003796"/>
</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-04-17T03:25:20.231106" elapsed="0.004562"/>
</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="FAIL" start="2026-04-17T03:25:20.218980" elapsed="0.016782">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:25:21.255637" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:21.255460" elapsed="0.000259"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:21.255431" elapsed="0.000318"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:21.256206" 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-04-17T03:25:21.256342" 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-04-17T03:25:21.256015" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:21.256913" 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-04-17T03:25:21.256581" elapsed="0.000398"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:21.257395" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:21.257141" elapsed="0.000299"/>
</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-04-17T03:25:21.258095" elapsed="0.000200"/>
</kw>
<msg time="2026-04-17T03:25:21.258399" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:25:21.258447" level="INFO">${old_connection_index} = 4</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:21.257636" elapsed="0.000835"/>
</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-04-17T03:25:21.259385" elapsed="0.000172"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:25:21.260417" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:25:21.260229" elapsed="0.000803">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:21.259849" elapsed="0.001251"/>
</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-04-17T03:25:21.261792" elapsed="0.000117"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:21.261332" elapsed="0.000649"/>
</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-04-17T03:25:21.258823" elapsed="0.003204"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:21.258553" elapsed="0.003524"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:21.258533" elapsed="0.003577"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:25:21.262998" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:25:21.262686" elapsed="0.000355"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:25:21.263114" elapsed="0.000051"/>
</return>
<msg time="2026-04-17T03:25:21.263327" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:25:21.262363" elapsed="0.000995"/>
</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-04-17T03:25:21.263532" elapsed="0.000480"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:21.264321" level="INFO">index=6
host=10.30.170.120
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-04-17T03:25:21.264428" level="INFO">${karaf_connection_object} = index=6
host=10.30.170.120
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-04-17T03:25:21.264195" elapsed="0.000259"/>
</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-04-17T03:25:21.264613" elapsed="0.002938"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:25:21.268206" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:25:21.269538" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:25:21.267829" elapsed="0.002231">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:21.273801" elapsed="0.000447"/>
</kw>
<kw name="Open 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-04-17T03:25:21.274441" elapsed="0.000208"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:25:21.274810" elapsed="0.000108"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:25:21.271254" elapsed="0.003757"/>
</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-04-17T03:25:21.270482" elapsed="0.004579"/>
</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="FAIL" start="2026-04-17T03:25:21.254974" elapsed="0.020190">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:25:22.295224" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:22.294990" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:22.294947" elapsed="0.000411"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:22.295970" 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-04-17T03:25:22.296149" 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-04-17T03:25:22.295681" elapsed="0.000508"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:22.296894" level="INFO">{1: 6}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:22.296439" elapsed="0.000547"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:22.297607" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:22.297226" elapsed="0.000563"/>
</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-04-17T03:25:22.298715" elapsed="0.000344"/>
</kw>
<msg time="2026-04-17T03:25:22.299220" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:25:22.299291" level="INFO">${old_connection_index} = 6</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:22.298071" elapsed="0.001282"/>
</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-04-17T03:25:22.300848" elapsed="0.000305"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:25:22.302605" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:25:22.302259" elapsed="0.001215">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:22.301517" elapsed="0.002061"/>
</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-04-17T03:25:22.304492" elapsed="0.000196"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:22.303868" elapsed="0.000916"/>
</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-04-17T03:25:22.299973" elapsed="0.004922"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:22.299511" elapsed="0.005541"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:22.299470" elapsed="0.005650"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:25:22.306586" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:25:22.306137" elapsed="0.000489"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:25:22.306728" elapsed="0.000065"/>
</return>
<msg time="2026-04-17T03:25:22.307057" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:25:22.305584" elapsed="0.001512"/>
</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-04-17T03:25:22.307332" elapsed="0.000616"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:22.308279" level="INFO">index=8
host=10.30.170.120
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-04-17T03:25:22.308428" level="INFO">${karaf_connection_object} = index=8
host=10.30.170.120
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-04-17T03:25:22.308147" elapsed="0.000319"/>
</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-04-17T03:25:22.308651" elapsed="0.002866"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:25:22.312032" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:25:22.313292" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:25:22.311707" elapsed="0.002089">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:22.317645" elapsed="0.000547"/>
</kw>
<kw name="Open 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-04-17T03:25:22.318385" elapsed="0.000195"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:25:22.318742" elapsed="0.000169"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:25:22.315072" elapsed="0.003937"/>
</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-04-17T03:25:22.314269" elapsed="0.004789"/>
</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="FAIL" start="2026-04-17T03:25:22.294335" elapsed="0.024828">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:25:23.341000" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:23.340833" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:23.340803" elapsed="0.000390"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:23.341695" 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-04-17T03:25:23.341870" 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-04-17T03:25:23.341449" elapsed="0.000461"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:23.342500" level="INFO">{1: 8}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:23.342117" elapsed="0.000446"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:23.343006" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:23.342730" elapsed="0.000323"/>
</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-04-17T03:25:23.343755" elapsed="0.000241"/>
</kw>
<msg time="2026-04-17T03:25:23.344105" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:25:23.344153" level="INFO">${old_connection_index} = 8</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:23.343270" elapsed="0.000906"/>
</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-04-17T03:25:23.345041" elapsed="0.000149"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:25:23.346106" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:25:23.345893" elapsed="0.000742">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:23.345416" elapsed="0.001284"/>
</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-04-17T03:25:23.347359" elapsed="0.000135"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:23.346880" elapsed="0.000677"/>
</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-04-17T03:25:23.344487" elapsed="0.003135"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:23.344253" elapsed="0.003439"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:23.344233" elapsed="0.003496"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:25:23.348745" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:25:23.348423" elapsed="0.000356"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:25:23.348844" elapsed="0.000047"/>
</return>
<msg time="2026-04-17T03:25:23.349081" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:25:23.348046" elapsed="0.001070"/>
</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-04-17T03:25:23.349309" elapsed="0.000476"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:23.350115" level="INFO">index=10
host=10.30.170.120
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-04-17T03:25:23.350252" level="INFO">${karaf_connection_object} = index=10
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:25:23.350002" 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-04-17T03:25:23.350492" elapsed="0.003195"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:25:23.354256" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:25:23.355842" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:25:23.353910" elapsed="0.002634">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:23.361532" elapsed="0.000571"/>
</kw>
<kw name="Open 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-04-17T03:25:23.362346" elapsed="0.000235"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:25:23.362800" elapsed="0.000198"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:25:23.358068" elapsed="0.005023"/>
</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-04-17T03:25:23.357094" elapsed="0.006144"/>
</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="FAIL" start="2026-04-17T03:25:23.340300" elapsed="0.023062">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:25:23.363500" level="FAIL">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<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="FAIL" start="2026-04-17T03:25:20.203413" elapsed="3.160223">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:20.202850" elapsed="3.160880"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:25:20.202647" elapsed="3.161143"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-04-17T03:25:20.202441" elapsed="3.161400"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-17T03:25:19.658588" elapsed="3.705337"/>
</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-04-17T03:25:23.367365" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:23.367244" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:23.367220" elapsed="0.000223"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:25:23.372421" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:23.372311" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:23.372293" elapsed="0.000197"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:23.373516" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:25:23.373105" elapsed="0.000456"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:25:23.374102" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:25:23.373766" elapsed="0.000362"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:25:23.374173" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:25:23.374334" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:25:23.372732" elapsed="0.001627"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:25:23.380300" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:23.380029" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:23.380011" elapsed="0.000357"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:25:23.381692" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:23.381546" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:23.381525" elapsed="0.000247"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:25:23.382311" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:25:23.381974" elapsed="0.000364"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:23.382728" 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-04-17T03:25:23.382501" elapsed="0.000253"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:25:23.383878" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:25:23.383429" elapsed="0.001237">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:25:23.384814" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:25:23.384860" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:23.382915" elapsed="0.001969"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:25:23.386113" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:25:23.385682" elapsed="0.001280">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:25:23.387172" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:25:23.387219" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:23.385073" elapsed="0.002169"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:25:23.388269" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/010_bgp_functional_l3vpn.robot"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:25:23.387577" elapsed="0.000775">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/010_bgp_functional_l3vpn.robot"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:23.387320" elapsed="0.001176">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/010_bgp_functional_l3vpn.robot"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:25:23.387301" elapsed="0.001232">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/010_bgp_functional_l3vpn.robot"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:23.388705" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:23.388955" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:23.388793" elapsed="0.000314"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:23.388776" elapsed="0.000358"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:25:23.389168" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:23.391287" elapsed="0.000486"/>
</kw>
<kw name="Open 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-04-17T03:25:23.392148" elapsed="0.000308"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:25:23.392792" elapsed="0.000258"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:25:23.390411" elapsed="0.002737"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:25:23.389498" elapsed="0.003783"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:25:23.381238" elapsed="0.012149">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/010_bgp_functional_l3vpn.robot"</status>
</kw>
<msg time="2026-04-17T03:25:23.393497" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:25:23.393541" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/010_bgp_functional_l3vpn.robot"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:23.380528" elapsed="0.013037"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:25:23.393747" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:23.393640" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:23.393622" elapsed="0.000189"/>
</if>
<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-04-17T03:25:23.394580" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:23.394474" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:23.394457" elapsed="0.000189"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:23.395209" 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-04-17T03:25:23.395320" 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-04-17T03:25:23.394809" elapsed="0.000537"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:23.395768" level="INFO">{1: 10}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:23.395504" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:23.396231" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:23.395985" elapsed="0.000289"/>
</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-04-17T03:25:23.396815" elapsed="0.000299"/>
</kw>
<msg time="2026-04-17T03:25:23.397212" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:25:23.397258" level="INFO">${old_connection_index} = 10</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:23.396436" elapsed="0.000844"/>
</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-04-17T03:25:23.398513" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:25:23.400201" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:25:23.399936" elapsed="0.000733">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:23.399130" elapsed="0.001629"/>
</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-04-17T03:25:23.401798" elapsed="0.000257"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:23.401025" elapsed="0.001115"/>
</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-04-17T03:25:23.397637" elapsed="0.004587"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:23.397372" elapsed="0.004903"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:23.397354" elapsed="0.004946"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:25:23.403353" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:25:23.402808" elapsed="0.000575"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:25:23.403433" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:25:23.403590" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:25:23.402523" elapsed="0.001092"/>
</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-04-17T03:25:23.403773" elapsed="0.000424"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:23.404484" level="INFO">index=13
host=10.30.170.120
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-04-17T03:25:23.404583" level="INFO">${karaf_connection_object} = index=13
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:25:23.404374" elapsed="0.000235"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:25:23.404762" elapsed="0.002399"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:25:23.407592" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:25:23.408819" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:25:23.407330" elapsed="0.001893">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:23.412823" elapsed="0.000715"/>
</kw>
<kw name="Open 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-04-17T03:25:23.413792" elapsed="0.000461"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:25:23.414470" elapsed="0.000181"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:25:23.410154" elapsed="0.004580"/>
</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-04-17T03:25:23.409571" elapsed="0.005210"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:25:23.394232" elapsed="0.020632">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:23.415249" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:25:23.415326" 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="FAIL" start="2026-04-17T03:25:23.379716" elapsed="0.035717">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:25:23.415542" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:25:23.415587" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:23.374744" elapsed="0.040866"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:23.416042" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:23.415732" elapsed="0.000369"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:23.415712" elapsed="0.000414"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:25:23.374594" elapsed="0.041555"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:25:23.374413" elapsed="0.041769"/>
</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-04-17T03:25:23.372009" elapsed="0.044232"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-17T03:25:23.364817" elapsed="0.051487"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:23.364178" elapsed="0.052171"/>
</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-04-17T03:25:19.652985" elapsed="3.763419"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:23.416913" level="INFO">${tools_system_conn_id} = 15</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-04-17T03:25:23.416563" elapsed="0.000401"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:23.417531" level="INFO">${tools_system_conn_id} = 15</msg>
<arg>${tools_system_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:25:23.417163" elapsed="0.000411"/>
</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-04-17T03:25:23.419329" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:25:23.419430" 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-04-17T03:25:23.419027" elapsed="0.000433"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:23.419626" elapsed="0.000366"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:25:23.420855" level="INFO">Logging into '10.30.171.238:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:25:23.744733" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 17 03:24:33 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:24:34 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:25:23.420540" elapsed="0.324470"/>
</kw>
<msg time="2026-04-17T03:25:23.745123" 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-04-17T03:25:23.420178" elapsed="0.325058"/>
</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-04-17T03:25:23.418567" elapsed="0.326817"/>
</kw>
<msg time="2026-04-17T03:25:23.745441" 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-04-17T03:25:23.418172" elapsed="0.327318"/>
</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-04-17T03:25:23.417779" elapsed="0.327794"/>
</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-04-17T03:25:23.752851" level="INFO">${cd_and_command} = cd '.' &amp;&amp; virtualenv /tmp/defaultvenv</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:23.752471" elapsed="0.000412"/>
</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-04-17T03:25:23.754564" level="INFO">Executing command 'cd '.' &amp;&amp; virtualenv /tmp/defaultvenv'.</msg>
<msg time="2026-04-17T03:25:24.098592" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:25:24.099264" level="INFO">${stdout} = created virtual environment CPython3.10.12.final.0-64 in 190ms
  creator CPython3Posix(dest=/tmp/defaultvenv, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=b...</msg>
<msg time="2026-04-17T03:25:24.099381" level="INFO">${stderr} = </msg>
<msg time="2026-04-17T03:25:24.099477" 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-04-17T03:25:23.754314" elapsed="0.345218"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:25:24.102464" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-04-17T03:25:24.101342" elapsed="0.001236"/>
</kw>
<msg time="2026-04-17T03:25:24.102798" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-04-17T03:25:24.102923" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:24.100253" elapsed="0.002760"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:24.104754" 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-04-17T03:25:24.103416" elapsed="0.001406"/>
</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-04-17T03:25:24.106898" level="INFO">created virtual environment CPython3.10.12.final.0-64 in 190ms
  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-04-17T03:25:24.106485" elapsed="0.000516"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:24.107647" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:24.107243" elapsed="0.000469"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:24.108559" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:24.108071" elapsed="0.000583"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-04-17T03:25:24.105741" elapsed="0.003030"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:24.105024" elapsed="0.003823"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:24.104974" elapsed="0.003932"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-04-17T03:25:24.109256" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:24.109049" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:24.109015" elapsed="0.000380"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:25:24.109660" elapsed="0.000056"/>
</return>
<status status="PASS" start="2026-04-17T03:25:24.109491" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:24.109462" elapsed="0.000348"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:24.110080" elapsed="0.000036"/>
</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-04-17T03:25:23.753690" elapsed="0.356578"/>
</kw>
<msg time="2026-04-17T03:25:24.110358" 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-04-17T03:25:23.753086" elapsed="0.357355"/>
</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-04-17T03:25:23.751783" elapsed="0.358832"/>
</kw>
<msg time="2026-04-17T03:25:24.110703" 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-04-17T03:25:23.747038" elapsed="0.363735"/>
</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-04-17T03:25:23.746566" elapsed="0.364415"/>
</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-04-17T03:25:24.120405" level="INFO">${cd_and_command} = cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install --upgrade pip; deactivate</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:24.120051" elapsed="0.000385"/>
</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-04-17T03:25:24.122508" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install --upgrade pip; deactivate'.</msg>
<msg time="2026-04-17T03:25:26.207657" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:25:26.208463" level="INFO">${stdout} = Requirement already satisfied: pip in /tmp/defaultvenv/lib/python3.10/site-packages (22.0.2)
Collecting pip
  Using cached pip-26.0.1-py3-none-any.whl (1.8 MB)
Installing collected packages: pip
  Att...</msg>
<msg time="2026-04-17T03:25:26.208583" level="INFO">${stderr} = </msg>
<msg time="2026-04-17T03:25:26.208693" 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-04-17T03:25:24.122096" elapsed="2.086658"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:25:26.215525" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-04-17T03:25:26.214534" elapsed="0.001164"/>
</kw>
<msg time="2026-04-17T03:25:26.215999" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-04-17T03:25:26.216127" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:26.209995" elapsed="0.006188"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:26.218568" 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-04-17T03:25:26.216656" elapsed="0.001974"/>
</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-04-17T03:25:26.222915" level="INFO">Requirement already satisfied: pip in /tmp/defaultvenv/lib/python3.10/site-packages (22.0.2)
Collecting pip
  Using cached pip-26.0.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.0.1</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:26.222342" elapsed="0.000939"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:26.224367" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:26.223811" elapsed="0.000690"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:26.225577" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:26.225050" elapsed="0.000665"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-04-17T03:25:26.220723" elapsed="0.005126"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:26.218922" elapsed="0.007335"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:26.218870" elapsed="0.007447"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-04-17T03:25:26.226765" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:26.226436" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:26.226402" elapsed="0.000621"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:25:26.227305" elapsed="0.000062"/>
</return>
<status status="PASS" start="2026-04-17T03:25:26.227094" elapsed="0.000420"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:26.227074" elapsed="0.000481"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:26.227735" elapsed="0.000027"/>
</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-04-17T03:25:24.121373" elapsed="2.106589"/>
</kw>
<msg time="2026-04-17T03:25:26.228029" 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-04-17T03:25:24.120606" elapsed="2.107490"/>
</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-04-17T03:25:24.119349" elapsed="2.108838"/>
</kw>
<msg time="2026-04-17T03:25:26.228245" 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-04-17T03:25:24.114083" elapsed="2.114209"/>
</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-04-17T03:25:24.113179" elapsed="2.115195"/>
</kw>
<msg time="2026-04-17T03:25:26.228425" 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-04-17T03:25:24.112551" elapsed="2.115920"/>
</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-04-17T03:25:24.112017" elapsed="2.116534"/>
</kw>
<msg time="2026-04-17T03:25:26.228594" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${upgrade_pip}</arg>
<arg>Virtual_Env_Run_Cmd_At_Cwd</arg>
<arg>pip install --upgrade pip</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:24.111244" elapsed="2.117395"/>
</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-04-17T03:25:23.746074" elapsed="2.482643"/>
</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-04-17T03:25:26.237011" level="INFO">${cd_and_command} = cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install setuptools==44.0.0; deactivate</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:26.236603" elapsed="0.000439"/>
</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-04-17T03:25:26.239612" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install setuptools==44.0.0; deactivate'.</msg>
<msg time="2026-04-17T03:25:27.097112" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:25:27.097844" 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-04-17T03:25:27.097994" level="INFO">${stderr} = </msg>
<msg time="2026-04-17T03:25:27.098094" 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-04-17T03:25:26.239148" elapsed="0.859002"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:25:27.103059" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-04-17T03:25:27.102147" elapsed="0.001084"/>
</kw>
<msg time="2026-04-17T03:25:27.103456" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-04-17T03:25:27.103522" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:27.098994" elapsed="0.004562"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:27.105267" 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-04-17T03:25:27.103900" elapsed="0.001406"/>
</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-04-17T03:25:27.108813" 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-04-17T03:25:27.108316" elapsed="0.000604"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:27.110062" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:27.109609" elapsed="0.000694"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:27.110926" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:27.110606" elapsed="0.000513"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-04-17T03:25:27.106836" elapsed="0.004360"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:27.105537" elapsed="0.005754"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:27.105490" elapsed="0.005834"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-04-17T03:25:27.111540" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:27.111385" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:27.111368" elapsed="0.000297"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:25:27.111848" elapsed="0.000046"/>
</return>
<status status="PASS" start="2026-04-17T03:25:27.111717" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:27.111702" elapsed="0.000318"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:27.112178" elapsed="0.000022"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-04-17T03:25:26.238357" elapsed="0.873966"/>
</kw>
<msg time="2026-04-17T03:25:27.112385" 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-04-17T03:25:26.237214" elapsed="0.875254"/>
</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-04-17T03:25:26.235962" elapsed="0.876616"/>
</kw>
<msg time="2026-04-17T03:25:27.112636" 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-04-17T03:25:26.231328" elapsed="0.881354"/>
</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-04-17T03:25:26.230725" elapsed="0.882050"/>
</kw>
<msg time="2026-04-17T03:25:27.112942" 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-04-17T03:25:26.230323" elapsed="0.882667"/>
</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-04-17T03:25:26.229678" elapsed="0.883406"/>
</kw>
<msg time="2026-04-17T03:25:27.113157" 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-04-17T03:25:26.229262" elapsed="0.883939"/>
</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-04-17T03:25:26.228954" elapsed="0.884331"/>
</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-04-17T03:25:27.123490" level="INFO">${cd_and_command} = cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install exabgp==3.4.16; deactivate</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:27.123093" elapsed="0.000430"/>
</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-04-17T03:25:27.125615" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install exabgp==3.4.16; deactivate'.</msg>
<msg time="2026-04-17T03:25:28.745112" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:25:28.745893" 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-04-17T03:25:28.746066" 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-04-17T03:25:28.746180" 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-04-17T03:25:27.125182" elapsed="1.621053"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:25:28.750893" level="INFO">Length is 1821.</msg>
<msg time="2026-04-17T03:25:28.751623" 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-9fvn8hys/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-9fvn8hys/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-9fvn8hys/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-9fvn8hys/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())
        File "&lt;string&gt;", line 40
          print """\
          ^^^^^^^^^
      SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed to build 'exabgp' when getting requirements to build wheel' should be empty.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="FAIL" start="2026-04-17T03:25:28.749957" elapsed="0.002055">'  error: subprocess-exited-with-error
  
  × Getting requirements to build wheel did not run successfully.
  │ exit code: 1
  ╰─&gt; [19 lines of output]
      Traceback (most recent call last):
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 389, in &lt;module&gt;
          main()
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 373, in main
          json_out["return_val"] = hook(**hook_input["kwargs"])
        File "/tmp/defaultvenv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 143, in get_requires_for_build_wheel
          return hook(config_settings)
        File "/tmp/pip-build-env-9fvn8hys/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-9fvn8hys/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-9fvn8hys/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-9fvn8hys/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())
        File "&lt;string&gt;", line 40
          print """\
          ^^^^^^^^^
      SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed to build 'exabgp' when getting requirements to build wheel' should be empty.</status>
</kw>
<msg time="2026-04-17T03:25:28.752306" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-04-17T03:25:28.752383" level="INFO">${result} = '  error: subprocess-exited-with-error
  
  × Getting requirements to build wheel did not run successfully.
  │ exit code: 1
  ╰─&gt; [19 lines of output]
      Traceback (most recent call last):
       ...</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:28.747062" elapsed="0.005502"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:28.755027" 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-04-17T03:25:28.753000" elapsed="0.002154"/>
</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-04-17T03:25:28.760346" 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-04-17T03:25:28.759671" elapsed="0.000787"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:28.761381" 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-9fvn8hys/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-9fvn8hys/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-9fvn8hys/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-9fvn8hys/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())
        File "&lt;string&gt;", line 40
          print """\
          ^^^^^^^^^
      SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed to build 'exabgp' when getting requirements to build wheel</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:28.760885" elapsed="0.000654"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:28.762790" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:28.762232" elapsed="0.000657"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-04-17T03:25:28.757774" elapsed="0.005275"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:28.755636" elapsed="0.007556"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:28.755550" elapsed="0.007687"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-04-17T03:25:28.763540" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:28.763323" elapsed="0.000358"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:28.763297" elapsed="0.000421"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:25:28.764014" elapsed="0.000069"/>
</return>
<status status="PASS" start="2026-04-17T03:25:28.763791" elapsed="0.000442"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:28.763770" elapsed="0.000513"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:28.764573" elapsed="0.000037"/>
</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-04-17T03:25:27.124502" elapsed="1.640292"/>
</kw>
<msg time="2026-04-17T03:25:28.764879" 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-04-17T03:25:27.123695" elapsed="1.641292"/>
</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-04-17T03:25:27.122379" elapsed="1.642754"/>
</kw>
<msg time="2026-04-17T03:25:28.765211" 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-04-17T03:25:27.115674" elapsed="1.649603"/>
</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-04-17T03:25:27.115099" elapsed="1.650324"/>
</kw>
<msg time="2026-04-17T03:25:28.765494" 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-04-17T03:25:27.114591" elapsed="1.650966"/>
</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-04-17T03:25:27.114196" elapsed="1.651560"/>
</kw>
<msg time="2026-04-17T03:25:28.765817" 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-04-17T03:25:27.113780" elapsed="1.652097"/>
</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-04-17T03:25:27.113495" elapsed="1.652589"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:25:28.766745" level="INFO">Creating Session using : alias=config-session, url=http://10.30.170.120:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a4417431310&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-04-17T03:25:28.766317" elapsed="0.000687"/>
</kw>
<kw name="Upload_Config_Files">
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-04-17T03:25:28.794395" level="INFO">[chan 5] Opened sftp connection (server version 3)</msg>
<msg time="2026-04-17T03:25:28.804162" 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-04-17T03:25:28.767669" elapsed="0.036674"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-04-17T03:25:28.812087" 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-04-17T03:25:28.804820" elapsed="0.007358"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-04-17T03:25:28.820718" 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-04-17T03:25:28.812430" elapsed="0.008433"/>
</kw>
<kw name="List Files In Directory" owner="SSHLibrary">
<msg time="2026-04-17T03:25:28.832682" 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-04-17T03:25:28.833329" 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-04-17T03:25:28.821282" elapsed="0.012124"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:25:28.835259" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.238/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-04-17T03:25:29.140575" 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-04-17T03:25:28.834707" elapsed="0.306089"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:25:29.141978" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.120/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-04-17T03:25:29.192912" 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-04-17T03:25:29.141448" elapsed="0.051913"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:25:29.194969" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-04-17T03:25:29.245101" 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-04-17T03:25:29.194251" elapsed="0.051158"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:25:29.246671" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-04-17T03:25:29.297356" 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-04-17T03:25:29.246138" elapsed="0.051509"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:25:29.299073" level="INFO">Executing command 'cat bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-04-17T03:25:29.349465" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:25:29.349876" level="INFO">${stdout} = neighbor 10.30.170.120 {
router-id 10.30.171.238;
local-address 10.30.171.238;
local-as 64496;
peer-as 64496;
family {
  ipv4 flow;
}
flow {
    route flow1 {
        match {
            source 10.0.0...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-17T03:25:29.298384" elapsed="0.051534"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:29.351362" level="INFO">neighbor 10.30.170.120 {
router-id 10.30.171.238;
local-address 10.30.171.238;
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-04-17T03:25:29.350596" elapsed="0.000879"/>
</kw>
<var name="${cfgfile}">bgp-flowspec-redirect.cfg</var>
<status status="PASS" start="2026-04-17T03:25:28.834184" elapsed="0.517350"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:25:29.352344" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.238/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-04-17T03:25:29.398654" 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-04-17T03:25:29.352077" elapsed="0.046934"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:25:29.400913" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.120/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-04-17T03:25:29.448896" 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-04-17T03:25:29.400247" elapsed="0.048958"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:25:29.450502" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-04-17T03:25:29.500774" 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-04-17T03:25:29.450010" elapsed="0.050977"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:25:29.501693" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-04-17T03:25:29.548680" 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-04-17T03:25:29.501385" elapsed="0.047538"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:25:29.549986" level="INFO">Executing command 'cat bgp-flowspec.cfg'.</msg>
<msg time="2026-04-17T03:25:29.597722" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:25:29.598166" level="INFO">${stdout} = neighbor 10.30.170.120 {
router-id 10.30.171.238;
local-address 10.30.171.238;
local-as 64496;
peer-as 64496;
family {
  ipv4 flow;
}
flow {
    route flow1 {
        match {
            source 10.0.0...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-17T03:25:29.549540" elapsed="0.048677"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:29.599500" level="INFO">neighbor 10.30.170.120 {
router-id 10.30.171.238;
local-address 10.30.171.238;
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-04-17T03:25:29.598916" elapsed="0.000689"/>
</kw>
<var name="${cfgfile}">bgp-flowspec.cfg</var>
<status status="PASS" start="2026-04-17T03:25:29.351779" elapsed="0.247884"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:25:29.600609" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.238/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-04-17T03:25:29.649534" 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-04-17T03:25:29.600259" elapsed="0.049524"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:25:29.650996" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.120/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-04-17T03:25:29.696856" 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-04-17T03:25:29.650430" elapsed="0.046635"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:25:29.697800" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-04-17T03:25:29.749224" 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-04-17T03:25:29.697454" elapsed="0.052109"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:25:29.750558" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-04-17T03:25:29.797893" 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-04-17T03:25:29.750136" elapsed="0.048129"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:25:29.799562" level="INFO">Executing command 'cat bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-04-17T03:25:29.849863" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:25:29.850354" level="INFO">${stdout} = neighbor 10.30.170.120 {
router-id 10.30.171.238;
local-address 10.30.171.238;
local-as 64496;
peer-as 64496;
  family {
    ipv4 mpls-vpn;
  }
  static {
    route 1.1.1.0/24 {
      next-hop 10.0.25...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-17T03:25:29.799026" elapsed="0.051372"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:29.851706" level="INFO">neighbor 10.30.170.120 {
router-id 10.30.171.238;
local-address 10.30.171.238;
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-04-17T03:25:29.851021" elapsed="0.000762"/>
</kw>
<var name="${cfgfile}">bgp-l3vpn-ipv4.cfg</var>
<status status="PASS" start="2026-04-17T03:25:29.599894" elapsed="0.251944"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:25:29.852641" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.238/g' exa-md5.cfg'.</msg>
<msg time="2026-04-17T03:25:29.901268" 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-04-17T03:25:29.852378" elapsed="0.049276"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:25:29.903227" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.120/g' exa-md5.cfg'.</msg>
<msg time="2026-04-17T03:25:29.949084" 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-04-17T03:25:29.902555" elapsed="0.046849"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:25:29.950810" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exa-md5.cfg'.</msg>
<msg time="2026-04-17T03:25:30.001818" 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-04-17T03:25:29.950179" elapsed="0.051968"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:25:30.003560" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exa-md5.cfg'.</msg>
<msg time="2026-04-17T03:25:30.053211" 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-04-17T03:25:30.003010" elapsed="0.050570"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:25:30.055602" level="INFO">Executing command 'cat exa-md5.cfg'.</msg>
<msg time="2026-04-17T03:25:30.105517" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:25:30.105988" level="INFO">${stdout} = neighbor 10.30.170.120 {
  router-id 10.30.171.238;
  local-address 10.30.171.238;
  local-as 64496;
  peer-as 64496;
  md5-password topsecret;

  capability {
    route-refresh disable;
    add-path ...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-17T03:25:30.054590" elapsed="0.051457"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:30.107531" level="INFO">neighbor 10.30.170.120 {
  router-id 10.30.171.238;
  local-address 10.30.171.238;
  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-04-17T03:25:30.106748" elapsed="0.000867"/>
</kw>
<var name="${cfgfile}">exa-md5.cfg</var>
<status status="PASS" start="2026-04-17T03:25:29.852107" elapsed="0.255568"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:25:30.108668" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.238/g' exa.cfg'.</msg>
<msg time="2026-04-17T03:25:30.157467" 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-04-17T03:25:30.108357" elapsed="0.049466"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:25:30.159347" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.120/g' exa.cfg'.</msg>
<msg time="2026-04-17T03:25:30.209224" 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-04-17T03:25:30.158666" elapsed="0.050892"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:25:30.211011" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exa.cfg'.</msg>
<msg time="2026-04-17T03:25:30.261557" 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-04-17T03:25:30.210304" elapsed="0.051516"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:25:30.262901" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exa.cfg'.</msg>
<msg time="2026-04-17T03:25:30.313828" 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-04-17T03:25:30.262421" elapsed="0.051800"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:25:30.315483" level="INFO">Executing command 'cat exa.cfg'.</msg>
<msg time="2026-04-17T03:25:30.365162" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:25:30.365514" level="INFO">${stdout} = neighbor 10.30.170.120 {
router-id 10.30.171.238;
local-address 10.30.171.238;
local-as 64496;
peer-as 64496;
  capability {
    route-refresh disable;
    add-path disable;
  }

  family {
    ipv4 u...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-17T03:25:30.314883" elapsed="0.050694"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:30.367058" level="INFO">neighbor 10.30.170.120 {
router-id 10.30.171.238;
local-address 10.30.171.238;
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.238;
    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-04-17T03:25:30.366203" elapsed="0.001060"/>
</kw>
<var name="${cfgfile}">exa.cfg</var>
<status status="PASS" start="2026-04-17T03:25:30.107960" elapsed="0.259394"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:25:30.368378" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.238/g' gobgp.cfg'.</msg>
<msg time="2026-04-17T03:25:30.416842" 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-04-17T03:25:30.368102" elapsed="0.048993"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:25:30.417808" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.120/g' gobgp.cfg'.</msg>
<msg time="2026-04-17T03:25:30.483877" 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-04-17T03:25:30.417459" elapsed="0.066664"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:25:30.485077" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' gobgp.cfg'.</msg>
<msg time="2026-04-17T03:25:30.533758" 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-04-17T03:25:30.484645" elapsed="0.049338"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:25:30.534713" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' gobgp.cfg'.</msg>
<msg time="2026-04-17T03:25:30.589025" 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-04-17T03:25:30.534368" elapsed="0.054861"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:25:30.590038" level="INFO">Executing command 'cat gobgp.cfg'.</msg>
<msg time="2026-04-17T03:25:30.645334" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:25:30.645834" level="INFO">${stdout} = [global.config]
    as = 64496
    router-id = "10.30.171.238"
    port = 17900
[[neighbors]]
    [neighbors.config]
        peer-as = 64496
        neighbor-address = "10.30.170.120"
        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-04-17T03:25:30.589688" elapsed="0.056218"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:30.647883" level="INFO">[global.config]
    as = 64496
    router-id = "10.30.171.238"
    port = 17900
[[neighbors]]
    [neighbors.config]
        peer-as = 64496
        neighbor-address = "10.30.170.120"
        local-as = 64496
    [neighbors.transport.config]
        local-address = "10.30.171.238"
        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-04-17T03:25:30.646866" elapsed="0.001351"/>
</kw>
<var name="${cfgfile}">gobgp.cfg</var>
<status status="PASS" start="2026-04-17T03:25:30.367701" elapsed="0.280606"/>
</iter>
<var>${cfgfile}</var>
<value>@{cfgfiles}</value>
<status status="PASS" start="2026-04-17T03:25:28.833633" elapsed="1.814762"/>
</for>
<doc>Uploads exabgp config files and needed scripts</doc>
<status status="PASS" start="2026-04-17T03:25:28.767335" elapsed="1.881291"/>
</kw>
<doc>Suite setup keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:19.652575" elapsed="10.996181"/>
</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-04-17T03:25:30.656482" elapsed="0.000428"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:25:30.655958" elapsed="0.001087"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:25:30.659346" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:30.659046" elapsed="0.000390"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:30.658989" elapsed="0.000486"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:25:30.670888" elapsed="0.000066"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:30.670573" elapsed="0.000486"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:30.670510" elapsed="0.000591"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:30.673055" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:25:30.672294" elapsed="0.000808"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:25:30.673815" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:25:30.673357" elapsed="0.000497"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:25:30.673920" elapsed="0.000082"/>
</return>
<msg time="2026-04-17T03:25:30.674219" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:25:30.671643" elapsed="0.002615"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:25:30.683833" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:30.683461" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:30.683412" elapsed="0.000602"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:25:30.686305" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:30.686145" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:30.686095" elapsed="0.000308"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:25:30.687139" level="INFO">${karaf_connection_index} = 13</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:25:30.686631" elapsed="0.000554"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:30.687761" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:25:30.687437" elapsed="0.000360"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:25:30.688967" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:25:30.688539" elapsed="0.002272">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:25:30.691455" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:25:30.691563" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:30.688040" elapsed="0.003576"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:25:30.693867" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:25:30.693235" elapsed="0.002099">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:25:30.695687" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:25:30.695771" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:30.692186" elapsed="0.003620"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:25:30.697334" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Configure_App_Peer"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:25:30.696353" elapsed="0.001109">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Configure_App_Peer"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:30.695979" elapsed="0.001633">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Configure_App_Peer"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:25:30.695909" elapsed="0.001891">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Configure_App_Peer"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:30.698185" elapsed="0.000048"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:30.698601" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:30.698338" elapsed="0.000347"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:30.698310" elapsed="0.000410"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:25:30.698827" 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-04-17T03:25:30.703196" elapsed="0.000170"/>
</kw>
<msg time="2026-04-17T03:25:30.703443" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:30.701394" elapsed="0.002203"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:30.703907" elapsed="0.000119"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:30.704342" 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-04-17T03:25:30.700333" elapsed="0.004231"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:25:30.699356" elapsed="0.005304"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:25:30.685651" elapsed="0.019140">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Configure_App_Peer"</status>
</kw>
<msg time="2026-04-17T03:25:30.705008" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:25:30.705074" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Configure_App_Peer"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:30.684413" elapsed="0.020697"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:25:30.705395" elapsed="0.000344"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:30.705235" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:30.705202" elapsed="0.000617"/>
</if>
<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-04-17T03:25:30.707243" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:30.707095" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:30.707068" elapsed="0.000266"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:30.707773" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:25:30.707947" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:25:30.707567" elapsed="0.000423"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:30.708644" level="INFO">{1: 13}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:30.708214" elapsed="0.000490"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:30.709288" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:30.708943" elapsed="0.000408"/>
</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-04-17T03:25:30.710197" elapsed="0.000380"/>
</kw>
<msg time="2026-04-17T03:25:30.710713" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:25:30.710773" level="INFO">${old_connection_index} = 13</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:30.709593" elapsed="0.001212"/>
</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-04-17T03:25:30.711926" elapsed="0.000224"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:25:30.713349" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:25:30.712864" elapsed="0.001578">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:30.712328" elapsed="0.002234"/>
</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-04-17T03:25:30.715246" elapsed="0.000286"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:30.714746" elapsed="0.000872"/>
</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-04-17T03:25:30.711281" elapsed="0.004383"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:30.710908" elapsed="0.004902"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:30.710883" elapsed="0.004964"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:25:30.716983" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:25:30.716554" elapsed="0.000464"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:25:30.717087" elapsed="0.000055"/>
</return>
<msg time="2026-04-17T03:25:30.717316" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:25:30.716144" elapsed="0.001206"/>
</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-04-17T03:25:30.717571" elapsed="0.000607"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:30.718533" level="INFO">index=16
host=10.30.170.120
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-04-17T03:25:30.718668" level="INFO">${karaf_connection_object} = index=16
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:25:30.718371" 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-04-17T03:25:30.718863" elapsed="0.003007"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:25:30.722880" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:25:30.724636" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:25:30.722476" elapsed="0.002858">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:25:30.742248" elapsed="0.000499"/>
</kw>
<msg time="2026-04-17T03:25:30.742863" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:30.740448" elapsed="0.002963"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:30.743730" elapsed="0.000037"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:30.744016" elapsed="0.000036"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:25:30.726816" elapsed="0.017368"/>
</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-04-17T03:25:30.725829" elapsed="0.018437"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:25:30.706531" elapsed="0.037902">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:30.745497" elapsed="0.000058"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:25:30.745662" elapsed="0.000048"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:25:30.682550" elapsed="0.063347">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:25:30.746158" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:25:30.746227" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:30.674879" elapsed="0.071577"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:30.748031" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:30.746636" elapsed="0.001516"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:30.746590" elapsed="0.001620"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:25:30.674644" elapsed="0.073621"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:25:30.674350" elapsed="0.073982"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:25:30.669322" elapsed="0.079139"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:25:30.658334" elapsed="0.090380"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:30.657308" elapsed="0.091514"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:25:30.651279" elapsed="0.097689"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:25:30.750546" level="INFO">&amp;{mapping} = { BGP_RIB=example-bgp-rib | IP=10.30.170.120 }</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-04-17T03:25:30.749354" elapsed="0.001251"/>
</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-04-17T03:25:30.799401" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:30.798760" elapsed="0.000692"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:30.800662" 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-04-17T03:25:30.800239" elapsed="0.000535">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-04-17T03:25:30.800912" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:30.799716" elapsed="0.001250"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:30.801798" 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-04-17T03:25:30.801219" elapsed="0.000620"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:25:30.802302" 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-04-17T03:25:30.802543" 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-04-17T03:25:30.802101" elapsed="0.000481"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:30.803189" 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-04-17T03:25:30.802812" elapsed="0.000445"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:30.804769" level="INFO">mapping: {'BGP_RIB': 'example-bgp-rib', 'IP': '10.30.170.120'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:30.804413" elapsed="0.000417"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:25:30.805448" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:25:30.805077" elapsed="0.000407"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:25:30.806457" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:25:30.806035" elapsed="0.000457"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:25:30.807520" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:25:30.807236" elapsed="0.000316"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:25:30.807620" elapsed="0.000051"/>
</return>
<msg time="2026-04-17T03:25:30.807827" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:25:30.806755" elapsed="0.001103"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:25:30.808096" elapsed="0.000328"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:25:30.805816" elapsed="0.002665"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:25:30.809260" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:25:30.808831" elapsed="0.000460"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:25:30.810405" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:25:30.810096" elapsed="0.000344"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:25:30.810604" elapsed="0.000054"/>
</return>
<msg time="2026-04-17T03:25:30.810834" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:25:30.809560" 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-04-17T03:25:30.811111" elapsed="0.000315"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:25:30.808636" elapsed="0.002847"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:25:30.805552" elapsed="0.005980"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:25:30.811596" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:25:30.811811" level="INFO">${mapping_to_use} = {'BGP_RIB': 'example-bgp-rib', 'IP': '10.30.170.120'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:25:30.803899" elapsed="0.007945"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:30.803377" elapsed="0.008510"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:30.812160" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:30.811920" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:30.803337" elapsed="0.008934"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:25:30.813608" 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-04-17T03:25:30.812490" elapsed="0.001160"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:25:30.813749" elapsed="0.000042"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:25:30.797566" elapsed="0.016359"/>
</kw>
<msg time="2026-04-17T03:25:30.814027" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:30.780064" elapsed="0.034034"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:25:30.830183" elapsed="0.000077"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:25:30.843992" 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/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-04-17T03:25:30.857614" elapsed="0.000058"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:30.857939" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:30.858138" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:30.858643" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:30.858449" elapsed="0.000256"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:30.858423" elapsed="0.000311"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:30.858888" 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-04-17T03:25:30.859175" 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-04-17T03:25:30.859349" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:25:30.858371" elapsed="0.001033"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:25:30.858227" elapsed="0.001206"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:30.859588" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:30.859671" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:25:30.859854" 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-04-17T03:25:30.773067" elapsed="0.086818"/>
</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-04-17T03:25:30.889684" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:30.889201" elapsed="0.000519"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:30.890578" 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-04-17T03:25:30.890273" elapsed="0.000388">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-04-17T03:25:30.890760" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:30.889901" elapsed="0.000884"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:30.891375" 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-04-17T03:25:30.890978" elapsed="0.000425"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:25:30.891813" 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-04-17T03:25:30.892039" 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-04-17T03:25:30.891620" elapsed="0.000451"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:30.892568" 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-04-17T03:25:30.892302" 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-04-17T03:25:30.893112" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:30.892704" elapsed="0.000474"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:30.893733" level="INFO">${mapping_to_use} = {'BGP_RIB': 'example-bgp-rib', 'IP': '10.30.170.120'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:30.893373" elapsed="0.000387"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:30.893207" elapsed="0.000588"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:30.892678" elapsed="0.001140"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:25:30.894689" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.120&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-04-17T03:25:30.893992" elapsed="0.000729"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:25:30.894774" 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/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-04-17T03:25:30.888325" elapsed="0.006593"/>
</kw>
<msg time="2026-04-17T03:25:30.895061" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:30.873905" elapsed="0.021210"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:25:30.909249" elapsed="0.000071"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:25:30.923053" elapsed="0.000074"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:25:30.937409" elapsed="0.000075"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:30.937808" 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-04-17T03:25:30.938031" 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-04-17T03:25:30.938562" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:30.938353" elapsed="0.000288"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:30.938332" 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-04-17T03:25:30.938894" elapsed="0.000046"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:30.939155" elapsed="0.000029"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:30.939400" elapsed="0.000031"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:25:30.938287" elapsed="0.001190"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:25:30.938126" elapsed="0.001390"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:30.939728" elapsed="0.000030"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:30.939842" elapsed="0.000025"/>
</return>
<msg time="2026-04-17T03:25:30.940095" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.120&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-04-17T03:25:30.871050" elapsed="0.069090"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:30.941886" 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-04-17T03:25:30.941546" elapsed="0.000441">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-04-17T03:25:30.942092" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:30.941034" elapsed="0.001174"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:30.942712" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:30.942317" elapsed="0.000475"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:30.943498" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:30.943109" elapsed="0.000423"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:30.942825" elapsed="0.000751"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:30.942291" elapsed="0.001316"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:30.946752" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:25:30.943815" elapsed="0.002979"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:25:30.946881" elapsed="0.000076"/>
</return>
<msg time="2026-04-17T03:25:30.947165" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:25:30.940624" elapsed="0.006578"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:30.949920" 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.120</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:30.949404" elapsed="0.000623"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:30.950686" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.120&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-04-17T03:25:30.950222" elapsed="0.000515"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:30.951174" 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-04-17T03:25:30.950898" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:30.951688" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:30.951373" elapsed="0.000363"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:25:30.952687" 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-04-17T03:25:30.952445" elapsed="0.000271"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:25:30.953117" 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-04-17T03:25:30.952878" elapsed="0.000265"/>
</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-04-17T03:25:30.953367" elapsed="0.000233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:30.954104" 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-04-17T03:25:30.953797" elapsed="0.000353"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:25:30.954196" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:25:30.954381" 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-04-17T03:25:30.952006" elapsed="0.002401"/>
</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-04-17T03:25:30.960863" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:25:31.162394" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:25:31.565115" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:25:31.567459" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:25:30.957106" elapsed="0.614030">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:30.954492" elapsed="0.616924">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:31.571805" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:31.571482" elapsed="0.000424"/>
</branch>
<status status="FAIL" start="2026-04-17T03:25:30.954468" elapsed="0.617497">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:31.572613" elapsed="0.000042"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:31.572816" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:31.572758" elapsed="0.000122"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:31.572731" 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-04-17T03:25:31.573195" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:25:31.573299" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:25:30.947996" elapsed="0.625468">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:31.573576" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:25:30.757400" elapsed="0.816314">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:31.574161" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:31.573866" elapsed="0.000391"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:31.573843" elapsed="0.000626"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:31.574517" elapsed="0.000021"/>
</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="FAIL" start="2026-04-17T03:25:30.751437" elapsed="0.823221">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Configures bgp application peer. Openconfig is used for carbon and above.</doc>
<status status="FAIL" start="2026-04-17T03:25:30.648966" elapsed="0.925929">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:25:31.579598" elapsed="0.000294"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:25:31.579186" elapsed="0.000786"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:25:31.581114" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:31.580975" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:31.580951" 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-04-17T03:25:31.587479" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:31.587309" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:31.587277" elapsed="0.000305"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:31.589078" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:25:31.588499" elapsed="0.000617"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:25:31.589704" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:25:31.589335" elapsed="0.000396"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:25:31.589777" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:25:31.589990" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:25:31.587965" elapsed="0.002056"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:25:31.596168" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:31.596046" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:31.596026" elapsed="0.000212"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:25:31.597651" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:31.597541" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:31.597523" elapsed="0.000199"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:25:31.598221" level="INFO">${karaf_connection_index} = 16</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:25:31.597879" elapsed="0.000370"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:31.598643" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:25:31.598418" elapsed="0.000250"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:25:31.599718" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:25:31.599257" elapsed="0.001175">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:25:31.600627" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:25:31.600674" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:31.598833" elapsed="0.001865"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:25:31.601498" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:25:31.601249" elapsed="0.000928">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:25:31.602366" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:25:31.602412" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:31.600876" elapsed="0.001561"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:25:31.603422" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Reconfigure_ODL_To_Accept_Connection"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:25:31.602743" elapsed="0.000743">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Reconfigure_ODL_To_Accept_Connection"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:31.602513" elapsed="0.001044">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Reconfigure_ODL_To_Accept_Connection"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:25:31.602494" elapsed="0.001097">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Reconfigure_ODL_To_Accept_Connection"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:31.603761" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:31.604076" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:31.603847" elapsed="0.000283"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:31.603829" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:25:31.604188" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:25:31.606858" elapsed="0.000192"/>
</kw>
<msg time="2026-04-17T03:25:31.607121" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:31.605683" elapsed="0.001591"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:31.607558" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:31.607903" 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-04-17T03:25:31.605047" elapsed="0.003067"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:25:31.604478" elapsed="0.003705"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:25:31.597230" elapsed="0.011041">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Reconfigure_ODL_To_Accept_Connection"</status>
</kw>
<msg time="2026-04-17T03:25:31.608376" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:25:31.608420" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Reconfigure_ODL_To_Accept_Connection"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:31.596577" elapsed="0.011866"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:25:31.608637" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:31.608525" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:31.608505" elapsed="0.000214"/>
</if>
<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-04-17T03:25:31.609689" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:31.609580" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:31.609562" elapsed="0.000194"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:31.610190" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:25:31.610297" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:25:31.610045" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:31.610797" level="INFO">{1: 16}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:31.610517" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:31.611365" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:31.611050" elapsed="0.000361"/>
</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-04-17T03:25:31.611995" elapsed="0.000273"/>
</kw>
<msg time="2026-04-17T03:25:31.612382" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:25:31.612431" level="INFO">${old_connection_index} = 16</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:31.611579" elapsed="0.000875"/>
</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-04-17T03:25:31.613328" elapsed="0.000211"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:25:31.615200" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:25:31.614624" elapsed="0.001690">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:31.613714" elapsed="0.002712"/>
</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-04-17T03:25:31.617140" elapsed="0.000287"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:31.616610" elapsed="0.000903"/>
</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-04-17T03:25:31.612763" elapsed="0.004799"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:31.612531" elapsed="0.005092"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:31.612512" elapsed="0.005198"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:25:31.618685" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:25:31.618351" elapsed="0.000363"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:25:31.618765" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:25:31.618948" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:25:31.617979" elapsed="0.000996"/>
</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-04-17T03:25:31.619163" elapsed="0.000493"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:31.619985" level="INFO">index=17
host=10.30.170.120
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-04-17T03:25:31.620089" level="INFO">${karaf_connection_object} = index=17
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:25:31.619834" 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-04-17T03:25:31.620283" elapsed="0.002426"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:25:31.623298" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:25:31.624516" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:25:31.622886" elapsed="0.002060">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:25:31.640983" elapsed="0.000449"/>
</kw>
<msg time="2026-04-17T03:25:31.641557" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:31.639122" elapsed="0.002610"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:31.641910" elapsed="0.000040"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:31.642102" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:25:31.626073" elapsed="0.016118"/>
</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-04-17T03:25:31.625275" elapsed="0.016974"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:25:31.609251" elapsed="0.033097">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:31.642778" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:25:31.642858" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:25:31.595671" elapsed="0.047326">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:25:31.643140" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:25:31.643187" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:31.590526" elapsed="0.052685"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:31.643580" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:31.643301" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:31.643279" elapsed="0.000379"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:25:31.590321" elapsed="0.053361"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:25:31.590096" elapsed="0.053621"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:25:31.586697" elapsed="0.057080"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:25:31.580638" elapsed="0.063199"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:31.580143" elapsed="0.063744"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:25:31.576307" elapsed="0.067948"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:25:31.645445" level="INFO">&amp;{mapping} = { IP=10.30.171.238 | 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-04-17T03:25:31.644502" elapsed="0.000974"/>
</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-04-17T03:25:31.685918" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:31.685329" elapsed="0.000657"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:31.687179" 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-04-17T03:25:31.686737" elapsed="0.000521">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-04-17T03:25:31.687357" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:31.686244" elapsed="0.001138"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:31.687966" 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-04-17T03:25:31.687554" elapsed="0.000440"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:25:31.688309" 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-04-17T03:25:31.688482" 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-04-17T03:25:31.688163" elapsed="0.000346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:31.688941" 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-04-17T03:25:31.688674" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:31.690045" level="INFO">mapping: {'IP': '10.30.171.238', '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-04-17T03:25:31.689767" elapsed="0.000324"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:25:31.690532" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:25:31.690259" elapsed="0.000299"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:25:31.691270" level="INFO">${value} = 10.30.171.238</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:25:31.690969" elapsed="0.000327"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:25:31.692060" level="INFO">${encoded} = 10.30.171.238</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:25:31.691817" elapsed="0.000269"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:25:31.692149" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:25:31.692344" level="INFO">${encoded_value} = 10.30.171.238</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:25:31.691492" 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-04-17T03:25:31.692528" elapsed="0.000244"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.238</var>
<status status="PASS" start="2026-04-17T03:25:31.690794" elapsed="0.002020"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:25:31.693389" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:25:31.693082" elapsed="0.000333"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:25:31.694348" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:25:31.694133" elapsed="0.000241"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:25:31.694478" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:25:31.694636" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:25:31.693607" elapsed="0.001054"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:25:31.694817" elapsed="0.000257"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:25:31.692943" elapsed="0.002173"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:25:31.695663" 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-04-17T03:25:31.695364" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:25:31.696688" 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-04-17T03:25:31.696258" elapsed="0.000457"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:25:31.696766" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:25:31.696921" 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-04-17T03:25:31.695880" 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-04-17T03:25:31.697123" elapsed="0.000236"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:25:31.695228" elapsed="0.002176"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:25:31.697981" 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-04-17T03:25:31.697657" elapsed="0.000351"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:25:31.698761" 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-04-17T03:25:31.698528" elapsed="0.000268"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:25:31.698862" elapsed="0.000124"/>
</return>
<msg time="2026-04-17T03:25:31.699123" 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-04-17T03:25:31.698203" 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-04-17T03:25:31.699325" elapsed="0.000258"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:25:31.697518" elapsed="0.002112"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:25:31.700267" 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-04-17T03:25:31.699953" elapsed="0.000339"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:25:31.701109" 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-04-17T03:25:31.700872" elapsed="0.000263"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:25:31.701186" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:25:31.701339" 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-04-17T03:25:31.700517" 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-04-17T03:25:31.701546" elapsed="0.000231"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:25:31.699796" elapsed="0.002024"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:25:31.702438" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:25:31.702108" elapsed="0.000364"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:25:31.703470" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:25:31.703187" elapsed="0.000319"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:25:31.703563" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:25:31.703739" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:25:31.702711" elapsed="0.001054"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:25:31.703978" elapsed="0.000235"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:25:31.701966" elapsed="0.002289"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:25:31.704892" 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-04-17T03:25:31.704553" elapsed="0.000365"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:25:31.705748" 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-04-17T03:25:31.705496" elapsed="0.000280"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:25:31.705830" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:25:31.706093" 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-04-17T03:25:31.705139" elapsed="0.000978"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:25:31.706278" elapsed="0.000264"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:25:31.704384" elapsed="0.002215"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:25:31.690610" elapsed="0.016027"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:25:31.706685" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:25:31.706883" level="INFO">${mapping_to_use} = {'IP': '10.30.171.238', '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-04-17T03:25:31.689432" elapsed="0.017483"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:31.689070" elapsed="0.017897"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:31.707163" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:31.706999" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:31.689047" elapsed="0.018196"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:25:31.708496" 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-04-17T03:25:31.707416" elapsed="0.001111"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:25:31.708580" 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/bgp_peer.vanadium/${file_name} exists. If 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-04-17T03:25:31.684322" elapsed="0.024423"/>
</kw>
<msg time="2026-04-17T03:25:31.708808" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:31.668716" elapsed="0.040148"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:25:31.722520" elapsed="0.000041"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name} exists. If 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-04-17T03:25:31.736108" 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/bgp_peer.vanadium/${file_name} exists. If 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-04-17T03:25:31.749131" elapsed="0.000040"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:31.749396" 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-04-17T03:25:31.749588" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:31.750036" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:31.749857" elapsed="0.000238"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:31.749839" 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-04-17T03:25:31.750303" 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-04-17T03:25:31.750593" 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-04-17T03:25:31.750796" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:25:31.749800" elapsed="0.001054"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:25:31.749674" elapsed="0.001208"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:31.751090" elapsed="0.000028"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:31.751212" elapsed="0.000023"/>
</return>
<msg time="2026-04-17T03:25:31.751418" 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-04-17T03:25:31.664024" elapsed="0.087427"/>
</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-04-17T03:25:31.780073" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:31.779627" elapsed="0.000480"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:31.780914" 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-04-17T03:25:31.780657" elapsed="0.000351">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-04-17T03:25:31.781107" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:31.780291" elapsed="0.000841"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:31.781718" 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-04-17T03:25:31.781304" elapsed="0.000442"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:25:31.782124" 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-04-17T03:25:31.782305" 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-04-17T03:25:31.781970" elapsed="0.000363"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:31.782829" 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-04-17T03:25:31.782500" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-17T03:25:31.783370" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:31.782981" elapsed="0.000450"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:31.783999" level="INFO">${mapping_to_use} = {'IP': '10.30.171.238', 'BGP_RIB': 'example-bgp-rib', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:31.783617" elapsed="0.000413"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:31.783457" elapsed="0.000610"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:31.782956" elapsed="0.001132"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:25:31.784979" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.238&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/pee...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:25:31.784243" elapsed="0.000768"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:25:31.785066" elapsed="0.000122"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:25:31.778863" elapsed="0.006434"/>
</kw>
<msg time="2026-04-17T03:25:31.785355" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:31.765182" elapsed="0.020223"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:25:31.798732" elapsed="0.000048"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:25:31.813718" elapsed="0.000065"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name} exists. If 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-04-17T03:25:31.829571" elapsed="0.000066"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:31.829889" 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-04-17T03:25:31.830110" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:31.830650" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:31.830427" elapsed="0.000284"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:31.830404" elapsed="0.000334"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:31.830889" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:31.831084" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:31.831262" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:25:31.830360" elapsed="0.000956"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:25:31.830202" elapsed="0.001142"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:31.831498" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:31.831578" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:25:31.831756" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.238&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/pee...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:25:31.762072" elapsed="0.069717"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:31.833443" 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-04-17T03:25:31.833107" elapsed="0.000429">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-04-17T03:25:31.833662" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:31.832669" elapsed="0.001020"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:31.834104" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:31.833762" elapsed="0.000422"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:31.834915" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:31.834507" elapsed="0.000460"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:31.834221" elapsed="0.000791"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:31.833744" elapsed="0.001293"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:31.837548" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:25:31.835230" elapsed="0.002345"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:25:31.837631" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:25:31.837799" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:25:31.832278" elapsed="0.005547"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:31.839357" 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.238</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:31.839088" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:31.839804" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.238&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-04-17T03:25:31.839566" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:31.840274" 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-04-17T03:25:31.840026" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:31.840720" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:31.840475" elapsed="0.000290"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:25:31.841623" 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-04-17T03:25:31.841419" elapsed="0.000231"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:25:31.842004" 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-04-17T03:25:31.841809" elapsed="0.000221"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:25:31.842187" elapsed="0.000214"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:31.842881" 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-04-17T03:25:31.842628" elapsed="0.000314"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:25:31.842988" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:25:31.843151" 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-04-17T03:25:31.840995" elapsed="0.002182"/>
</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-04-17T03:25:31.849091" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:25:32.050883" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:25:32.453402" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:25:32.456337" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:25:31.845660" elapsed="0.615909">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:31.843252" elapsed="0.618539">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:32.462350" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:32.461880" elapsed="0.000635"/>
</branch>
<status status="FAIL" start="2026-04-17T03:25:31.843232" elapsed="0.619337">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:32.463543" elapsed="0.000062"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:32.463851" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:32.463764" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:32.463725" elapsed="0.000303"/>
</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-04-17T03:25:32.464373" elapsed="0.000068"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:25:32.464611" elapsed="0.000098"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:25:31.838205" elapsed="0.626767">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:32.465153" elapsed="0.000024"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:25:31.652649" elapsed="0.812613">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:32.465596" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:32.465376" elapsed="0.000292"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:32.465359" elapsed="0.000334"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:32.465726" elapsed="0.000014"/>
</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="FAIL" start="2026-04-17T03:25:31.645764" elapsed="0.820064">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Configures BGP peer module with initiate-connection set to false.</doc>
<status status="FAIL" start="2026-04-17T03:25:31.575407" elapsed="0.890678">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:25:32.470131" elapsed="0.000268"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:25:32.469824" elapsed="0.000632"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:25:32.471559" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:32.471427" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:32.471408" elapsed="0.000220"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:25:32.476975" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:32.476843" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:32.476823" elapsed="0.000222"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:32.478267" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:25:32.477836" elapsed="0.000459"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:25:32.478765" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:25:32.478462" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:25:32.478838" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:25:32.479156" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:25:32.477431" elapsed="0.001751"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:25:32.484990" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:32.484816" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:32.484796" elapsed="0.000267"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:25:32.486413" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:32.486264" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:32.486246" elapsed="0.000307"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:25:32.487160" level="INFO">${karaf_connection_index} = 17</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:25:32.486708" elapsed="0.000480"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:32.487643" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:25:32.487396" elapsed="0.000273"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:25:32.489902" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:25:32.489208" elapsed="0.001305">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:25:32.490675" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:25:32.490721" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:32.487864" elapsed="0.002881"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:25:32.492757" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:25:32.492304" elapsed="0.001053">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:25:32.493516" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:25:32.493561" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:32.490991" elapsed="0.002593"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:25:32.494627" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.L3vpn_Ipv4_To_Odl"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:25:32.494029" elapsed="0.000763">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.L3vpn_Ipv4_To_Odl"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:32.493713" elapsed="0.001252">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.L3vpn_Ipv4_To_Odl"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:25:32.493692" elapsed="0.001369">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.L3vpn_Ipv4_To_Odl"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:32.495238" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:32.495525" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:32.495348" elapsed="0.000338"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:32.495330" elapsed="0.000383"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:25:32.495750" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:25:32.498482" elapsed="0.000162"/>
</kw>
<msg time="2026-04-17T03:25:32.498700" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:32.498000" elapsed="0.000769"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:32.499159" elapsed="0.000027"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:32.499392" 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-04-17T03:25:32.497057" elapsed="0.002485"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:25:32.496164" 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="FAIL" start="2026-04-17T03:25:32.485879" elapsed="0.013847">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.L3vpn_Ipv4_To_Odl"</status>
</kw>
<msg time="2026-04-17T03:25:32.499833" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:25:32.499877" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.L3vpn_Ipv4_To_Odl"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:32.485231" elapsed="0.014670"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:25:32.500271" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:32.500157" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:32.500137" elapsed="0.000200"/>
</if>
<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-04-17T03:25:32.501403" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:32.501274" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:32.501250" elapsed="0.000236"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:32.501829" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:25:32.501958" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:25:32.501689" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:32.502434" level="INFO">{1: 17}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:32.502145" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:32.502900" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:32.502635" elapsed="0.000324"/>
</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-04-17T03:25:32.503562" elapsed="0.000508"/>
</kw>
<msg time="2026-04-17T03:25:32.504239" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:25:32.504296" level="INFO">${old_connection_index} = 17</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:32.503126" elapsed="0.001195"/>
</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-04-17T03:25:32.505694" elapsed="0.000332"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:25:32.508150" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:25:32.507494" elapsed="0.001266">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:32.506416" elapsed="0.002442"/>
</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-04-17T03:25:32.510129" elapsed="0.000184"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:32.509214" elapsed="0.001170"/>
</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-04-17T03:25:32.504713" elapsed="0.005804"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:32.504402" elapsed="0.006230"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:32.504382" elapsed="0.006284"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:25:32.511812" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:25:32.511339" elapsed="0.000512"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:25:32.511985" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:25:32.512158" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:25:32.510957" elapsed="0.001227"/>
</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-04-17T03:25:32.512346" elapsed="0.000724"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:32.513476" level="INFO">index=18
host=10.30.170.120
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-04-17T03:25:32.513596" level="INFO">${karaf_connection_object} = index=18
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:25:32.513317" elapsed="0.000306"/>
</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-04-17T03:25:32.513781" elapsed="0.016004"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:25:32.530470" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:25:32.531755" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:25:32.530045" elapsed="0.002746">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:25:32.538347" elapsed="0.000174"/>
</kw>
<msg time="2026-04-17T03:25:32.538607" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:32.537276" 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-04-17T03:25:32.539194" elapsed="0.000066"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:32.539585" elapsed="0.000078"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:25:32.534078" elapsed="0.005718"/>
</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-04-17T03:25:32.533311" elapsed="0.006553"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:25:32.500856" elapsed="0.039317">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:32.540680" elapsed="0.000030"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:25:32.540762" elapsed="0.000024"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:25:32.484426" elapsed="0.056460">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:25:32.541032" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:25:32.541080" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:32.479571" elapsed="0.061533"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:32.541476" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:32.541196" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:32.541172" elapsed="0.000384"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:25:32.479421" elapsed="0.062159"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:25:32.479243" elapsed="0.062372"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:25:32.476366" elapsed="0.065311"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:25:32.471119" elapsed="0.070719"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:32.470635" elapsed="0.071271"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:25:32.467267" elapsed="0.074725"/>
</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-04-17T03:25:32.607141" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:32.606070" elapsed="0.001120"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:32.608357" 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-04-17T03:25:32.607877" elapsed="0.000619">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-04-17T03:25:32.608712" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:32.607456" elapsed="0.001294"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:32.609488" 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-04-17T03:25:32.608950" elapsed="0.000568"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:25:32.609963" 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-04-17T03:25:32.610200" 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-04-17T03:25:32.609690" elapsed="0.000545"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:32.610798" 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-04-17T03:25:32.610404" elapsed="0.000453"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:32.613090" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:32.612213" elapsed="0.001070"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:25:32.614728" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:25:32.613671" elapsed="0.001166"/>
</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-04-17T03:25:32.615839" elapsed="0.000138"/>
</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-04-17T03:25:32.616459" elapsed="0.000167"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:25:32.617007" elapsed="0.000095"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:25:32.615455" elapsed="0.001716"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:25:32.614986" elapsed="0.002296"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:25:32.617420" elapsed="0.000065"/>
</return>
<msg time="2026-04-17T03:25:32.617885" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:25:32.611458" elapsed="0.006466"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:32.610969" elapsed="0.007029"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:32.618287" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:32.618047" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:32.610922" elapsed="0.007482"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:25:32.619395" 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-04-17T03:25:32.618623" elapsed="0.000811"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:25:32.619491" elapsed="0.000034"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_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-04-17T03:25:32.605119" elapsed="0.014511"/>
</kw>
<msg time="2026-04-17T03:25:32.619775" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:32.589317" elapsed="0.030520"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:25:32.634015" 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/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-04-17T03:25:32.648644" elapsed="0.000061"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:25:32.663498" elapsed="0.000083"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:32.663954" elapsed="0.000036"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:32.664259" 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-04-17T03:25:32.664866" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:32.664655" elapsed="0.000312"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:32.664630" elapsed="0.000374"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:32.665199" 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-04-17T03:25:32.665445" 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-04-17T03:25:32.665665" elapsed="0.000029"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:25:32.664575" elapsed="0.001166"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:25:32.664384" elapsed="0.001397"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:32.666008" elapsed="0.000029"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:32.666121" elapsed="0.000027"/>
</return>
<msg time="2026-04-17T03:25:32.666349" 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-04-17T03:25:32.583857" elapsed="0.082530"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:32.668424" 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-04-17T03:25:32.667975" elapsed="0.000614">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-04-17T03:25:32.668696" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:32.667374" elapsed="0.001348"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:32.669167" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:32.668823" elapsed="0.000419"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:32.669871" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:32.669505" elapsed="0.000401"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:32.669270" elapsed="0.000702"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:32.668796" elapsed="0.001206"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:32.673294" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:25:32.670226" elapsed="0.003098"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:25:32.673386" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:25:32.673605" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:25:32.666895" elapsed="0.006748"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:32.675068" 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-04-17T03:25:32.674814" elapsed="0.000311"/>
</kw>
<msg time="2026-04-17T03:25:32.675212" 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-04-17T03:25:32.674454" elapsed="0.000782"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-04-17T03:25:32.675490" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:32.675325" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:32.675298" elapsed="0.000260"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:25:32.675880" 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-04-17T03:25:32.676074" 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-04-17T03:25:32.675710" elapsed="0.000411"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-04-17T03:25:32.676543" 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-04-17T03:25:32.676290" elapsed="0.000278"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-04-17T03:25:32.676614" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:25:32.676770" 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-04-17T03:25:32.674081" elapsed="0.002714"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:32.678275" 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-04-17T03:25:32.677992" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:32.678747" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:32.678497" 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-04-17T03:25:32.685026" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:32.887036" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:33.290608" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:33.293972" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:25:32.681426" elapsed="0.618220">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:32.678856" elapsed="0.620948">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:33.300133" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:33.299854" elapsed="0.000355"/>
</branch>
<status status="FAIL" start="2026-04-17T03:25:32.678838" elapsed="0.621397">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:33.300715" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:33.300864" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:33.300822" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:33.300801" 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-04-17T03:25:33.301106" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:25:33.301175" 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-04-17T03:25:32.677136" elapsed="0.624165">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:33.301382" 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-04-17T03:25:32.556947" elapsed="0.744541">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:33.301779" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:33.301587" elapsed="0.000266"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:33.301569" elapsed="0.000308"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:33.301910" elapsed="0.000029"/>
</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="FAIL" start="2026-04-17T03:25:32.549218" elapsed="0.752814">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verify empty data on neon</doc>
<status status="FAIL" start="2026-04-17T03:25:32.542900" elapsed="0.759238">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verfiy empty data response</doc>
<status status="FAIL" start="2026-04-17T03:25:32.542626" elapsed="0.759602">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:25:35.369198" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:35.368294" elapsed="0.000953"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:35.370384" 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-04-17T03:25:35.369911" elapsed="0.000601">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-04-17T03:25:35.370730" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:35.369466" elapsed="0.001293"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:35.371532" 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-04-17T03:25:35.370990" elapsed="0.000579"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:25:35.372022" 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-04-17T03:25:35.372202" 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-04-17T03:25:35.371766" elapsed="0.000463"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:35.372767" 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-04-17T03:25:35.372409" elapsed="0.000407"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:35.375043" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:35.374191" elapsed="0.001044"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:25:35.376643" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:25:35.375613" elapsed="0.001139"/>
</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-04-17T03:25:35.377741" elapsed="0.000112"/>
</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-04-17T03:25:35.378319" elapsed="0.000165"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:25:35.378834" elapsed="0.000091"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:25:35.377363" elapsed="0.001648"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:25:35.376879" elapsed="0.002241"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:25:35.379252" elapsed="0.000055"/>
</return>
<msg time="2026-04-17T03:25:35.379660" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:25:35.373409" elapsed="0.006287"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:35.372904" elapsed="0.006834"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:35.380008" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:35.379774" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:35.372878" elapsed="0.007240"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:25:35.381185" 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-04-17T03:25:35.380333" elapsed="0.000888"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:25:35.381284" 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_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-04-17T03:25:35.367263" elapsed="0.014184"/>
</kw>
<msg time="2026-04-17T03:25:35.381522" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:35.349813" elapsed="0.031787"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:25:35.401501" 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/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-04-17T03:25:35.416210" elapsed="0.000065"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:25:35.429476" elapsed="0.000065"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:35.429846" 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-04-17T03:25:35.430066" 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-04-17T03:25:35.430524" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:35.430364" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:35.430346" 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-04-17T03:25:35.430756" 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-04-17T03:25:35.431030" 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-04-17T03:25:35.431218" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:25:35.430306" elapsed="0.000971"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:25:35.430156" elapsed="0.001150"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:35.431472" elapsed="0.000025"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:35.431562" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:25:35.431748" 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-04-17T03:25:35.343785" elapsed="0.088002"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:35.433479" 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-04-17T03:25:35.433095" elapsed="0.000494">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-04-17T03:25:35.433741" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:35.432649" elapsed="0.001124"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:35.434304" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:35.433861" elapsed="0.000513"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:35.435119" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:35.434689" elapsed="0.000463"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:35.434410" elapsed="0.000788"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:35.433837" elapsed="0.001388"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:35.438198" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:25:35.435432" elapsed="0.002803"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:25:35.438311" elapsed="0.000052"/>
</return>
<msg time="2026-04-17T03:25:35.438549" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:25:35.432245" elapsed="0.006340"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:35.440367" 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-04-17T03:25:35.440068" elapsed="0.000380"/>
</kw>
<msg time="2026-04-17T03:25:35.440574" 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-04-17T03:25:35.439550" elapsed="0.001058"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-04-17T03:25:35.440947" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:35.440717" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:35.440688" elapsed="0.000361"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:25:35.441512" 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-04-17T03:25:35.441775" 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-04-17T03:25:35.441273" elapsed="0.000539"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-04-17T03:25:35.442399" 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-04-17T03:25:35.442059" elapsed="0.000378"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-04-17T03:25:35.442506" elapsed="0.000050"/>
</return>
<msg time="2026-04-17T03:25:35.442740" 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-04-17T03:25:35.439033" elapsed="0.003744"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:35.444631" 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-04-17T03:25:35.444330" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:35.445125" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:35.444846" elapsed="0.000328"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:25:35.452115" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:35.654403" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:36.058104" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:36.060748" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:25:35.448216" elapsed="0.616568">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:35.445250" elapsed="0.619827">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:36.065479" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:36.065148" elapsed="0.000440"/>
</branch>
<status status="FAIL" start="2026-04-17T03:25:35.445228" elapsed="0.620403">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:36.066387" elapsed="0.000043"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:36.066605" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:36.066546" elapsed="0.000144"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:36.066518" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:36.066983" elapsed="0.000037"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:25:36.067093" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:25:35.443273" elapsed="0.624000">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:36.067393" 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-04-17T03:25:35.317824" elapsed="0.749736">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:36.068058" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:36.067739" elapsed="0.000431"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:36.067710" elapsed="0.000498"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:36.068256" elapsed="0.000022"/>
</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="FAIL" start="2026-04-17T03:25:35.310810" elapsed="0.757601">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verify empty data on neon</doc>
<status status="FAIL" start="2026-04-17T03:25:35.303467" elapsed="0.765196">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verfiy empty data response</doc>
<status status="FAIL" start="2026-04-17T03:25:35.302912" elapsed="0.765898">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<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-04-17T03:25:38.132179" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:38.131429" elapsed="0.000877"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:38.133307" 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-04-17T03:25:38.132856" elapsed="0.000551">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-04-17T03:25:38.133619" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:38.132498" elapsed="0.001149"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:38.134343" 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-04-17T03:25:38.133838" elapsed="0.000533"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:25:38.134770" 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-04-17T03:25:38.134947" 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-04-17T03:25:38.134545" elapsed="0.000430"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:38.135523" 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-04-17T03:25:38.135178" 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-04-17T03:25:38.137415" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:38.136656" elapsed="0.000910"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:25:38.138645" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:25:38.137864" elapsed="0.000865"/>
</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-04-17T03:25:38.139478" elapsed="0.000070"/>
</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-04-17T03:25:38.139880" elapsed="0.000157"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:25:38.140322" elapsed="0.000081"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:25:38.139200" elapsed="0.001254"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:25:38.138822" elapsed="0.001710"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:25:38.140631" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:25:38.141025" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:25:38.136069" elapsed="0.004985"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:38.135656" elapsed="0.005432"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:38.141268" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:38.141113" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:38.135630" elapsed="0.005716"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:25:38.142171" 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-04-17T03:25:38.141496" elapsed="0.000706"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:25:38.142252" 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-04-17T03:25:38.130713" elapsed="0.011670"/>
</kw>
<msg time="2026-04-17T03:25:38.142441" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:38.116808" elapsed="0.025686"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:25:38.156858" elapsed="0.000092"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:25:38.171238" elapsed="0.000075"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:25:38.186572" elapsed="0.000069"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:38.186968" 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-04-17T03:25:38.187225" 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-04-17T03:25:38.187765" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:38.187552" elapsed="0.000283"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:38.187533" 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-04-17T03:25:38.188100" 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-04-17T03:25:38.188290" 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-04-17T03:25:38.188498" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:25:38.187489" elapsed="0.001066"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:25:38.187324" elapsed="0.001259"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:38.188736" elapsed="0.000032"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:38.189015" elapsed="0.000050"/>
</return>
<msg time="2026-04-17T03:25:38.189367" 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-04-17T03:25:38.111718" elapsed="0.077717"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:38.192396" 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-04-17T03:25:38.191811" elapsed="0.000733">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-04-17T03:25:38.192745" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:38.191009" elapsed="0.001788"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:38.193563" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:38.193014" elapsed="0.000660"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:38.194914" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:38.194269" elapsed="0.000722"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:38.193724" elapsed="0.001349"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:38.192974" elapsed="0.002144"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:38.199084" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:25:38.195474" elapsed="0.003639"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:25:38.199184" elapsed="0.000053"/>
</return>
<msg time="2026-04-17T03:25:38.199600" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:25:38.190243" elapsed="0.009394"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:38.201456" 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-04-17T03:25:38.201154" elapsed="0.000402"/>
</kw>
<msg time="2026-04-17T03:25:38.201677" 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-04-17T03:25:38.200582" elapsed="0.001127"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-04-17T03:25:38.202027" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:38.201808" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:38.201780" elapsed="0.000342"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:25:38.202571" 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-04-17T03:25:38.202773" 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-04-17T03:25:38.202348" elapsed="0.000460"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-04-17T03:25:38.203407" 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-04-17T03:25:38.203055" elapsed="0.000389"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-04-17T03:25:38.203524" elapsed="0.000045"/>
</return>
<msg time="2026-04-17T03:25:38.203750" 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-04-17T03:25:38.200128" elapsed="0.003657"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:38.205874" 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-04-17T03:25:38.205323" elapsed="0.000668"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:38.206739" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:38.206232" elapsed="0.000595"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:25:38.213539" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:38.415551" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:38.818878" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:38.822334" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:25:38.209913" elapsed="0.616840">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:38.206986" elapsed="0.619926">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:38.827329" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:38.827001" elapsed="0.000432"/>
</branch>
<status status="FAIL" start="2026-04-17T03:25:38.206921" elapsed="0.620578">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:38.828460" elapsed="0.000046"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:38.828710" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:38.828631" elapsed="0.000152"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:38.828594" elapsed="0.000222"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:38.829096" elapsed="0.000035"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:25:38.829208" 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-04-17T03:25:38.204251" elapsed="0.625150">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:38.829521" 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-04-17T03:25:38.087412" elapsed="0.742279">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:38.830173" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:38.829848" elapsed="0.000497"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:38.829814" elapsed="0.000573"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:38.830441" elapsed="0.000023"/>
</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="FAIL" start="2026-04-17T03:25:38.078515" elapsed="0.752086">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verify empty data on neon</doc>
<status status="FAIL" start="2026-04-17T03:25:38.070277" elapsed="0.760483">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verfiy empty data response</doc>
<status status="FAIL" start="2026-04-17T03:25:38.069499" elapsed="0.761413">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:25:38.831106" level="FAIL">Keyword 'Verify_Empty_Reported_Data' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-17T03:25:32.542163" elapsed="6.289105">Keyword 'Verify_Empty_Reported_Data' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Start_ExaBgp_And_Verify_Connected" owner="ExaBgpLib">
<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="NOT RUN" start="2026-04-17T03:25:38.831843" elapsed="0.000115"/>
</kw>
<arg>${L3VPN_EXA_CFG}</arg>
<doc>Verifies initial test condition and starts the exabgp</doc>
<status status="FAIL" start="2026-04-17T03:25:32.466818" elapsed="6.365301">Keyword 'Verify_Empty_Reported_Data' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Teardown_Simple" type="TEARDOWN">
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-04-17T03:25:38.834117" level="INFO">${output} =  </msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-04-17T03:25:38.833776" elapsed="0.000383"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:38.834820" level="INFO"> </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:38.834393" elapsed="0.000492"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:25:38.836231" 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-04-17T03:25:38.835687" elapsed="0.000583"/>
</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-04-17T03:25:38.836476" elapsed="0.000276"/>
</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-04-17T03:25:38.835201" elapsed="0.001611"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:25:38.838997" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-188-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-04-17T03:25:38.839092" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-188-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-04-17T03:25:38.836992" elapsed="0.002128"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:38.839541" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-188-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-04-17T03:25:38.839287" elapsed="0.000305"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:25:38.842055" 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-04-17T03:25:38.840588" elapsed="0.001524"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:25:38.920185" level="INFO">[?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-188-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-04-17T03:25:38.920404" level="INFO">${output} = [?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-188-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-04-17T03:25:38.842279" elapsed="0.078163"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:38.921315" level="INFO">[?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-188-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-04-17T03:25:38.920980" elapsed="0.000384"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:38.920589" elapsed="0.000812"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:38.920551" elapsed="0.000881"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-04-17T03:25:38.840172" elapsed="0.081318"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-04-17T03:25:38.833289" elapsed="0.088260"/>
</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-04-17T03:25:38.976907" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:38.976173" elapsed="0.000795"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:38.977944" 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-04-17T03:25:38.977520" elapsed="0.000520">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-04-17T03:25:38.978205" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:38.977156" elapsed="0.001074"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:38.978880" 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-04-17T03:25:38.978407" elapsed="0.000501"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:25:38.979319" 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-04-17T03:25:38.979485" 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-04-17T03:25:38.979099" elapsed="0.000422"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:38.980106" 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-04-17T03:25:38.979735" elapsed="0.000516"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:38.982122" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:38.981403" elapsed="0.000866"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:25:38.983379" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:25:38.982562" elapsed="0.000899"/>
</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-04-17T03:25:38.984264" elapsed="0.000071"/>
</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-04-17T03:25:38.984645" elapsed="0.000130"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:25:38.985051" elapsed="0.000070"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:25:38.983984" elapsed="0.001187"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:25:38.983571" elapsed="0.001678"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:25:38.985344" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:25:38.985653" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:25:38.980788" elapsed="0.004891"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:38.980338" elapsed="0.005374"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:38.985896" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:38.985739" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:38.980312" elapsed="0.005700"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:25:38.986777" 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-04-17T03:25:38.986166" elapsed="0.000640"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:25:38.986856" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:25:38.975346" elapsed="0.011660"/>
</kw>
<msg time="2026-04-17T03:25:38.987063" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:38.961690" elapsed="0.025441"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:25:39.000270" elapsed="0.000036"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/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-04-17T03:25:39.014154" elapsed="0.000056"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:25:39.028406" elapsed="0.000066"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:39.028746" 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-04-17T03:25:39.029046" 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-04-17T03:25:39.029533" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:39.029368" elapsed="0.000238"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:39.029349" elapsed="0.000293"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:39.029802" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:39.030018" 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-04-17T03:25:39.030200" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:25:39.029305" elapsed="0.000950"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:25:39.029145" elapsed="0.001138"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:39.030437" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:39.030519" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:25:39.030693" 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-04-17T03:25:38.957067" elapsed="0.073656"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:39.032315" 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-04-17T03:25:39.031997" elapsed="0.000394">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-04-17T03:25:39.032490" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:39.031531" 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-04-17T03:25:39.032857" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:39.032585" elapsed="0.000329"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:39.033451" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:39.033149" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:39.032955" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:39.032566" elapsed="0.000969"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:39.036030" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:25:39.033693" elapsed="0.002363"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:25:39.036111" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:25:39.036273" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:25:39.031128" elapsed="0.005170"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:39.037572" 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-04-17T03:25:39.037337" elapsed="0.000290"/>
</kw>
<msg time="2026-04-17T03:25:39.037712" 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-04-17T03:25:39.036996" elapsed="0.000740"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-04-17T03:25:39.037954" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:39.037805" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:39.037787" elapsed="0.000235"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:25:39.038337" 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-04-17T03:25:39.038583" 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-04-17T03:25:39.038173" elapsed="0.000436"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-04-17T03:25:39.039035" 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-04-17T03:25:39.038772" elapsed="0.000290"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-04-17T03:25:39.039110" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:25:39.039264" 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-04-17T03:25:39.036616" elapsed="0.002672"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:39.040827" 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-04-17T03:25:39.040572" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:39.041293" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:39.041048" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:25:39.046695" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:39.248399" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:39.651580" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:39.655003" level="INFO">${response} = None</msg>
<msg time="2026-04-17T03:25:39.655124" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:25:39.043746" elapsed="0.614944">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:39.041405" elapsed="0.617501">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:39.659338" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:39.658996" elapsed="0.000489"/>
</branch>
<status status="FAIL" start="2026-04-17T03:25:39.041385" elapsed="0.618148">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:39.666050" 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-04-17T03:25:39.661690" elapsed="0.004453">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:39.661242" elapsed="0.005051">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:25:39.661205" elapsed="0.005159">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-04-17T03:25:39.670892" 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-04-17T03:25:39.667014" elapsed="0.003953">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:39.666519" elapsed="0.004549">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:25:39.666482" elapsed="0.004634">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:25:39.672071" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:25:39.671497" elapsed="0.000604"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:39.672445" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:39.672181" elapsed="0.000326"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:39.673148" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:39.672719" elapsed="0.000465"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:39.672533" elapsed="0.000702"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:39.672160" elapsed="0.001104"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:25:39.673850" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:25:39.673450" elapsed="0.000428"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:39.674234" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:39.673979" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:39.674829" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:39.674496" elapsed="0.000360"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:39.674319" elapsed="0.000574"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:39.673958" elapsed="0.000956"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:39.675106" elapsed="0.000366"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-17T03:25:39.675995" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:25:39.675650" elapsed="0.000372"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-04-17T03:25:39.679127" 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-04-17T03:25:39.676189" elapsed="0.002981">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of 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-04-17T03:25:39.660327" elapsed="0.019014">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>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:39.679565" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:39.679440" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:39.679416" elapsed="0.000224"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-17T03:25:39.682365" level="INFO">${text_normalized} = None</msg>
<msg time="2026-04-17T03:25:39.682408" level="FAIL">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="FAIL" start="2026-04-17T03:25:39.679812" elapsed="0.002631">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-17T03:25:39.682527" elapsed="0.000225"/>
</return>
<msg time="2026-04-17T03:25:39.683059" level="INFO">${response_text} = None</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and 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-04-17T03:25:39.039692" elapsed="0.643404">Several failures occurred:

1) ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))

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

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

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

5) Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-17T03:25:39.683189" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:25:39.683462" level="INFO">${response_text} = None</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${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-04-17T03:25:38.933548" elapsed="0.749957">Several failures occurred:

1) ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))

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

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

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

5) Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:39.764832" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:39.763476" elapsed="0.001462"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:39.766382" 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-04-17T03:25:39.766082" elapsed="0.000379">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-04-17T03:25:39.766796" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:39.765250" elapsed="0.001646"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:39.768330" 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-04-17T03:25:39.767207" elapsed="0.001206"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:25:39.769106" 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-04-17T03:25:39.769439" 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-04-17T03:25:39.768676" elapsed="0.000863"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:39.770531" 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-04-17T03:25:39.769820" elapsed="0.000891"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-17T03:25:39.772045" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:39.770850" elapsed="0.001308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:39.773116" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:39.772555" elapsed="0.000601"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:39.772222" elapsed="0.000987"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:39.770808" elapsed="0.002458"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:25:39.774889" 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-04-17T03:25:39.773537" elapsed="0.001461"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:25:39.775096" elapsed="0.000048"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:25:39.761888" elapsed="0.013523"/>
</kw>
<msg time="2026-04-17T03:25:39.775480" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:39.700015" elapsed="0.075540"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:25:39.790432" elapsed="0.000068"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:25:39.806764" elapsed="0.000079"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:25:39.821061" elapsed="0.000057"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:39.821370" 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-04-17T03:25:39.821566" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:39.822228" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:39.822004" elapsed="0.000480"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:39.821976" elapsed="0.000569"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:39.822755" 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-04-17T03:25:39.822963" 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-04-17T03:25:39.823142" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:25:39.821892" elapsed="0.001305"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:25:39.821660" elapsed="0.001568"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:39.823382" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:39.823465" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:25:39.823632" 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-04-17T03:25:39.696980" elapsed="0.126684"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:39.823859" elapsed="0.002465"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-17T03:25:39.827874" 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-04-17T03:25:39.827349" elapsed="0.000555"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-17T03:25:39.828366" level="INFO">${actual_normalized} = </msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-17T03:25:39.828095" elapsed="0.000297"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-04-17T03:25:39.829320" level="FAIL">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types: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-04-17T03:25:39.828657" elapsed="0.000805">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types: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-04-17T03:25:39.826800" elapsed="0.002818">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
  }
 ]
}
 != </status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:39.826422" elapsed="0.003265">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types: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-04-17T03:25:39.829887" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:39.829719" elapsed="0.000241"/>
</branch>
<status status="FAIL" start="2026-04-17T03:25:39.826400" elapsed="0.003584">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types: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-04-17T03:25:39.685224" elapsed="0.144882">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types: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-04-17T03:25:39.684264" elapsed="0.145988">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
  }
 ]
}
 != </status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:39.683887" elapsed="0.146446">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
  }
 ]
}
 != </status>
</branch>
<status status="FAIL" start="2026-04-17T03:25:39.683865" elapsed="0.146501">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
  }
 ]
}
 != </status>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-17T03:25:39.830418" elapsed="0.000048"/>
</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="FAIL" start="2026-04-17T03:25:38.926995" elapsed="0.903691">Several failures occurred:

1) ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))

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

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

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

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

6) {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
  }
 ]
}
 != </status>
</kw>
<doc>Verify empty data on neon</doc>
<status status="FAIL" start="2026-04-17T03:25:38.922467" elapsed="0.908371">Several failures occurred:

1) ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))

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

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

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

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

6) {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
  }
 ]
}
 != </status>
</kw>
<doc>Verfiy empty data response</doc>
<status status="FAIL" start="2026-04-17T03:25:38.922171" elapsed="0.908836">Several failures occurred:

1) ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))

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

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

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

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

6) {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
  }
 ]
}
 != </status>
</kw>
<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-04-17T03:25:41.900352" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:41.899491" elapsed="0.000904"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:41.901385" 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-04-17T03:25:41.900976" elapsed="0.000504">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-04-17T03:25:41.901651" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:41.900588" elapsed="0.001090"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:41.902427" 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-04-17T03:25:41.901854" elapsed="0.000607"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:25:41.902949" 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-04-17T03:25:41.903128" 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-04-17T03:25:41.902685" elapsed="0.000471"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:41.903667" 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-04-17T03:25:41.903328" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:41.905590" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:41.904864" elapsed="0.000872"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:25:41.906870" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:25:41.906085" elapsed="0.000886"/>
</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-04-17T03:25:41.907714" 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-04-17T03:25:41.908135" elapsed="0.000130"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:25:41.908528" elapsed="0.000071"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:25:41.907419" elapsed="0.001229"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:25:41.907068" elapsed="0.001656"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:25:41.908819" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:25:41.909169" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:25:41.904271" elapsed="0.004926"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:41.903796" elapsed="0.005435"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:41.909417" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:41.909258" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:41.903771" elapsed="0.005724"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:25:41.910277" 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-04-17T03:25:41.909647" elapsed="0.000660"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:25:41.910357" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:25:41.898695" elapsed="0.011791"/>
</kw>
<msg time="2026-04-17T03:25:41.910543" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:41.880811" elapsed="0.029800"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:25:41.924421" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_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-04-17T03:25:41.938060" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_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-04-17T03:25:41.952072" elapsed="0.000040"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:41.952324" 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-04-17T03:25:41.952517" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:41.952958" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:41.952782" elapsed="0.000234"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:41.952764" 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-04-17T03:25:41.953195" 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-04-17T03:25:41.953384" 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-04-17T03:25:41.953560" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:25:41.952726" elapsed="0.000887"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:25:41.952601" elapsed="0.001039"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:41.953792" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:41.953871" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:25:41.954046" 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-04-17T03:25:41.875770" elapsed="0.078305"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:41.955568" 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-04-17T03:25:41.955264" elapsed="0.000402">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-04-17T03:25:41.955785" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:41.954837" 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-04-17T03:25:41.956194" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:41.955884" elapsed="0.000369"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:41.956908" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:41.956568" elapsed="0.000383"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:41.956281" elapsed="0.000709"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:41.955865" elapsed="0.001147"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:41.959488" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:25:41.957175" elapsed="0.002340"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:25:41.959570" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:25:41.959731" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:25:41.954435" elapsed="0.005336"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:41.961207" 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-04-17T03:25:41.961000" elapsed="0.000262"/>
</kw>
<msg time="2026-04-17T03:25:41.961348" 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-04-17T03:25:41.960631" elapsed="0.000741"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-04-17T03:25:41.961583" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:41.961444" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:41.961425" elapsed="0.000225"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:25:41.961985" 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-04-17T03:25:41.962144" 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-04-17T03:25:41.961800" elapsed="0.000377"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-04-17T03:25:41.962620" 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-04-17T03:25:41.962355" elapsed="0.000299"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-04-17T03:25:41.962716" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:25:41.962915" 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-04-17T03:25:41.960197" elapsed="0.002764"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:41.964495" 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-04-17T03:25:41.964237" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:41.964966" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:41.964700" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:25:41.970678" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:42.172474" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:42.576229" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:42.579919" level="INFO">${response} = None</msg>
<msg time="2026-04-17T03:25:42.580083" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:25:41.967537" elapsed="0.616164">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:41.965078" elapsed="0.618815">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:42.584477" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:42.584104" elapsed="0.000478"/>
</branch>
<status status="FAIL" start="2026-04-17T03:25:41.965060" elapsed="0.619557">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:42.590314" 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-04-17T03:25:42.586564" elapsed="0.003799">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:42.586215" elapsed="0.004242">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:25:42.586184" elapsed="0.004319">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-04-17T03:25:42.594565" 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-04-17T03:25:42.590957" elapsed="0.003657">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:42.590603" elapsed="0.004103">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:25:42.590579" elapsed="0.004172">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:25:42.595717" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:25:42.595076" elapsed="0.000668"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:42.596084" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:42.595816" elapsed="0.000327"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:42.596659" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:42.596341" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:42.596168" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:42.595797" elapsed="0.000945"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:25:42.597305" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:25:42.596908" elapsed="0.000424"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:42.597650" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:42.597402" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:42.598215" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:42.597896" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:42.597731" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:42.597383" elapsed="0.000914"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:42.598458" elapsed="0.000357"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-17T03:25:42.599349" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:25:42.599008" elapsed="0.000367"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-04-17T03:25:42.601848" 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-04-17T03:25:42.599537" elapsed="0.002344">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of 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-04-17T03:25:42.585414" elapsed="0.016630">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>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:42.602296" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:42.602177" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:42.602157" elapsed="0.000214"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-17T03:25:42.604974" level="INFO">${text_normalized} = None</msg>
<msg time="2026-04-17T03:25:42.605005" level="FAIL">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="FAIL" start="2026-04-17T03:25:42.602525" elapsed="0.002508">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-17T03:25:42.605097" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:25:42.605331" level="INFO">${response_text} = None</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and 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-04-17T03:25:41.963294" elapsed="0.642064">Several failures occurred:

1) ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))

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

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

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

5) Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-17T03:25:42.605441" elapsed="0.000026"/>
</return>
<msg time="2026-04-17T03:25:42.605663" level="INFO">${response_text} = None</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${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-04-17T03:25:41.851605" elapsed="0.754086">Several failures occurred:

1) ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))

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

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

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

5) Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:42.681009" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:42.680078" elapsed="0.001022"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:42.682438" 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-04-17T03:25:42.682139" elapsed="0.000377">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-04-17T03:25:42.682709" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:42.681395" elapsed="0.001392"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:42.685070" 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-04-17T03:25:42.683559" elapsed="0.001638"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:25:42.686163" 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-04-17T03:25:42.686588" 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-04-17T03:25:42.685590" elapsed="0.001115"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:42.688060" 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-04-17T03:25:42.687141" elapsed="0.001148"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-17T03:25:42.689777" elapsed="0.000071"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:42.688607" elapsed="0.001312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:42.691460" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:42.690562" elapsed="0.000949"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:42.690035" elapsed="0.001551"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:42.688435" elapsed="0.003232"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:25:42.694284" 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-04-17T03:25:42.691998" elapsed="0.002472"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:25:42.694702" elapsed="0.000086"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:25:42.678277" elapsed="0.017437"/>
</kw>
<msg time="2026-04-17T03:25:42.695781" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:42.621086" elapsed="0.074963"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:25:42.709815" 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/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-04-17T03:25:42.724461" 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_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-04-17T03:25:42.737802" elapsed="0.000041"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:42.738103" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:42.738303" 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-04-17T03:25:42.738843" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:42.738678" elapsed="0.000445"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:42.738657" elapsed="0.000509"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:42.739372" 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-04-17T03:25:42.739616" elapsed="0.000029"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:42.739851" elapsed="0.000025"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:25:42.738611" elapsed="0.001301"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:25:42.738407" elapsed="0.001553"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:42.740120" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:42.740279" elapsed="0.000021"/>
</return>
<msg time="2026-04-17T03:25:42.740447" 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-04-17T03:25:42.618223" elapsed="0.122254"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:42.740670" elapsed="0.002713"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-17T03:25:42.744880" 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-04-17T03:25:42.744401" elapsed="0.000509"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-17T03:25:42.745334" level="INFO">${actual_normalized} = </msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-17T03:25:42.745093" elapsed="0.000268"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-04-17T03:25:42.746157" level="FAIL">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types: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-04-17T03:25:42.745524" elapsed="0.000711">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types: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-04-17T03:25:42.743852" elapsed="0.002536">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
  }
 ]
}
 != </status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:42.743491" elapsed="0.002993">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types: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-04-17T03:25:42.746688" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:42.746528" elapsed="0.000217"/>
</branch>
<status status="FAIL" start="2026-04-17T03:25:42.743466" elapsed="0.003302">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types: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-04-17T03:25:42.606944" elapsed="0.139947">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types: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-04-17T03:25:42.606067" elapsed="0.141285">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
  }
 ]
}
 != </status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:42.605793" elapsed="0.141671">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
  }
 ]
}
 != </status>
</branch>
<status status="FAIL" start="2026-04-17T03:25:42.605774" elapsed="0.141742">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
  }
 ]
}
 != </status>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-17T03:25:42.747584" elapsed="0.000049"/>
</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="FAIL" start="2026-04-17T03:25:41.843293" elapsed="0.904617">Several failures occurred:

1) ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))

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

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

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

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

6) {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
  }
 ]
}
 != </status>
</kw>
<doc>Verify empty data on neon</doc>
<status status="FAIL" start="2026-04-17T03:25:41.832766" elapsed="0.915384">Several failures occurred:

1) ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))

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

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

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

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

6) {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
  }
 ]
}
 != </status>
</kw>
<doc>Verfiy empty data response</doc>
<status status="FAIL" start="2026-04-17T03:25:41.831877" elapsed="0.916414">Several failures occurred:

1) ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))

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

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

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

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

6) {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
  }
 ]
}
 != </status>
</kw>
<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-04-17T03:25:44.817689" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:44.816789" elapsed="0.000944"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:44.818815" 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-04-17T03:25:44.818379" elapsed="0.000546">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-04-17T03:25:44.819117" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:44.817999" elapsed="0.001144"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:44.819810" 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-04-17T03:25:44.819330" elapsed="0.000509"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:25:44.820315" 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-04-17T03:25:44.820521" 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-04-17T03:25:44.820082" elapsed="0.000479"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:44.821315" 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-04-17T03:25:44.820794" 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-04-17T03:25:44.823823" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:44.822911" elapsed="0.001135"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:25:44.825517" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:25:44.824425" elapsed="0.001200"/>
</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-04-17T03:25:44.826562" elapsed="0.000092"/>
</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-04-17T03:25:44.827112" elapsed="0.000152"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:25:44.827594" elapsed="0.000086"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:25:44.826204" elapsed="0.001544"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:25:44.825746" elapsed="0.002097"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:25:44.827984" elapsed="0.000054"/>
</return>
<msg time="2026-04-17T03:25:44.828377" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:25:44.822094" elapsed="0.006385"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:44.821500" elapsed="0.007026"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:44.828792" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:44.828566" elapsed="0.000358"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:44.821463" elapsed="0.007516"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:25:44.830126" 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-04-17T03:25:44.829289" elapsed="0.000868"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:25:44.830208" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:25:44.815658" elapsed="0.014681"/>
</kw>
<msg time="2026-04-17T03:25:44.830398" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:44.797858" elapsed="0.032612"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:25:44.845280" elapsed="0.000061"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:25:44.858793" 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-04-17T03:25:44.872355" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:44.872607" 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-04-17T03:25:44.872821" 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-04-17T03:25:44.873376" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:44.873183" elapsed="0.000257"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:44.873165" 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-04-17T03:25:44.873620" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:44.873797" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:44.873987" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:25:44.873123" elapsed="0.000920"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:25:44.872974" elapsed="0.001096"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:44.874222" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:44.874393" elapsed="0.000021"/>
</return>
<msg time="2026-04-17T03:25:44.874557" 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-04-17T03:25:44.792409" elapsed="0.082177"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:44.876135" 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-04-17T03:25:44.875808" elapsed="0.000401">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-04-17T03:25:44.876307" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:44.875393" elapsed="0.000939"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:44.876724" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:44.876404" elapsed="0.000395"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:44.877408" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:44.877095" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:44.876831" elapsed="0.000642"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:44.876385" elapsed="0.001109"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:44.880085" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:25:44.877660" elapsed="0.002453"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:25:44.880168" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:25:44.880331" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:25:44.874985" elapsed="0.005371"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:44.881690" 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-04-17T03:25:44.881486" elapsed="0.000281"/>
</kw>
<msg time="2026-04-17T03:25:44.881880" 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-04-17T03:25:44.881100" elapsed="0.000806"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-04-17T03:25:44.882156" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:44.882012" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:44.881988" elapsed="0.000235"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:25:44.882543" 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-04-17T03:25:44.882702" 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-04-17T03:25:44.882373" elapsed="0.000354"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-04-17T03:25:44.883210" 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-04-17T03:25:44.882889" elapsed="0.000360"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-04-17T03:25:44.883308" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:25:44.883471" 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-04-17T03:25:44.880674" elapsed="0.002821"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:44.885152" 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-04-17T03:25:44.884817" elapsed="0.000408"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:44.885713" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:44.885422" elapsed="0.000347"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:25:44.891806" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:45.093848" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:45.497231" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:45.499913" level="INFO">${response} = None</msg>
<msg time="2026-04-17T03:25:45.500051" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:25:44.888669" elapsed="0.614807">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:44.885915" elapsed="0.617741">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:45.504141" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:45.503743" elapsed="0.000546"/>
</branch>
<status status="FAIL" start="2026-04-17T03:25:44.885889" elapsed="0.618448">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:45.510128" 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-04-17T03:25:45.506739" elapsed="0.003443">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:45.506260" elapsed="0.004024">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:25:45.506219" elapsed="0.004111">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-04-17T03:25:45.514282" 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-04-17T03:25:45.510767" elapsed="0.003565">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:45.510436" elapsed="0.003985">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:25:45.510412" elapsed="0.004054">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:25:45.515412" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:25:45.514784" elapsed="0.000667"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:45.515898" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:45.515549" elapsed="0.000454"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:45.516751" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:45.516276" elapsed="0.000513"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:45.516038" elapsed="0.000799"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:45.515523" elapsed="0.001345"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:25:45.517644" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:25:45.517115" elapsed="0.000567"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:45.518128" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:45.517777" elapsed="0.000502"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:45.518992" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:45.518555" elapsed="0.000472"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:45.518316" elapsed="0.000758"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:45.517751" elapsed="0.001352"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:45.519327" elapsed="0.000480"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-17T03:25:45.520498" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:25:45.520058" elapsed="0.000473"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-04-17T03:25:45.523618" 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-04-17T03:25:45.520730" elapsed="0.002938">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of 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-04-17T03:25:45.505277" elapsed="0.018618">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>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:45.524212" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:45.524049" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:45.524018" elapsed="0.000298"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-17T03:25:45.527895" level="INFO">${text_normalized} = None</msg>
<msg time="2026-04-17T03:25:45.527969" level="FAIL">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="FAIL" start="2026-04-17T03:25:45.524577" elapsed="0.003436">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-17T03:25:45.528116" elapsed="0.000048"/>
</return>
<msg time="2026-04-17T03:25:45.528542" level="INFO">${response_text} = None</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and 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-04-17T03:25:44.883838" elapsed="0.644742">Several failures occurred:

1) ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))

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

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

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

5) Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-17T03:25:45.528695" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:25:45.529027" level="INFO">${response_text} = None</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${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-04-17T03:25:44.765450" elapsed="0.763617">Several failures occurred:

1) ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))

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

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

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

5) Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<kw name="Verify_Response_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:45.616016" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_ipv4/empty_route.vanadium/data.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:45.615002" elapsed="0.001106"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:45.617898" 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-04-17T03:25:45.617562" elapsed="0.000436">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-04-17T03:25:45.618193" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:45.616532" elapsed="0.001740"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:45.619511" 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-04-17T03:25:45.618551" elapsed="0.001044"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:25:45.620287" 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-04-17T03:25:45.620629" 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-04-17T03:25:45.619901" elapsed="0.000812"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:45.621648" 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-04-17T03:25:45.621014" elapsed="0.000808"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-17T03:25:45.622868" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:45.622036" elapsed="0.000954"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:45.623948" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:45.623376" elapsed="0.000611"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:45.623054" elapsed="0.000984"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:45.621918" elapsed="0.002178"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:25:45.625470" 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-04-17T03:25:45.624379" elapsed="0.001195"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:25:45.625677" 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/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-04-17T03:25:45.613167" elapsed="0.012819"/>
</kw>
<msg time="2026-04-17T03:25:45.626046" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:45.546966" elapsed="0.079150"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:25:45.639827" elapsed="0.000054"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:25:45.654180" elapsed="0.000068"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:25:45.668097" elapsed="0.000057"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:45.668551" 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-04-17T03:25:45.668768" 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-04-17T03:25:45.669348" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:45.669154" elapsed="0.000435"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:45.669134" elapsed="0.000490"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:45.669783" 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-04-17T03:25:45.669991" 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-04-17T03:25:45.670190" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:25:45.669088" elapsed="0.001159"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:25:45.668866" elapsed="0.001409"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:45.670431" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:45.670513" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:25:45.670681" 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-04-17T03:25:45.543847" elapsed="0.126864"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${expected_text}""" == """${EMPTY}"""</arg>
<arg>BuiltIn.Should_Be_Equal</arg>
<arg>${EMPTY}</arg>
<arg>${response}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:45.670900" elapsed="0.002436"/>
</kw>
<if>
<branch type="IF" condition="${normalize_json}">
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-17T03:25:45.674776" 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-04-17T03:25:45.674293" elapsed="0.000512"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-17T03:25:45.675247" level="INFO">${actual_normalized} = </msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-17T03:25:45.675006" elapsed="0.000268"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-04-17T03:25:45.676042" level="FAIL">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types: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-04-17T03:25:45.675434" elapsed="0.000686">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types: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-04-17T03:25:45.673701" elapsed="0.002614">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
  }
 ]
}
 != </status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:45.673417" elapsed="0.002971">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types: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-04-17T03:25:45.676575" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:45.676420" elapsed="0.000210"/>
</branch>
<status status="FAIL" start="2026-04-17T03:25:45.673398" elapsed="0.003255">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types: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-04-17T03:25:45.530875" elapsed="0.145900">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types: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-04-17T03:25:45.529633" elapsed="0.147284">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
  }
 ]
}
 != </status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:45.529221" elapsed="0.147849">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
  }
 ]
}
 != </status>
</branch>
<status status="FAIL" start="2026-04-17T03:25:45.529192" elapsed="0.147912">{
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
  }
 ]
}
 != </status>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-17T03:25:45.677154" elapsed="0.000029"/>
</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="FAIL" start="2026-04-17T03:25:44.754417" elapsed="0.922954">Several failures occurred:

1) ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))

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

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

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

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

6) {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
  }
 ]
}
 != </status>
</kw>
<doc>Verify empty data on neon</doc>
<status status="FAIL" start="2026-04-17T03:25:44.749456" elapsed="0.928071">Several failures occurred:

1) ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))

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

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

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

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

6) {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
  }
 ]
}
 != </status>
</kw>
<doc>Verfiy empty data response</doc>
<status status="FAIL" start="2026-04-17T03:25:44.748910" elapsed="0.928753">Several failures occurred:

1) ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))

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

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

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

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

6) {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
  }
 ]
}
 != </status>
</kw>
<msg time="2026-04-17T03:25:45.677790" level="FAIL">Keyword 'Verify_Empty_Reported_Data' failed after retrying 3 times. The last error was: Several failures occurred:

1) ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))

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

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

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

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

6) {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
  }
 ]
}
 != </msg>
<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="FAIL" start="2026-04-17T03:25:38.921717" elapsed="6.756191">Keyword 'Verify_Empty_Reported_Data' failed after retrying 3 times. The last error was: Several failures occurred:

1) ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))

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

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

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

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

6) {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
  }
 ]
}
 != </status>
</kw>
<doc>Testcse teardown with data verification</doc>
<status status="FAIL" start="2026-04-17T03:25:38.832557" elapsed="6.845511">Keyword 'Verify_Empty_Reported_Data' failed after retrying 3 times. The last error was: Several failures occurred:

1) ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))

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

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

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

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

6) {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
  }
 ]
}
 != </status>
</kw>
<doc>Testing mpls vpn ipv4 routes reported to odl from exabgp</doc>
<status status="FAIL" start="2026-04-17T03:25:32.466327" elapsed="13.211854">Setup failed:
Keyword 'Verify_Empty_Reported_Data' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))

Also teardown failed:
Keyword 'Verify_Empty_Reported_Data' failed after retrying 3 times. The last error was: Several failures occurred:

1) ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))

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

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

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

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

6) {
 "bgp-rib:tables": [
  {
   "afi": "bgp-types:ipv4-address-family",
   "attributes": {
    "uptodate": "*"
   },
   "safi": "bgp-types:mpls-labeled-vpn-subsequent-address-family"
  }
 ]
}
 != </status>
</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-04-17T03:25:45.682012" elapsed="0.000237"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:25:45.681724" elapsed="0.000610"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:25:45.683556" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:45.683421" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:45.683395" 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-04-17T03:25:45.691033" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:45.690868" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:45.690845" elapsed="0.000285"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:45.692720" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:25:45.692135" elapsed="0.000624"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:25:45.693559" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:25:45.693158" elapsed="0.000438"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:25:45.693650" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:25:45.693862" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:25:45.691457" elapsed="0.002436"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:25:45.700306" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:45.700133" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:45.700113" elapsed="0.000265"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:25:45.701615" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:45.701507" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:45.701488" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:25:45.702179" level="INFO">${karaf_connection_index} = 18</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:25:45.701837" elapsed="0.000371"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:45.702604" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:25:45.702379" elapsed="0.000251"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:25:45.703534" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:25:45.703236" elapsed="0.001088">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:25:45.704563" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:25:45.704622" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:45.702816" elapsed="0.001837"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:25:45.705657" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:25:45.705362" elapsed="0.001096">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:25:45.706649" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:25:45.706761" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:45.704884" elapsed="0.001903"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:25:45.707919" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Start_Play"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:25:45.707132" elapsed="0.000888">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Start_Play"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:45.706867" elapsed="0.001245">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Start_Play"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:25:45.706847" elapsed="0.001586">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Start_Play"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:45.708621" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:45.708860" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:45.708710" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:45.708693" elapsed="0.000263"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:25:45.708992" elapsed="0.000018"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:25:45.711859" elapsed="0.000175"/>
</kw>
<msg time="2026-04-17T03:25:45.712105" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:45.710533" 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-04-17T03:25:45.712591" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:45.712986" 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-04-17T03:25:45.709874" elapsed="0.003308"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:25:45.709302" elapsed="0.003947"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:25:45.701194" elapsed="0.012143">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Start_Play"</status>
</kw>
<msg time="2026-04-17T03:25:45.713446" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:25:45.713489" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Start_Play"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:45.700543" elapsed="0.012970"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:25:45.713709" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:45.713594" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:45.713575" elapsed="0.000200"/>
</if>
<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-04-17T03:25:45.714625" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:45.714516" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:45.714496" elapsed="0.000198"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:45.715069" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:25:45.715181" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:25:45.714861" elapsed="0.000348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:45.715667" level="INFO">{1: 18}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:45.715372" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:45.716170" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:45.715891" elapsed="0.000352"/>
</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-04-17T03:25:45.716841" elapsed="0.000292"/>
</kw>
<msg time="2026-04-17T03:25:45.717243" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:25:45.717293" level="INFO">${old_connection_index} = 18</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:45.716414" elapsed="0.000903"/>
</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-04-17T03:25:45.718237" elapsed="0.000201"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:25:45.719841" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:25:45.719339" elapsed="0.001561">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:45.718706" elapsed="0.002315"/>
</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-04-17T03:25:45.721676" elapsed="0.000334"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:45.721203" elapsed="0.000918"/>
</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-04-17T03:25:45.717691" elapsed="0.004483"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:45.717412" elapsed="0.004816"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:45.717384" elapsed="0.004878"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:25:45.723318" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:25:45.722914" elapsed="0.000432"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:25:45.723401" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:25:45.723573" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:25:45.722543" elapsed="0.001055"/>
</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-04-17T03:25:45.723766" elapsed="0.000554"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:45.724648" level="INFO">index=19
host=10.30.170.120
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-04-17T03:25:45.724754" level="INFO">${karaf_connection_object} = index=19
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:25:45.724515" elapsed="0.000265"/>
</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-04-17T03:25:45.724954" elapsed="0.002673"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:25:45.728134" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:25:45.729546" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:25:45.727836" elapsed="0.002170">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:25:45.746295" elapsed="0.000416"/>
</kw>
<msg time="2026-04-17T03:25:45.746820" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:45.744518" elapsed="0.002484"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:45.747198" elapsed="0.000027"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:45.747390" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:25:45.731095" elapsed="0.016385"/>
</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-04-17T03:25:45.730369" elapsed="0.017165"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:25:45.714212" elapsed="0.033422">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:45.748100" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:25:45.748214" 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="FAIL" start="2026-04-17T03:25:45.699728" elapsed="0.048611">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:25:45.748458" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:25:45.748503" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:45.694331" elapsed="0.054195"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:45.748983" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:45.748687" elapsed="0.000352"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:45.748665" elapsed="0.000399"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:25:45.694170" elapsed="0.054919"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:25:45.693976" elapsed="0.055149"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:25:45.690368" elapsed="0.058820"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:25:45.683076" elapsed="0.066173"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:45.682538" elapsed="0.066758"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:25:45.679487" elapsed="0.069866"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-04-17T03:25:45.763608" 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-04-17T03:25:45.749529" elapsed="0.014207"/>
</kw>
<kw name="Assure_Library_Ipaddr" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:25:45.766124" level="INFO">Executing command 'bash -c 'cd "." &amp;&amp; python -c "import ipaddr"''.</msg>
<msg time="2026-04-17T03:25:45.799174" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:25:45.799555" level="INFO">${stdout} = </msg>
<msg time="2026-04-17T03:25:45.799659" level="INFO">${stderr} = </msg>
<msg time="2026-04-17T03:25:45.799756" 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-04-17T03:25:45.765807" elapsed="0.034004"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:25:45.802167" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-04-17T03:25:45.801450" elapsed="0.000830"/>
</kw>
<msg time="2026-04-17T03:25:45.802509" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-04-17T03:25:45.802613" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:45.800482" elapsed="0.002189"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:45.804316" 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-04-17T03:25:45.803117" elapsed="0.001279"/>
</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-04-17T03:25:45.805187" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:45.804605" elapsed="0.000675"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:45.804549" elapsed="0.000767"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-04-17T03:25:45.805536" elapsed="0.000047"/>
</return>
<status status="PASS" start="2026-04-17T03:25:45.805394" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:45.805372" elapsed="0.000290"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-04-17T03:25:45.805786" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:45.805738" elapsed="0.000101"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:45.805718" elapsed="0.000150"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:45.806093" elapsed="0.000031"/>
</kw>
<msg time="2026-04-17T03:25:45.806312" 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-04-17T03:25:45.765145" elapsed="0.041202"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-04-17T03:25:45.806570" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-04-17T03:25:45.806445" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:45.806421" elapsed="0.000253"/>
</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-04-17T03:25:45.806888" elapsed="0.000029"/>
</kw>
<arg>target_dir=.</arg>
<doc>Tests whether ipaddr module is present on ssh-connected machine, Puts ipaddr.py to target_dir if not.</doc>
<status status="PASS" start="2026-04-17T03:25:45.764308" elapsed="0.042719"/>
</kw>
<kw name="Read" owner="SSHLibrary">
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-04-17T03:25:45.807245" elapsed="0.000182"/>
</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-04-17T03:25:45.810309" level="INFO">${command} = python3 play.py --amount 0 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --peerport=1790 --debug --allf --wfr 1 &amp;&gt; play.py.out</msg>
<var>${command}</var>
<arg>python3 play.py ${arguments} &amp;&gt; ${BGPSpeaker__OUTPUT_LOG}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:45.809812" elapsed="0.000619"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:45.811051" level="INFO">python3 play.py --amount 0 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --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-04-17T03:25:45.810668" elapsed="0.000450"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:25:45.835038" level="INFO">python3 play.py --amount 0 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --peerport=1790 --debug --allf --wfr 1 &amp;&gt; play.py.out</msg>
<msg time="2026-04-17T03:25:45.835258" level="INFO">${output} = python3 play.py --amount 0 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --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-04-17T03:25:45.811342" elapsed="0.023947"/>
</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-04-17T03:25:45.809175" elapsed="0.026222"/>
</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-04-17T03:25:51.838049" 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-04-17T03:25:45.837420" elapsed="6.001452">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-04-17T03:25:51.839236" 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-04-17T03:25:45.837119" elapsed="6.002294">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-04-17T03:25:45.836651" elapsed="6.002924"/>
</kw>
<msg time="2026-04-17T03:25:51.839707" 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-04-17T03:25:45.836206" elapsed="6.003527"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-04-17T03:25:51.839936" elapsed="0.000049"/>
</return>
<status status="PASS" start="2026-04-17T03:25:51.839833" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:51.839805" elapsed="0.000241"/>
</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-04-17T03:25:51.840294" elapsed="0.000028"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was seen but it was not expected yet</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:51.840482" elapsed="0.000026"/>
</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-04-17T03:25:45.835787" elapsed="6.004789"/>
</kw>
<doc>Starts bgp peer and verifies that the peer runs.</doc>
<status status="PASS" start="2026-04-17T03:25:45.808279" elapsed="6.032360"/>
</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-04-17T03:25:45.807653" elapsed="6.033032"/>
</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-04-17T03:25:45.678677" elapsed="6.162150"/>
</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-04-17T03:25:51.844650" elapsed="0.000349"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:25:51.844374" elapsed="0.000685"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:25:51.846225" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:51.846070" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:51.846048" elapsed="0.000247"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:25:51.851932" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:51.851791" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:51.851771" elapsed="0.000253"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:51.853208" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:25:51.852703" elapsed="0.000535"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:25:51.853789" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:25:51.853469" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:25:51.853861" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:25:51.854063" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:25:51.852303" elapsed="0.001786"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:25:51.860233" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:51.860121" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:51.860100" elapsed="0.000202"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:25:51.861575" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:51.861465" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:51.861447" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:25:51.862208" level="INFO">${karaf_connection_index} = 19</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:25:51.861828" elapsed="0.000408"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:51.862635" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:25:51.862407" elapsed="0.000254"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:25:51.863553" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:25:51.863272" elapsed="0.001014">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:25:51.864484" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:25:51.864530" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:51.862837" elapsed="0.001717"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:25:51.865371" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:25:51.865115" elapsed="0.000979">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:25:51.866289" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:25:51.866335" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:51.864727" elapsed="0.001631"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:25:51.867598" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Play_To_Odl_rt_constrain_type_0"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:25:51.866668" elapsed="0.000994">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Play_To_Odl_rt_constrain_type_0"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:51.866435" elapsed="0.001302">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Play_To_Odl_rt_constrain_type_0"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:25:51.866415" elapsed="0.001357">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Play_To_Odl_rt_constrain_type_0"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:51.867982" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:51.868227" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:51.868077" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:51.868058" elapsed="0.000244"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:25:51.868336" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:25:51.871181" elapsed="0.000175"/>
</kw>
<msg time="2026-04-17T03:25:51.871434" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:51.869999" 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-04-17T03:25:51.871859" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:51.872287" 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-04-17T03:25:51.869280" 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-04-17T03:25:51.868643" elapsed="0.003900"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:25:51.861154" elapsed="0.011476">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Play_To_Odl_rt_constrain_type_0"</status>
</kw>
<msg time="2026-04-17T03:25:51.872735" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:25:51.872779" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Play_To_Odl_rt_constrain_type_0"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:51.860460" elapsed="0.012386"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:25:51.873096" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:51.872942" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:51.872914" elapsed="0.000253"/>
</if>
<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-04-17T03:25:51.874024" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:51.873884" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:51.873863" elapsed="0.000229"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:51.874383" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:25:51.874491" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:25:51.874253" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:51.874959" level="INFO">{1: 19}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:51.874675" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:51.875431" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:51.875182" elapsed="0.000296"/>
</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-04-17T03:25:51.876156" elapsed="0.000274"/>
</kw>
<msg time="2026-04-17T03:25:51.876531" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:25:51.876579" level="INFO">${old_connection_index} = 19</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:51.875686" elapsed="0.000916"/>
</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-04-17T03:25:51.877496" elapsed="0.000202"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:25:51.878964" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:25:51.878489" elapsed="0.001442">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:51.877982" elapsed="0.002112"/>
</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-04-17T03:25:51.880747" elapsed="0.000337"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:51.880271" elapsed="0.000900"/>
</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-04-17T03:25:51.876955" elapsed="0.004262"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:51.876695" elapsed="0.004569"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:51.876671" elapsed="0.004619"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:25:51.882223" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:25:51.881842" elapsed="0.000411"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:25:51.882301" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:25:51.882456" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:25:51.881505" elapsed="0.000975"/>
</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-04-17T03:25:51.882642" elapsed="0.000478"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:51.883597" level="INFO">index=20
host=10.30.170.120
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-04-17T03:25:51.883704" level="INFO">${karaf_connection_object} = index=20
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:25:51.883300" elapsed="0.000431"/>
</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-04-17T03:25:51.883959" elapsed="0.002511"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:25:51.886918" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:25:51.888434" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:25:51.886640" elapsed="0.002255">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:25:51.903869" elapsed="0.000465"/>
</kw>
<msg time="2026-04-17T03:25:51.904438" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:51.902448" elapsed="0.002153"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:51.904776" elapsed="0.000034"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:51.904958" elapsed="0.000077"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:25:51.890181" elapsed="0.014921"/>
</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-04-17T03:25:51.889524" elapsed="0.015628"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:25:51.873582" elapsed="0.031662">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:51.905649" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:25:51.905727" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:25:51.859718" elapsed="0.046125">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:25:51.905962" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:25:51.906176" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:51.854722" elapsed="0.051480"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:51.906559" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:51.906290" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:51.906268" elapsed="0.000369"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:25:51.854563" elapsed="0.052099"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:25:51.854333" elapsed="0.052364"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:25:51.851394" elapsed="0.055364"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:25:51.845692" elapsed="0.061124"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:51.845222" elapsed="0.061642"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:25:51.841898" elapsed="0.065020"/>
</kw>
<kw name="Play_To_Odl_Non_Removal_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:25:51.907780" 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-04-17T03:25:51.908242" 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-04-17T03:25:51.907570" elapsed="0.000701"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-04-17T03:25:51.908426" elapsed="0.003325"/>
</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-04-17T03:25:51.911944" elapsed="0.002559"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:25:51.915404" 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-04-17T03:25:51.914779" elapsed="0.000664"/>
</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-04-17T03:25:51.971358" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:51.970916" elapsed="0.000479"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:51.972379" 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-04-17T03:25:51.972099" elapsed="0.000358">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-04-17T03:25:51.972556" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:51.971670" elapsed="0.000912"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:51.973208" 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-04-17T03:25:51.972756" elapsed="0.000481"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:25:51.973556" 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-04-17T03:25:51.973720" 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-04-17T03:25:51.973408" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:51.974190" 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-04-17T03:25:51.973913" elapsed="0.000326"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:51.975571" 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-04-17T03:25:51.975247" elapsed="0.000371"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:25:51.976156" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:25:51.975785" elapsed="0.000397"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:25:51.977071" 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-04-17T03:25:51.976598" elapsed="0.000507"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:25:51.978389" 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-04-17T03:25:51.977799" elapsed="0.000691"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:25:51.978574" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:25:51.978913" 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-04-17T03:25:51.977326" elapsed="0.001625"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:25:51.979144" elapsed="0.000416"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-04-17T03:25:51.976428" elapsed="0.003174"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:25:51.980519" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:25:51.980053" elapsed="0.000492"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:25:51.981794" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:25:51.981233" elapsed="0.000663"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:25:51.981996" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:25:51.982298" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:25:51.980742" 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-04-17T03:25:51.982485" elapsed="0.000379"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:25:51.979718" elapsed="0.003192"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:25:51.976238" elapsed="0.006711"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:25:51.983010" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:25:51.983170" 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-04-17T03:25:51.974697" elapsed="0.008498"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:51.974318" elapsed="0.008909"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:51.983410" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:51.983253" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:51.974294" elapsed="0.009193"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:25:51.984325" 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-04-17T03:25:51.983688" elapsed="0.000672"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:25:51.984467" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:25:51.970197" elapsed="0.014402"/>
</kw>
<msg time="2026-04-17T03:25:51.984657" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:51.956230" elapsed="0.028479"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:25:51.998429" elapsed="0.000042"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_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-04-17T03:25:52.011690" elapsed="0.000036"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_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-04-17T03:25:52.025089" elapsed="0.000042"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:52.025358" 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-04-17T03:25:52.025600" 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-04-17T03:25:52.026197" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:52.025961" elapsed="0.000387"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:52.025936" elapsed="0.000450"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:52.026594" 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-04-17T03:25:52.026785" 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-04-17T03:25:52.026961" elapsed="0.000044"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:25:52.025882" elapsed="0.001158"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:25:52.025715" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:52.027220" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:52.027301" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:25:52.027469" 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-04-17T03:25:51.951797" elapsed="0.075702"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:52.029141" 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-04-17T03:25:52.028774" elapsed="0.000445">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-04-17T03:25:52.029330" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:52.028367" 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-04-17T03:25:52.029701" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:52.029429" elapsed="0.000332"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:52.030301" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:52.029999" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:52.029786" elapsed="0.000577"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:52.029410" elapsed="0.000975"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:52.033071" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:25:52.030574" elapsed="0.002525"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:25:52.033151" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:25:52.033312" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:25:52.027994" elapsed="0.005342"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:52.034735" 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-04-17T03:25:52.034420" elapsed="0.000381">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-04-17T03:25:52.034896" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:52.034006" elapsed="0.000915"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:25:52.035149" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:25:52.035012" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:52.034993" elapsed="0.000240"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:52.035384" 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-04-17T03:25:52.035570" elapsed="0.000029"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:25:52.035646" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:25:52.037623" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:25:52.033653" elapsed="0.004001"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:52.039168" 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-04-17T03:25:52.038875" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:52.039697" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:52.039374" elapsed="0.000369"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:25:52.045683" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:52.250118" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:52.652551" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:52.655495" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:25:52.042270" elapsed="0.619461">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:52.039835" elapsed="0.622241">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:52.662667" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:52.662177" elapsed="0.000655"/>
</branch>
<status status="FAIL" start="2026-04-17T03:25:52.039813" elapsed="0.623077">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:52.663558" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:52.663758" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:52.663703" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:52.663675" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:52.664093" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:25:52.664195" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:25:52.038001" elapsed="0.626353">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:52.664463" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:25:51.928312" elapsed="0.736292">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:52.665356" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:52.664738" elapsed="0.000740"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:52.664714" elapsed="0.000810"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:52.665582" elapsed="0.000022"/>
</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-04-17T03:25:51.922252" elapsed="0.743481">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:54.726081" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:54.725563" elapsed="0.000556"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:54.727006" 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-04-17T03:25:54.726696" elapsed="0.000420">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-04-17T03:25:54.727226" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:54.726312" elapsed="0.000940"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:54.727866" 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-04-17T03:25:54.727462" elapsed="0.000432"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:25:54.728263" 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-04-17T03:25:54.728477" 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-04-17T03:25:54.728092" elapsed="0.000416"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:54.728981" 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-04-17T03:25:54.728678" 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-04-17T03:25:54.730392" 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-04-17T03:25:54.729978" elapsed="0.000462"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:25:54.730934" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:25:54.730627" elapsed="0.000373"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:25:54.731853" 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-04-17T03:25:54.731422" elapsed="0.000459"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:25:54.733410" 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-04-17T03:25:54.732615" elapsed="0.000903"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:25:54.733602" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:25:54.733916" 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-04-17T03:25:54.732105" elapsed="0.001860"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:25:54.734133" elapsed="0.000408"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-04-17T03:25:54.731259" elapsed="0.003327"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:25:54.735353" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:25:54.734845" elapsed="0.000538"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:25:54.736798" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:25:54.736103" elapsed="0.000805"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:25:54.737012" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:25:54.737316" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:25:54.735607" elapsed="0.001735"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:25:54.737514" elapsed="0.000452"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:25:54.734703" elapsed="0.003391"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:25:54.731071" elapsed="0.007063"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:25:54.738179" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:25:54.738347" 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-04-17T03:25:54.729562" elapsed="0.008811"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:54.729132" elapsed="0.009275"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:54.738593" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:54.738435" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:54.729107" elapsed="0.009584"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:25:54.739594" 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-04-17T03:25:54.738862" elapsed="0.000764"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:25:54.739677" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:25:54.724769" elapsed="0.015038"/>
</kw>
<msg time="2026-04-17T03:25:54.739865" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:54.710666" elapsed="0.029260"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:25:54.753704" elapsed="0.000074"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:25:54.767819" 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/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-04-17T03:25:54.781441" elapsed="0.000041"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:54.781716" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:54.781907" 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-04-17T03:25:54.782433" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:54.782260" elapsed="0.000232"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:54.782236" elapsed="0.000282"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:54.782668" 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-04-17T03:25:54.782878" 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-04-17T03:25:54.783117" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:25:54.782190" elapsed="0.001079"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:25:54.782016" elapsed="0.001285"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:54.783504" elapsed="0.000027"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:54.783596" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:25:54.783766" 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-04-17T03:25:54.705888" elapsed="0.077908"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:54.785285" 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-04-17T03:25:54.784988" elapsed="0.000373">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-04-17T03:25:54.785460" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:54.784560" elapsed="0.000928"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:54.785858" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:54.785581" elapsed="0.000338"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:54.786523" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:54.786158" elapsed="0.000391"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:54.785948" elapsed="0.000638"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:54.785560" elapsed="0.001048"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:54.791420" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:25:54.786813" elapsed="0.004639"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:25:54.791513" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:25:54.791720" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:25:54.784189" elapsed="0.007563"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:54.793291" 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-04-17T03:25:54.793008" elapsed="0.000362">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-04-17T03:25:54.793508" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:54.792616" elapsed="0.000920"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:25:54.793760" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:25:54.793615" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:54.793595" elapsed="0.000250"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:54.794024" 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-04-17T03:25:54.794202" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:25:54.794268" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:25:54.796411" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:25:54.792200" elapsed="0.004252"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:54.798017" 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-04-17T03:25:54.797706" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:54.798602" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:54.798299" elapsed="0.000356"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:25:54.804113" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:55.009279" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:55.414551" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:55.417285" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:25:54.801011" elapsed="0.621889">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:54.798729" elapsed="0.624503">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:55.423891" elapsed="0.000116"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:55.423375" elapsed="0.000780"/>
</branch>
<status status="FAIL" start="2026-04-17T03:25:54.798709" elapsed="0.625528">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:55.425342" elapsed="0.000064"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:55.425773" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:55.425676" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:55.425628" elapsed="0.000309"/>
</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-04-17T03:25:55.426185" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:25:55.426258" 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-04-17T03:25:54.796792" elapsed="0.629593">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:55.426466" 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-04-17T03:25:54.681049" elapsed="0.745522">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:55.426935" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:55.426731" elapsed="0.000294"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:55.426712" elapsed="0.000338"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:55.427083" elapsed="0.000015"/>
</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-04-17T03:25:54.674772" elapsed="0.752416">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:57.486498" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:57.486022" elapsed="0.000511"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:57.487386" 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-04-17T03:25:57.487109" elapsed="0.000358">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-04-17T03:25:57.487568" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:57.486721" elapsed="0.000872"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:57.488260" 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-04-17T03:25:57.487768" elapsed="0.000529"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:25:57.488622" 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-04-17T03:25:57.488793" 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-04-17T03:25:57.488472" elapsed="0.000349"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:57.489270" 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-04-17T03:25:57.489011" elapsed="0.000318"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:57.490693" 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-04-17T03:25:57.490352" elapsed="0.000387"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:25:57.491259" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:25:57.490908" elapsed="0.000379"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:25:57.492349" 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-04-17T03:25:57.491786" elapsed="0.000591"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:25:57.493873" 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-04-17T03:25:57.493241" elapsed="0.000754"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:25:57.494105" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:25:57.494426" 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-04-17T03:25:57.492651" elapsed="0.001802"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:25:57.494640" elapsed="0.000476"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-04-17T03:25:57.491588" elapsed="0.003574"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:25:57.495986" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:25:57.495426" elapsed="0.000675"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:25:57.497784" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:25:57.497121" elapsed="0.000779"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:25:57.498002" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:25:57.498363" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:25:57.496556" elapsed="0.001834"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:25:57.498556" elapsed="0.000465"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:25:57.495283" elapsed="0.003784"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:25:57.491345" elapsed="0.007759"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:25:57.499149" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:25:57.499316" 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-04-17T03:25:57.489887" elapsed="0.009454"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:57.489451" elapsed="0.009923"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:57.499562" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:57.499401" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:57.489414" elapsed="0.010227"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:25:57.500551" 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-04-17T03:25:57.499815" elapsed="0.000767"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:25:57.500632" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:25:57.485157" elapsed="0.015615"/>
</kw>
<msg time="2026-04-17T03:25:57.500834" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:57.470887" elapsed="0.030002"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:25:57.514693" elapsed="0.000064"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:25:57.528807" elapsed="0.000069"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:25:57.542000" elapsed="0.000063"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:57.542323" 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-04-17T03:25:57.542528" 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-04-17T03:25:57.543129" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:57.542942" elapsed="0.000244"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:57.542920" elapsed="0.000316"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:57.543407" 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-04-17T03:25:57.543598" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:57.543771" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:25:57.542882" elapsed="0.000944"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:25:57.542739" elapsed="0.001114"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:57.544024" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:57.544107" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:25:57.544273" 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-04-17T03:25:57.466003" elapsed="0.078300"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:57.545825" 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-04-17T03:25:57.545515" elapsed="0.000390">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-04-17T03:25:57.546025" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:57.545097" elapsed="0.000954"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:57.546400" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:57.546125" elapsed="0.000333"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:57.547016" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:57.546687" elapsed="0.000357"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:57.546484" elapsed="0.000596"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:57.546106" elapsed="0.000995"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:57.549979" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:25:57.547259" elapsed="0.002750"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:25:57.550066" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:25:57.550238" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:25:57.544700" elapsed="0.005564"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:57.551698" 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-04-17T03:25:57.551362" elapsed="0.000419">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-04-17T03:25:57.551882" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:57.550993" elapsed="0.000913"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:25:57.552147" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:25:57.552002" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:57.551980" elapsed="0.000253"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:57.552389" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:57.552645" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:25:57.552712" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:25:57.554737" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:25:57.550607" elapsed="0.004157"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:57.556652" 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-04-17T03:25:57.556209" elapsed="0.000525"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:57.557392" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:57.557021" elapsed="0.000436"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:25:57.563639" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:57.767091" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:58.172751" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:58.175713" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:25:57.560541" elapsed="0.619273">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:57.557556" elapsed="0.622469">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:58.180484" elapsed="0.000091"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:58.180113" elapsed="0.000533"/>
</branch>
<status status="FAIL" start="2026-04-17T03:25:57.557530" elapsed="0.623153">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:58.181415" elapsed="0.000042"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:58.181664" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:58.181594" elapsed="0.000139"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:58.181549" elapsed="0.000215"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:58.182046" elapsed="0.000036"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:25:58.182154" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:25:57.555147" elapsed="0.627174">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:58.182514" elapsed="0.000026"/>
</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-04-17T03:25:57.440109" elapsed="0.742613">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:58.183192" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:58.182892" elapsed="0.000404"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:58.182866" elapsed="0.000837"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:58.183755" elapsed="0.000021"/>
</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-04-17T03:25:57.432500" elapsed="0.751403">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:25:58.184083" level="FAIL">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-17T03:25:51.915683" elapsed="6.268551">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<arg>rt_constrain_type_0</arg>
<arg>${RT_CONSTRAIN_DIR}</arg>
<status status="FAIL" start="2026-04-17T03:25:51.907178" elapsed="6.277222">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:25:51.841127" elapsed="6.343596">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:25:58.188638" elapsed="0.000373"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:25:58.188344" elapsed="0.000728"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:25:58.190254" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:58.190122" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:58.190101" elapsed="0.000253"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:25:58.196627" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:58.196468" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:58.196441" elapsed="0.000285"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:58.198356" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:25:58.197674" elapsed="0.000717"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:25:58.199042" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:25:58.198615" elapsed="0.000463"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:25:58.199132" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:25:58.199306" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:25:58.197129" elapsed="0.002202"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:25:58.205611" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:58.205475" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:58.205452" elapsed="0.000258"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:25:58.207042" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:58.206898" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:58.206879" elapsed="0.000233"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:25:58.207603" level="INFO">${karaf_connection_index} = 20</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:25:58.207265" elapsed="0.000366"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:58.208047" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:25:58.207802" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:25:58.208880" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:25:58.208606" elapsed="0.001077">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:25:58.209963" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:25:58.210029" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:58.208245" elapsed="0.001816"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:25:58.211063" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:25:58.210731" elapsed="0.001142">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:25:58.212129" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:25:58.212189" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:58.210286" elapsed="0.001934"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:25:58.213274" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Odl_To_Play_l3vpn_rt_arg"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:25:58.212578" elapsed="0.000769">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Odl_To_Play_l3vpn_rt_arg"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:58.212327" elapsed="0.001095">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Odl_To_Play_l3vpn_rt_arg"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:25:58.212296" elapsed="0.001164">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Odl_To_Play_l3vpn_rt_arg"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:58.213634" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:58.213873" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:58.213724" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:58.213705" elapsed="0.000278"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:25:58.214022" elapsed="0.000018"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:25:58.217102" elapsed="0.000256"/>
</kw>
<msg time="2026-04-17T03:25:58.217456" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:58.215611" elapsed="0.002009"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:58.217998" elapsed="0.000114"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:58.218454" elapsed="0.000336"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:25:58.214931" elapsed="0.004034"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:25:58.214340" elapsed="0.004714"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:25:58.206586" elapsed="0.012589">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Odl_To_Play_l3vpn_rt_arg"</status>
</kw>
<msg time="2026-04-17T03:25:58.219319" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:25:58.219375" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Odl_To_Play_l3vpn_rt_arg"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:58.205885" elapsed="0.013520"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:25:58.219663" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:58.219514" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:58.219486" elapsed="0.000267"/>
</if>
<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-04-17T03:25:58.221247" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:58.221133" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:58.221113" elapsed="0.000205"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:58.221696" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:25:58.221808" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:25:58.221554" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:58.222328" level="INFO">{1: 20}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:58.222035" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:58.222781" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:58.222534" elapsed="0.000304"/>
</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-04-17T03:25:58.223607" elapsed="0.000470"/>
</kw>
<msg time="2026-04-17T03:25:58.224201" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:25:58.224256" level="INFO">${old_connection_index} = 20</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:58.223085" elapsed="0.001199"/>
</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-04-17T03:25:58.225354" elapsed="0.000300"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:25:58.226854" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:25:58.226424" elapsed="0.001404">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:58.225881" elapsed="0.002060"/>
</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-04-17T03:25:58.228704" elapsed="0.000320"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:58.228206" elapsed="0.000905"/>
</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-04-17T03:25:58.224668" elapsed="0.004490"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:58.224380" elapsed="0.004827"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:58.224356" elapsed="0.004878"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:25:58.230273" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:25:58.229858" elapsed="0.000444"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:25:58.230355" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:25:58.230521" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:25:58.229461" elapsed="0.001094"/>
</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-04-17T03:25:58.230751" elapsed="0.000556"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:58.231614" level="INFO">index=21
host=10.30.170.120
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-04-17T03:25:58.231717" level="INFO">${karaf_connection_object} = index=21
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:25:58.231493" elapsed="0.000317"/>
</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-04-17T03:25:58.232011" elapsed="0.002654"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:25:58.235127" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:25:58.236556" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:25:58.234842" elapsed="0.002123">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:25:58.251302" elapsed="0.000425"/>
</kw>
<msg time="2026-04-17T03:25:58.251828" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:58.249675" elapsed="0.002514"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:58.252361" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:58.252543" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:25:58.237878" elapsed="0.014753"/>
</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-04-17T03:25:58.237275" elapsed="0.015406"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:25:58.220736" elapsed="0.032037">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:58.253357" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:25:58.253438" 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="FAIL" start="2026-04-17T03:25:58.205065" elapsed="0.048500">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:25:58.253684" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:25:58.253729" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:58.199757" elapsed="0.053996"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:58.254153" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:58.253840" elapsed="0.000370"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:58.253819" elapsed="0.000418"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:25:58.199592" elapsed="0.054671"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:25:58.199393" elapsed="0.054907"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:25:58.195914" elapsed="0.058448"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:25:58.189773" elapsed="0.064652"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:58.189242" elapsed="0.065234"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:25:58.185710" elapsed="0.068840"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:25:58.255790" 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-04-17T03:25:58.256000" 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-04-17T03:25:58.255545" elapsed="0.000483"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-17T03:25:58.256420" 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-04-17T03:25:58.256199" elapsed="0.000295"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:25:58.256882" 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-04-17T03:25:58.257050" 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-04-17T03:25:58.256678" elapsed="0.000412"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-17T03:25:58.257515" 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-04-17T03:25:58.257298" elapsed="0.000244"/>
</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-04-17T03:25:58.257870" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:58.257633" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:58.257608" elapsed="0.000593"/>
</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-04-17T03:25:58.294771" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:58.294348" elapsed="0.000459"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:58.295679" 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-04-17T03:25:58.295398" elapsed="0.000359">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-17T03:25:58.295853" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:58.295040" elapsed="0.000838"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:58.296496" 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-04-17T03:25:58.296081" elapsed="0.000442"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:25:58.296835" 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-04-17T03:25:58.297023" 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-04-17T03:25:58.296691" elapsed="0.000359"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:58.297465" 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-04-17T03:25:58.297213" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:58.298552" level="INFO">mapping: {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:58.298294" elapsed="0.000304"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:25:58.299121" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:25:58.298761" elapsed="0.000388"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:25:58.299821" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:25:58.299520" elapsed="0.000326"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:25:58.300836" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:25:58.300387" elapsed="0.000476"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:25:58.300915" elapsed="0.000062"/>
</return>
<msg time="2026-04-17T03:25:58.301108" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:25:58.300058" elapsed="0.001076"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:25:58.301292" elapsed="0.000238"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:25:58.299378" elapsed="0.002192"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:25:58.302322" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:25:58.301820" elapsed="0.000575"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:25:58.303387" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:25:58.302922" elapsed="0.000492"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:25:58.303464" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:25:58.303617" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:25:58.302593" elapsed="0.001048"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:25:58.303798" elapsed="0.000245"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:25:58.301685" elapsed="0.002410"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:25:58.299202" elapsed="0.004937"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:25:58.304191" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:25:58.304353" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:25:58.297960" elapsed="0.006417"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:58.297590" elapsed="0.006819"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:58.304585" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:58.304433" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:58.297567" elapsed="0.007094"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:25:58.305405" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:25:58.304807" elapsed="0.000626"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:25:58.305481" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:25:58.293592" elapsed="0.012013"/>
</kw>
<msg time="2026-04-17T03:25:58.305660" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:58.280355" elapsed="0.025353"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:58.318680" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:58.331730" 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/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-04-17T03:25:58.344871" elapsed="0.000050"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:58.345181" 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-04-17T03:25:58.345376" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:58.345987" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:58.345758" elapsed="0.000302"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:58.345739" elapsed="0.000353"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:58.346258" 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-04-17T03:25:58.346434" 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-04-17T03:25:58.346607" elapsed="0.000032"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:25:58.345700" elapsed="0.000973"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:25:58.345564" elapsed="0.001136"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:58.346852" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:58.346971" elapsed="0.000023"/>
</return>
<msg time="2026-04-17T03:25:58.347153" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:25:58.275894" elapsed="0.071288"/>
</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-04-17T03:25:58.376456" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:58.376020" elapsed="0.000476"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:58.377424" 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-04-17T03:25:58.377107" elapsed="0.000399">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-04-17T03:25:58.377603" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:58.376711" elapsed="0.000918"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:58.378306" 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-04-17T03:25:58.377803" elapsed="0.000533"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:25:58.378667" 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-04-17T03:25:58.378853" 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-04-17T03:25:58.378515" elapsed="0.000367"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:58.379346" 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-04-17T03:25:58.379066" elapsed="0.000345"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-17T03:25:58.379858" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:58.379493" elapsed="0.000505"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:58.380505" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:58.380201" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:58.380030" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:58.379468" elapsed="0.001173"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:25:58.381307" 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-04-17T03:25:58.380800" elapsed="0.000540"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:25:58.381413" elapsed="0.000041"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/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-04-17T03:25:58.375268" elapsed="0.006302"/>
</kw>
<msg time="2026-04-17T03:25:58.381635" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:58.361587" elapsed="0.020102"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:25:58.394753" 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/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-04-17T03:25:58.408568" elapsed="0.000058"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:25:58.425259" elapsed="0.000085"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:58.425721" elapsed="0.000035"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:58.426008" 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-04-17T03:25:58.426639" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:58.426410" elapsed="0.000308"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:58.426376" elapsed="0.000391"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:58.427013" elapsed="0.000030"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:58.427257" 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-04-17T03:25:58.427504" elapsed="0.000031"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:25:58.426321" elapsed="0.001260"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:25:58.426131" elapsed="0.001490"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:58.427839" elapsed="0.000052"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:58.428092" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:25:58.428362" 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-04-17T03:25:58.360563" elapsed="0.067842"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:58.430339" 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-04-17T03:25:58.429987" elapsed="0.000429">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-04-17T03:25:58.430512" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:58.429476" elapsed="0.001061"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:58.430885" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:58.430611" elapsed="0.000350"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:58.431512" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:58.431187" elapsed="0.000362"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:58.430988" elapsed="0.000605"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:58.430591" elapsed="0.001034"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:58.435013" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:25:58.431848" elapsed="0.003198"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:25:58.435114" elapsed="0.000062"/>
</return>
<msg time="2026-04-17T03:25:58.435369" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:25:58.428933" elapsed="0.006472"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:58.437438" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:25:58.437126" elapsed="0.000381"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:58.438111" 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-04-17T03:25:58.437700" elapsed="0.000495"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:58.438766" 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-04-17T03:25:58.438418" elapsed="0.000413"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:58.439478" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:58.439107" elapsed="0.000436"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:25:58.440761" 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-04-17T03:25:58.440477" elapsed="0.000322"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:25:58.441306" 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-04-17T03:25:58.441065" elapsed="0.000276"/>
</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-04-17T03:25:58.441562" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:58.442582" 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-04-17T03:25:58.442125" elapsed="0.000518"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:25:58.442704" elapsed="0.000053"/>
</return>
<msg time="2026-04-17T03:25:58.442960" 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-04-17T03:25:58.439864" elapsed="0.003131"/>
</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-04-17T03:25:58.449913" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</msg>
<msg time="2026-04-17T03:25:58.652712" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</msg>
<msg time="2026-04-17T03:25:59.058781" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</msg>
<msg time="2026-04-17T03:25:59.061871" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:25:58.446182" elapsed="0.621955">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:58.443106" elapsed="0.625278">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:25:59.069019" elapsed="0.000080"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:59.068479" elapsed="0.000765"/>
</branch>
<status status="FAIL" start="2026-04-17T03:25:58.443076" elapsed="0.626233">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:25:59.070253" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:59.070450" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:59.070393" elapsed="0.000124"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:59.070367" 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-04-17T03:25:59.070767" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:25:59.070863" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>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="FAIL" start="2026-04-17T03:25:58.436052" elapsed="0.634998">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:59.071162" elapsed="0.000018"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>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="FAIL" start="2026-04-17T03:25:58.263415" elapsed="0.807854">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:59.073339" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:59.071457" elapsed="0.001959"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:59.071438" elapsed="0.002005"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:59.073478" elapsed="0.000015"/>
</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="FAIL" start="2026-04-17T03:25:58.258465" elapsed="0.815119">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:25:59.073835" elapsed="0.000034"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<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="NOT RUN" start="2026-04-17T03:25:59.074136" elapsed="0.000030"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:59.074349" elapsed="0.000022"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations">
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:59.074544" elapsed="0.000023"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:25:59.074741" elapsed="0.000022"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<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="NOT RUN" start="2026-04-17T03:25:59.074988" elapsed="0.000024"/>
</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-04-17T03:25:59.124405" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:59.123893" elapsed="0.000548"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:25:59.125313" 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-04-17T03:25:59.125035" elapsed="0.000352">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-04-17T03:25:59.125486" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:25:59.124630" elapsed="0.000886"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:59.126324" 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-04-17T03:25:59.125754" elapsed="0.000606"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:25:59.126833" 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-04-17T03:25:59.127065" 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-04-17T03:25:59.126588" elapsed="0.000514"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:59.127855" 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-04-17T03:25:59.127514" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:59.129278" level="INFO">mapping: {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:59.129007" elapsed="0.000410"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:25:59.129957" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:25:59.129649" elapsed="0.000336"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:25:59.131240" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:25:59.130373" elapsed="0.000895"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:25:59.132495" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:25:59.131986" elapsed="0.000552"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:25:59.132662" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:25:59.132899" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:25:59.131473" elapsed="0.001457"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:25:59.133110" elapsed="0.000512"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:25:59.130229" elapsed="0.003437"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:25:59.134462" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:25:59.133923" elapsed="0.000565"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:25:59.135728" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:25:59.135285" elapsed="0.000484"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:25:59.135887" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:25:59.136140" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:25:59.134683" elapsed="0.001483"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:25:59.136324" elapsed="0.000487"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:25:59.133784" elapsed="0.003070"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:25:59.130044" elapsed="0.006846"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:25:59.136937" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:25:59.137116" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:25:59.128540" elapsed="0.008602"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:59.128047" elapsed="0.009127"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:59.137356" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:59.137201" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:59.128012" elapsed="0.009421"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:25:59.138198" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:25:59.137584" elapsed="0.000644"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:25:59.138276" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/l3vpn_rt_arg/app/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:25:59.122910" elapsed="0.015492"/>
</kw>
<msg time="2026-04-17T03:25:59.138458" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:59.107709" elapsed="0.030812"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:25:59.151963" 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/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-04-17T03:25:59.165106" 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/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-04-17T03:25:59.179114" elapsed="0.000064"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:59.179426" 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-04-17T03:25:59.179674" 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-04-17T03:25:59.180150" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:59.179986" elapsed="0.000248"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:59.179967" 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-04-17T03:25:59.180468" 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-04-17T03:25:59.180672" 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-04-17T03:25:59.180882" elapsed="0.000028"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:25:59.179909" elapsed="0.001059"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:25:59.179768" elapsed="0.001230"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:59.181164" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:25:59.181247" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:25:59.181441" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:25:59.102712" elapsed="0.078761"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:59.182839" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:25:59.182513" elapsed="0.000391"/>
</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-04-17T03:25:59.188564" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</msg>
<msg time="2026-04-17T03:25:59.393323" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</msg>
<msg time="2026-04-17T03:25:59.799411" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</msg>
<msg time="2026-04-17T03:25:59.801824" level="INFO">${response} = None</msg>
<msg time="2026-04-17T03:25:59.801984" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:59.185537" elapsed="0.622864">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:59.183008" elapsed="0.625650">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:59.809307" elapsed="0.000062"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:59.808761" elapsed="0.000716"/>
</branch>
<status status="FAIL" start="2026-04-17T03:25:59.182986" elapsed="0.626553">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:25:59.814596" 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-04-17T03:25:59.811793" elapsed="0.002840">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:59.811522" elapsed="0.003179">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:25:59.811500" elapsed="0.003285">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-04-17T03:25:59.817716" 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-04-17T03:25:59.815121" elapsed="0.002630">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:59.814864" elapsed="0.002954">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:25:59.814847" elapsed="0.003003">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:25:59.818509" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:25:59.818085" elapsed="0.000451"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:59.818913" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:59.818607" elapsed="0.000401"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:59.819741" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:59.819428" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:59.819044" elapsed="0.000758"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:59.818590" elapsed="0.001234"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:25:59.820379" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:25:59.820008" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:59.820714" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:59.820474" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:25:59.821291" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:25:59.820976" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:59.820795" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:59.820456" elapsed="0.000917"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:59.821534" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-17T03:25:59.822430" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:25:59.822112" elapsed="0.000345"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-04-17T03:25:59.824935" 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-04-17T03:25:59.822619" elapsed="0.002362">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-04-17T03:25:59.810749" elapsed="0.014438">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-04-17T03:25:59.825256" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:25:59.827745" level="INFO">${response_text} = None</msg>
<msg time="2026-04-17T03:25:59.827776" 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-04-17T03:25:59.181796" elapsed="0.646009">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-04-17T03:25:59.827872" elapsed="0.000027"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="FAIL" start="2026-04-17T03:25:59.076281" elapsed="0.751813">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:59.075721" elapsed="0.752457"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-04-17T03:25:59.075270" elapsed="0.752975"/>
</kw>
<arg>l3vpn_rt_arg</arg>
<arg>${RT_CONSTRAIN_DIR}</arg>
<arg>False</arg>
<status status="FAIL" start="2026-04-17T03:25:58.254881" elapsed="1.573634">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Same as TC before but fluorine and further this l3vpn route also needs to contain route-target argument.</doc>
<status status="FAIL" start="2026-04-17T03:25:58.185089" elapsed="1.643590">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:25:59.832594" elapsed="0.000220"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:25:59.832321" 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-04-17T03:25:59.833913" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:59.833800" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:59.833781" elapsed="0.000220"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:25:59.840800" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:59.840645" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:59.840619" elapsed="0.000279"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:25:59.842471" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:25:59.841844" elapsed="0.000679"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:25:59.843340" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:25:59.842792" elapsed="0.000586"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:25:59.843443" elapsed="0.000045"/>
</return>
<msg time="2026-04-17T03:25:59.843667" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:25:59.841297" elapsed="0.002405"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:25:59.849970" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:59.849837" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:59.849817" elapsed="0.000226"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:25:59.851277" elapsed="0.000055"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:59.851168" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:59.851150" elapsed="0.000238"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:25:59.851866" level="INFO">${karaf_connection_index} = 21</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:25:59.851543" elapsed="0.000435"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:59.852388" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:25:59.852154" elapsed="0.000261"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:25:59.853270" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:25:59.852935" elapsed="0.001093">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:25:59.854246" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:25:59.854294" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:59.852583" elapsed="0.001735"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:25:59.855158" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:25:59.854878" elapsed="0.001027">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:25:59.856142" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:25:59.856203" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:59.854496" elapsed="0.001732"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:25:59.857373" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Kill_Talking_BGP_Speaker"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:25:59.856549" elapsed="0.000897">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Kill_Talking_BGP_Speaker"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:25:59.856308" elapsed="0.001220">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Kill_Talking_BGP_Speaker"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:25:59.856287" elapsed="0.001276">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Kill_Talking_BGP_Speaker"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:59.857736" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:59.858056" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:59.857868" elapsed="0.000249"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:25:59.857842" elapsed="0.000301"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:25:59.858177" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:25:59.861371" elapsed="0.000156"/>
</kw>
<msg time="2026-04-17T03:25:59.861597" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:59.859989" elapsed="0.001743"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:59.862151" elapsed="0.000082"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:59.862528" 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-04-17T03:25:59.859198" elapsed="0.003525"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:25:59.858493" elapsed="0.004310"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:25:59.850824" elapsed="0.012080">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Kill_Talking_BGP_Speaker"</status>
</kw>
<msg time="2026-04-17T03:25:59.863034" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:25:59.863078" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Kill_Talking_BGP_Speaker"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:59.850206" elapsed="0.012896"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:25:59.863336" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:59.863207" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:59.863178" elapsed="0.000232"/>
</if>
<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-04-17T03:25:59.864355" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:59.864235" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:59.864211" elapsed="0.000213"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:59.864746" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:25:59.864922" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:25:59.864612" elapsed="0.000363"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:59.865452" level="INFO">{1: 21}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:59.865172" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:59.866041" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:25:59.865677" elapsed="0.000415"/>
</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-04-17T03:25:59.866666" elapsed="0.000306"/>
</kw>
<msg time="2026-04-17T03:25:59.867077" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:25:59.867129" level="INFO">${old_connection_index} = 21</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:59.866262" elapsed="0.000904"/>
</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-04-17T03:25:59.868116" elapsed="0.000206"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:25:59.869465" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:25:59.869043" elapsed="0.001400">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:59.868497" elapsed="0.002048"/>
</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-04-17T03:25:59.871246" elapsed="0.000301"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:59.870725" elapsed="0.000929"/>
</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-04-17T03:25:59.867506" elapsed="0.004197"/>
</kw>
<status status="PASS" start="2026-04-17T03:25:59.867256" elapsed="0.004497"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:59.867236" elapsed="0.004543"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:25:59.872713" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:25:59.872389" elapsed="0.000354"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:25:59.872794" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:25:59.872976" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:25:59.872023" elapsed="0.000979"/>
</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-04-17T03:25:59.873164" elapsed="0.000645"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:25:59.874158" level="INFO">index=22
host=10.30.170.120
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-04-17T03:25:59.874263" level="INFO">${karaf_connection_object} = index=22
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:25:59.874040" elapsed="0.000250"/>
</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-04-17T03:25:59.874458" elapsed="0.002383"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:25:59.877309" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:25:59.878623" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:25:59.877037" elapsed="0.002033">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:25:59.894165" elapsed="0.000407"/>
</kw>
<msg time="2026-04-17T03:25:59.894673" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:25:59.892648" elapsed="0.002185"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:59.895017" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:59.895188" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:25:59.880624" elapsed="0.014648"/>
</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-04-17T03:25:59.879464" elapsed="0.015935"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:25:59.863888" elapsed="0.031604">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:59.895885" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:25:59.896249" 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="FAIL" start="2026-04-17T03:25:59.849467" elapsed="0.046903">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:25:59.896485" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:25:59.896529" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:59.844230" elapsed="0.052322"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:59.896907" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:25:59.896637" elapsed="0.000377"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:59.896617" elapsed="0.000424"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:25:59.844063" elapsed="0.053002"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:25:59.843786" elapsed="0.053313"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:25:59.840083" elapsed="0.057075"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:25:59.833504" elapsed="0.063711"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:59.833047" elapsed="0.064214"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:25:59.829886" elapsed="0.067431"/>
</kw>
<kw name="Kill_BGP_Speaker" owner="BGPSpeaker">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:25:59.898573" 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-04-17T03:25:59.898256" elapsed="0.000344"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="PASS" start="2026-04-17T03:25:59.898757" elapsed="0.000503"/>
</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-04-17T03:25:59.897934" elapsed="0.001386"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:25:59.917828" level="INFO">^C
[?2004h[jenkins@releng-26932-188-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-04-17T03:25:59.899828" elapsed="0.018195"/>
</kw>
<msg time="2026-04-17T03:25:59.918255" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:25:59.918344" level="INFO">${message} = ^C
[?2004h[jenkins@releng-26932-188-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${status}</var>
<var>${message}</var>
<arg>SSHLibrary.Read_Until_Prompt</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:59.899491" elapsed="0.018904"/>
</kw>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:25:59.919773" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-04-17T03:25:59.932528" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:25:59.932793" level="INFO">${output_log} = 2026-04-17 03:25:45,919 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:25:45,919 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.238
2026-04-17 03:25:45,919 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-04-17T03:25:59.919500" elapsed="0.013332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:59.933655" level="INFO">2026-04-17 03:25:45,919 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:25:45,919 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.238
2026-04-17 03:25:45,919 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-04-17 03:25:45,919 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.120
2026-04-17 03:25:45,920 DEBUG BGP-Thread-1 (job): Remote port: 1790
Exception in thread Thread-1 (job):
Traceback (most recent call last):
  File "/usr/lib/python3.10/threading.py", line 1016, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.10/threading.py", line 953, in run
    self._target(*self._args, **self._kwargs)
  File "/home/jenkins/play.py", line 2406, in job
    bgp_socket = establish_connection(arguments)
  File "/home/jenkins/play.py", line 284, in establish_connection
    talking_socket.connect((str(arguments.peerip), arguments.peerport))
ConnectionRefusedError: [Errno 111] Connection refused
10.30.171.144 - - [17/Apr/2026 03:25:51] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:25:51] "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-04-17T03:25:59.933184" elapsed="0.000652"/>
</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-04-17T03:25:59.918850" elapsed="0.015085"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<status status="PASS" start="2026-04-17T03:25:59.934273" elapsed="0.000053"/>
</return>
<status status="PASS" start="2026-04-17T03:25:59.934079" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:59.934043" elapsed="0.000363"/>
</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-04-17T03:25:59.934626" elapsed="0.000032"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was not seen within timeout period.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:25:59.934866" elapsed="0.000027"/>
</kw>
<doc>Interrupt play.py, fail if no prompt is seen within SSHLibrary timeout.
Also dump the logs with the output the program produced.
This keyword is also suitable for stopping BGP manager.</doc>
<status status="PASS" start="2026-04-17T03:25:59.897601" elapsed="0.037414"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:25:59.947792" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-04-17T03:25:59.981328" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:25:59.981624" level="INFO">${output_log} = 2026-04-17 03:25:45,919 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:25:45,919 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.238
2026-04-17 03:25:45,919 DEBUG BGP-Thr...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-17T03:25:59.947639" elapsed="0.034045"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:25:59.982877" level="INFO">2026-04-17 03:25:45,919 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:25:45,919 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.238
2026-04-17 03:25:45,919 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-04-17 03:25:45,919 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.120
2026-04-17 03:25:45,920 DEBUG BGP-Thread-1 (job): Remote port: 1790
Exception in thread Thread-1 (job):
Traceback (most recent call last):
  File "/usr/lib/python3.10/threading.py", line 1016, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.10/threading.py", line 953, in run
    self._target(*self._args, **self._kwargs)
  File "/home/jenkins/play.py", line 2406, in job
    bgp_socket = establish_connection(arguments)
  File "/home/jenkins/play.py", line 284, in establish_connection
    talking_socket.connect((str(arguments.peerip), arguments.peerport))
ConnectionRefusedError: [Errno 111] Connection refused
10.30.171.144 - - [17/Apr/2026 03:25:51] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:25:51] "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-04-17T03:25:59.982190" elapsed="0.000918"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-04-17T03:25:59.984764" 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-04-17T03:25:59.983661" elapsed="0.001321"/>
</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-04-17T03:25:59.947262" elapsed="0.037932"/>
</kw>
<doc>Abort the Python speaker</doc>
<status status="PASS" start="2026-04-17T03:25:59.829123" elapsed="0.156492"/>
</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-04-17T03:25:59.991053" elapsed="0.000316"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:25:59.990516" elapsed="0.000933"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:25:59.993107" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:59.992883" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:59.992842" elapsed="0.000371"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:25:59.998881" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:25:59.998771" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-17T03:25:59.998752" elapsed="0.000219"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:00.000053" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:25:59.999620" elapsed="0.000461"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:00.000552" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:00.000249" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:00.000622" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:26:00.000787" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:25:59.999228" elapsed="0.001584"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:00.006762" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:00.006604" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:00.006585" 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-04-17T03:26:00.008085" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:00.007973" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:00.007929" elapsed="0.000225"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:00.008615" level="INFO">${karaf_connection_index} = 22</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:00.008305" elapsed="0.000337"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:00.009051" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:00.008808" elapsed="0.000270"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:00.009965" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:00.009594" elapsed="0.001227">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:00.011071" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:00.011118" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:00.009249" elapsed="0.001892"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:00.011917" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:00.011669" elapsed="0.000955">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:00.012812" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:00.012859" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:00.011319" elapsed="0.001565"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:00.013909" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Delete_Bgp_Peer_Configuration"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:00.013231" elapsed="0.000769">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Delete_Bgp_Peer_Configuration"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:00.012997" elapsed="0.001075">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Delete_Bgp_Peer_Configuration"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:00.012976" elapsed="0.001129">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Delete_Bgp_Peer_Configuration"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:00.014272" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:00.014500" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:00.014356" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:00.014339" elapsed="0.000234"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:00.014604" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:00.017165" elapsed="0.000146"/>
</kw>
<msg time="2026-04-17T03:26:00.017377" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:00.016106" elapsed="0.001402"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:00.017786" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:00.018291" 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-04-17T03:26:00.015454" 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-04-17T03:26:00.014890" elapsed="0.003658"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:00.007638" elapsed="0.010998">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Delete_Bgp_Peer_Configuration"</status>
</kw>
<msg time="2026-04-17T03:26:00.018744" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:00.018786" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Delete_Bgp_Peer_Configuration"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:00.007018" elapsed="0.011792"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:00.019073" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:00.018957" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:00.018918" elapsed="0.000222"/>
</if>
<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-04-17T03:26:00.020182" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:00.020077" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:00.020059" elapsed="0.000189"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:00.020534" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:00.020638" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:00.020406" elapsed="0.000259"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:00.021178" level="INFO">{1: 22}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:00.020822" elapsed="0.000400"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:00.021622" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:00.021378" elapsed="0.000288"/>
</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-04-17T03:26:00.022274" elapsed="0.000274"/>
</kw>
<msg time="2026-04-17T03:26:00.022648" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:00.022696" level="INFO">${old_connection_index} = 22</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:00.021829" elapsed="0.000890"/>
</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-04-17T03:26:00.023593" elapsed="0.000198"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:00.024887" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:00.024479" elapsed="0.001403">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:00.023985" elapsed="0.002018"/>
</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-04-17T03:26:00.026678" elapsed="0.000313"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:00.026203" elapsed="0.000886"/>
</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-04-17T03:26:00.023042" elapsed="0.004106"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:00.022795" elapsed="0.004408"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:00.022777" elapsed="0.004460"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:00.028369" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:00.027975" elapsed="0.000429"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:00.028466" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:26:00.028664" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:00.027515" elapsed="0.001180"/>
</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-04-17T03:26:00.028910" elapsed="0.000590"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:00.029880" level="INFO">index=23
host=10.30.170.120
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-04-17T03:26:00.030032" level="INFO">${karaf_connection_object} = index=23
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:00.029738" elapsed="0.000330"/>
</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-04-17T03:26:00.030331" elapsed="0.002799"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:00.033587" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:00.035150" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:00.033302" elapsed="0.002269">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:00.050745" elapsed="0.000586"/>
</kw>
<msg time="2026-04-17T03:26:00.051493" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:00.049199" elapsed="0.002455"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:00.051823" elapsed="0.000027"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:00.052016" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:00.036536" elapsed="0.015566"/>
</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-04-17T03:26:00.035895" elapsed="0.016255"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:00.019761" elapsed="0.032477">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:00.052638" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:00.052717" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:26:00.006255" elapsed="0.046580">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:00.053151" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:00.053198" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:00.001227" elapsed="0.051995"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:00.053577" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:00.053310" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:00.053288" elapsed="0.000376"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:00.001074" elapsed="0.052625"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:00.000872" elapsed="0.052867"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:25:59.998352" elapsed="0.055450"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:25:59.992398" elapsed="0.061464"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:25:59.991669" elapsed="0.062241"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:25:59.987241" elapsed="0.066751"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:26:00.054721" level="INFO">&amp;{mapping} = { IP=10.30.171.238 | 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-04-17T03:26:00.054190" elapsed="0.000560"/>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:26:00.101597" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:26:00.101045" elapsed="0.000597"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:26:00.102555" 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-04-17T03:26:00.102261" elapsed="0.000383">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-04-17T03:26:00.102740" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:26:00.101877" elapsed="0.000889"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:00.103411" 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-04-17T03:26:00.102967" elapsed="0.000473"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:26:00.103753" 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-04-17T03:26:00.104055" 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-04-17T03:26:00.103608" elapsed="0.000475"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:00.104522" 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-04-17T03:26:00.104253" elapsed="0.000316"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:00.105659" level="INFO">mapping: {'IP': '10.30.171.238', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:00.105395" elapsed="0.000310"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:26:00.106212" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:26:00.105891" elapsed="0.000353"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:26:00.106978" level="INFO">${value} = 10.30.171.238</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:26:00.106627" elapsed="0.000379"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:26:00.107846" level="INFO">${encoded} = 10.30.171.238</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:26:00.107602" elapsed="0.000271"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:26:00.107927" elapsed="0.000059"/>
</return>
<msg time="2026-04-17T03:26:00.108117" level="INFO">${encoded_value} = 10.30.171.238</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:26:00.107202" 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-04-17T03:26:00.108300" elapsed="0.000279"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.238</var>
<status status="PASS" start="2026-04-17T03:26:00.106484" elapsed="0.002137"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:26:00.109230" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:26:00.108899" elapsed="0.000357"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:26:00.110147" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:26:00.109901" elapsed="0.000273"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:26:00.110224" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:26:00.110377" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:26:00.109479" 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-04-17T03:26:00.110556" elapsed="0.000223"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:26:00.108736" elapsed="0.002083"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:26:00.106302" elapsed="0.004552"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:26:00.110897" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:26:00.111073" level="INFO">${mapping_to_use} = {'IP': '10.30.171.238', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:26:00.105051" elapsed="0.006048"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:00.104650" elapsed="0.006482"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:00.111323" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:00.111158" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:00.104625" elapsed="0.006818"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:26:00.112226" 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-04-17T03:26:00.111599" elapsed="0.000658"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:26:00.112306" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:26:00.100177" elapsed="0.012255"/>
</kw>
<msg time="2026-04-17T03:26:00.112489" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:00.086154" elapsed="0.026385"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name} exists. If 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-04-17T03:26:00.128001" elapsed="0.000058"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:26:00.142154" 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/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-04-17T03:26:00.156212" elapsed="0.000052"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:00.156527" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:00.156722" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:00.157196" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:00.157036" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:00.157016" 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-04-17T03:26:00.157432" 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-04-17T03:26:00.157602" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:00.157769" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:26:00.156972" elapsed="0.000850"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:26:00.156809" elapsed="0.001042"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:00.158018" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:26:00.158101" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:26:00.158282" 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-04-17T03:26:00.081490" elapsed="0.076821"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:00.159608" 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.238</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:00.159274" 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-04-17T03:26:00.165082" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:26:00.367786" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:26:00.773170" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:26:00.776990" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:26:00.161961" elapsed="0.619208">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:00.159729" elapsed="0.621601">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:26:00.781728" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:00.781403" elapsed="0.000455"/>
</branch>
<status status="FAIL" start="2026-04-17T03:26:00.159712" elapsed="0.622183">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:26:00.782593" elapsed="0.000038"/>
</kw>
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:26:00.782706" elapsed="0.000028"/>
</return>
<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-04-17T03:26:00.158607" elapsed="0.624265">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:26:00.782992" elapsed="0.000023"/>
</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="FAIL" start="2026-04-17T03:26:00.055083" elapsed="0.728047">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="FAIL" start="2026-04-17T03:25:59.986167" elapsed="0.797229">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:00.788611" elapsed="0.000272"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:00.788325" elapsed="0.000636"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:00.790095" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:00.789903" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:00.789879" 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-04-17T03:26:00.795332" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:00.795171" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:00.795153" elapsed="0.000250"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:00.796635" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:00.796053" elapsed="0.000620"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:00.797210" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:00.796877" elapsed="0.000361"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:00.797284" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:26:00.797445" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:00.795644" elapsed="0.001826"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:00.803362" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:00.803249" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:00.803230" 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-04-17T03:26:00.804650" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:00.804541" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:00.804524" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:00.805212" level="INFO">${karaf_connection_index} = 23</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:00.804879" elapsed="0.000360"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:00.805772" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:00.805551" elapsed="0.000247"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:00.806660" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:00.806394" elapsed="0.001082">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:00.807685" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:00.807734" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:00.805982" elapsed="0.001776"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:00.808557" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:00.808311" elapsed="0.000917">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:00.809415" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:00.809461" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:00.807952" elapsed="0.001532"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:00.810490" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Deconfigure_App_Peer"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:00.809787" elapsed="0.000767">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Deconfigure_App_Peer"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:00.809560" elapsed="0.001064">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Deconfigure_App_Peer"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:00.809541" elapsed="0.001117">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Deconfigure_App_Peer"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:00.810829" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:00.811090" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:00.810921" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:00.810900" elapsed="0.000268"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:00.811200" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:00.814001" elapsed="0.000161"/>
</kw>
<msg time="2026-04-17T03:26:00.814233" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:00.812757" elapsed="0.001647"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:00.814746" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:00.815220" 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-04-17T03:26:00.812067" elapsed="0.003343"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:00.811487" elapsed="0.003990"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:00.804237" elapsed="0.011326">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Deconfigure_App_Peer"</status>
</kw>
<msg time="2026-04-17T03:26:00.815669" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:00.815713" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn.Deconfigure_App_Peer"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:00.803590" elapsed="0.012146"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:00.815927" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:00.815813" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:00.815795" elapsed="0.000216"/>
</if>
<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-04-17T03:26:00.816838" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:00.816732" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:00.816714" elapsed="0.000191"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:00.817215" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:00.817324" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:00.817087" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:00.817791" level="INFO">{1: 23}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:00.817510" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:00.818398" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:00.818075" elapsed="0.000369"/>
</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-04-17T03:26:00.819010" elapsed="0.000281"/>
</kw>
<msg time="2026-04-17T03:26:00.819392" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:00.819438" level="INFO">${old_connection_index} = 23</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:00.818610" elapsed="0.000851"/>
</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-04-17T03:26:00.820294" elapsed="0.000194"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:00.821578" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:00.821174" elapsed="0.001561">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:00.820662" elapsed="0.002174"/>
</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-04-17T03:26:00.823499" elapsed="0.000275"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:00.823032" elapsed="0.000827"/>
</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-04-17T03:26:00.819762" elapsed="0.004145"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:00.819536" elapsed="0.004438"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:00.819518" elapsed="0.004482"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:00.824855" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:00.824544" elapsed="0.000338"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:00.824935" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:26:00.825103" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:00.824212" elapsed="0.000930"/>
</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-04-17T03:26:00.825306" elapsed="0.000434"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:00.826101" level="INFO">index=24
host=10.30.170.120
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-04-17T03:26:00.826205" level="INFO">${karaf_connection_object} = index=24
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:00.825990" elapsed="0.000242"/>
</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-04-17T03:26:00.826390" elapsed="0.002371"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:00.829222" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:00.830560" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:00.828933" elapsed="0.002029">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:00.846716" elapsed="0.000526"/>
</kw>
<msg time="2026-04-17T03:26:00.847356" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:00.844854" elapsed="0.002789"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:00.847873" elapsed="0.000027"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:00.848370" elapsed="0.000024"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:00.831797" elapsed="0.016670"/>
</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-04-17T03:26:00.831259" elapsed="0.017262"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:00.816433" elapsed="0.032186">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:00.849151" elapsed="0.000037"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:00.849248" elapsed="0.000024"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:26:00.802884" elapsed="0.046505">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:00.849516" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:00.849560" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:00.797896" elapsed="0.051688"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:00.849995" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:00.849673" elapsed="0.000408"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:00.849651" elapsed="0.000464"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:00.797705" elapsed="0.052438"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:00.797529" elapsed="0.052652"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:00.794780" elapsed="0.055494"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:00.789589" elapsed="0.060766"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:00.789128" elapsed="0.061278"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:00.785356" elapsed="0.065127"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:26:00.851333" level="INFO">&amp;{mapping} = { IP=10.30.170.120 | 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-04-17T03:26:00.850701" elapsed="0.000660"/>
</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-04-17T03:26:00.899847" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:26:00.899373" elapsed="0.000620"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:26:00.900829" 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-04-17T03:26:00.900571" elapsed="0.000335">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-04-17T03:26:00.901023" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:26:00.900206" elapsed="0.000842"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:00.901622" 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-04-17T03:26:00.901219" elapsed="0.000430"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:26:00.901977" 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-04-17T03:26:00.902137" 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-04-17T03:26:00.901817" elapsed="0.000346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:00.902601" 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-04-17T03:26:00.902329" 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-04-17T03:26:00.903787" level="INFO">mapping: {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:00.903461" elapsed="0.000373"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:26:00.904299" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:26:00.904019" elapsed="0.000306"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:26:00.905010" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:26:00.904694" elapsed="0.000341"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:26:00.905980" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:26:00.905728" elapsed="0.000279"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:26:00.906061" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:26:00.906236" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:26:00.905242" elapsed="0.001020"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:26:00.906420" elapsed="0.000250"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:26:00.904554" elapsed="0.002157"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:26:00.907277" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:26:00.906978" elapsed="0.000326"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:26:00.908165" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:26:00.907929" elapsed="0.000263"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:26:00.908242" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:26:00.908601" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:26:00.907526" elapsed="0.001102"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:26:00.908787" elapsed="0.000245"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:26:00.906824" elapsed="0.002250"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:26:00.904377" elapsed="0.004733"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:26:00.909153" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:26:00.909313" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:26:00.903101" elapsed="0.006238"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:00.902727" elapsed="0.006645"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:00.909555" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:00.909399" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:00.902704" elapsed="0.006981"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:26:00.910486" 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-04-17T03:26:00.909842" elapsed="0.000674"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:26:00.910566" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:26:00.898652" elapsed="0.012039"/>
</kw>
<msg time="2026-04-17T03:26:00.910748" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:00.884815" elapsed="0.025997"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:26:00.924168" 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/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-04-17T03:26:00.937276" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:00.950597" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:00.950815" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:00.951019" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:00.951436" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:00.951268" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:00.951251" 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-04-17T03:26:00.951667" 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-04-17T03:26:00.951837" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:00.952035" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:26:00.951214" elapsed="0.000875"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:26:00.951101" elapsed="0.001016"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:00.952328" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:26:00.952410" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:26:00.952565" 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-04-17T03:26:00.880155" elapsed="0.072438"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:00.953900" 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.120</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:00.953602" elapsed="0.000369"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:00.959620" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:26:01.163864" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:26:01.566742" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:26:01.569261" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:26:00.956361" elapsed="0.616155">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:00.954051" elapsed="0.618629">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:26:01.573156" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:01.572814" elapsed="0.000466"/>
</branch>
<status status="FAIL" start="2026-04-17T03:26:00.954033" elapsed="0.619291">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:26:01.573967" elapsed="0.000040"/>
</kw>
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:26:01.574081" elapsed="0.000029"/>
</return>
<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-04-17T03:26:00.952959" elapsed="0.621290">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:26:01.574348" elapsed="0.000024"/>
</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="FAIL" start="2026-04-17T03:26:00.851599" elapsed="0.722892">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Revert the BGP configuration to the original state: without application peer</doc>
<status status="FAIL" start="2026-04-17T03:26:00.784136" elapsed="0.790659">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:01.584086" level="INFO">${cd_and_command} = cd '.' &amp;&amp; rm -rf /tmp/defaultvenv</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:26:01.583659" elapsed="0.000464"/>
</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-04-17T03:26:01.585878" level="INFO">Executing command 'cd '.' &amp;&amp; rm -rf /tmp/defaultvenv'.</msg>
<msg time="2026-04-17T03:26:01.619343" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:26:01.619727" level="INFO">${stdout} = </msg>
<msg time="2026-04-17T03:26:01.619829" level="INFO">${stderr} = </msg>
<msg time="2026-04-17T03:26:01.619929" 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-04-17T03:26:01.585628" elapsed="0.034397"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:26:01.622776" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-04-17T03:26:01.621892" elapsed="0.001013"/>
</kw>
<msg time="2026-04-17T03:26:01.623208" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-04-17T03:26:01.623319" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:01.620664" elapsed="0.002712"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:01.625111" 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-04-17T03:26:01.623856" elapsed="0.001324"/>
</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-04-17T03:26:01.627634" level="INFO"/>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:01.627170" elapsed="0.000586"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:01.628450" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:01.628057" elapsed="0.000468"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:01.629141" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:01.628758" elapsed="0.000454"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-04-17T03:26:01.626447" elapsed="0.002849"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:01.625408" elapsed="0.003943"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:01.625346" elapsed="0.004044"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-04-17T03:26:01.629713" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:01.629479" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:01.629452" elapsed="0.000372"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:26:01.630084" elapsed="0.000050"/>
</return>
<status status="PASS" start="2026-04-17T03:26:01.629900" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:01.629878" elapsed="0.000342"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:01.630443" elapsed="0.000032"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-04-17T03:26:01.585001" elapsed="0.045621"/>
</kw>
<msg time="2026-04-17T03:26:01.630710" 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-04-17T03:26:01.584312" elapsed="0.046521"/>
</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-04-17T03:26:01.582863" elapsed="0.048159"/>
</kw>
<msg time="2026-04-17T03:26:01.631130" 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-04-17T03:26:01.577700" elapsed="0.053522"/>
</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-04-17T03:26:01.577154" elapsed="0.054187"/>
</kw>
<doc>Deletes a directory with virtual env.</doc>
<status status="PASS" start="2026-04-17T03:26:01.576642" elapsed="0.054977"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-04-17T03:26:01.631870" elapsed="0.000638"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:01.632885" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-17T03:26:01.632755" elapsed="0.000279"/>
</kw>
<doc>Suite teardown keyword</doc>
<status status="PASS" start="2026-04-17T03:26:01.575793" elapsed="0.057351"/>
</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="FAIL" start="2026-04-17T03:25:19.562571" elapsed="42.070626"/>
</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-04-17T03:26:01.737532" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:26:01.732670" elapsed="0.004933"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-17T03:26:01.732409" elapsed="0.005277"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-17T03:26:01.742981" 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-04-17T03:26:01.739057" elapsed="0.003957"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-17T03:26:01.743324" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:01.743186" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:01.743150" elapsed="0.000244"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:26:01.744016" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:26:01.743565" elapsed="0.000509"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-17T03:26:01.744633" 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-04-17T03:26:01.744289" elapsed="0.000370"/>
</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-04-17T03:26:01.745358" elapsed="0.000415"/>
</kw>
<msg time="2026-04-17T03:26:01.745923" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:01.746045" level="INFO">${possibly_int_of_members} = 1</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:01.744978" elapsed="0.001110"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:01.746687" 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-04-17T03:26:01.746276" elapsed="0.000437"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:01.747800" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:01.747529" elapsed="0.000299"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:01.748260" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:01.747996" elapsed="0.000289"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:26:01.748748" 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-04-17T03:26:01.748445" elapsed="0.000330"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-17T03:26:01.752600" elapsed="0.000245"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:26:01.753412" level="INFO">${member_ip} = 10.30.170.120</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:26:01.753037" elapsed="0.000402"/>
</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-04-17T03:26:01.753595" elapsed="0.000229"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:26:01.754762" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:26:01.754429" elapsed="0.000361"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-17T03:26:01.754841" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:26:01.755040" 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-04-17T03:26:01.754048" elapsed="0.001017"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:01.755744" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.120:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a4417f12b10&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-04-17T03:26:01.755278" elapsed="0.000748"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-17T03:26:01.756220" elapsed="0.000197"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-04-17T03:26:01.751868" elapsed="0.004609"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:01.751638" elapsed="0.004885"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-04-17T03:26:01.748833" elapsed="0.007727"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:26:01.757334" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:26:01.756732" elapsed="0.000649"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:26:01.757984" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.120'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:26:01.757550" elapsed="0.000479"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:26:01.758595" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:26:01.758201" elapsed="0.000438"/>
</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-04-17T03:26:01.747009" elapsed="0.011688"/>
</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-04-17T03:26:01.738567" elapsed="0.020189"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:01.758982" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:01.758832" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:01.758810" elapsed="0.000241"/>
</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-04-17T03:26:01.762352" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:01.761951" elapsed="0.000429"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:01.762844" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:01.762544" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:01.762915" elapsed="0.000051"/>
</return>
<msg time="2026-04-17T03:26:01.763097" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:01.761599" elapsed="0.001522"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:01.764346" level="INFO">${member_ip} = 10.30.170.120</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-04-17T03:26:01.763992" elapsed="0.000394"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:01.765433" 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-04-17T03:26:01.765573" 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-04-17T03:26:01.765218" elapsed="0.000391"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:01.773038" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:01.772408" elapsed="0.000732"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:01.772384" elapsed="0.000797"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:01.773988" 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-04-17T03:26:01.774249" 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-04-17T03:26:01.773392" elapsed="0.000909"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:01.775330" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.120" 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-04-17T03:26:01.774634" elapsed="0.000862"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:01.776714" 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-04-17T03:26:01.775777" elapsed="0.000990"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-17T03:26:01.778548" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:26:01.778725" 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-04-17T03:26:01.778147" elapsed="0.000621"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:01.779132" elapsed="0.000540"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:26:01.780932" level="INFO">Logging into '10.30.170.120:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:26:02.549756" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 17 03:26:02 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:25:20 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:26:01.780580" elapsed="0.769410"/>
</kw>
<msg time="2026-04-17T03:26:02.550101" 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-04-17T03:26:01.780117" elapsed="0.770202"/>
</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-04-17T03:26:01.777239" elapsed="0.773281"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:26:02.551875" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-17T03:26:02.565921" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-17T03:26:02.566399" level="INFO">${stdout} = </msg>
<msg time="2026-04-17T03:26:02.566636" 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-04-17T03:26:02.551054" elapsed="0.015696"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:26:02.567562" elapsed="0.001200"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:02.571148" 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-04-17T03:26:02.570296" elapsed="0.001007"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-17T03:26:02.571980" elapsed="0.000078"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:02.571545" elapsed="0.000625"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:02.571504" elapsed="0.000720"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:26:02.572671" elapsed="0.000093"/>
</return>
<status status="PASS" start="2026-04-17T03:26:02.572341" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:02.572316" elapsed="0.000644"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-17T03:26:02.573052" elapsed="0.000024"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:02.578227" elapsed="0.000478"/>
</kw>
<kw name="Open 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-04-17T03:26:02.579099" elapsed="0.000303"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:26:02.579670" elapsed="0.000280"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:02.573787" elapsed="0.006243"/>
</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-04-17T03:26:01.771028" elapsed="0.809186"/>
</kw>
<msg time="2026-04-17T03:26:02.580334" 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-04-17T03:26:01.767255" elapsed="0.813142"/>
</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-04-17T03:26:01.766557" elapsed="0.813925"/>
</kw>
<msg time="2026-04-17T03:26:02.580524" 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-04-17T03:26:01.765825" elapsed="0.814748"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:02.583530" elapsed="0.000371"/>
</kw>
<kw name="Open 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-04-17T03:26:02.584161" elapsed="0.000198"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:26:02.584513" 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-04-17T03:26:02.580880" elapsed="0.003793"/>
</kw>
<msg time="2026-04-17T03:26:02.584777" 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-04-17T03:26:01.764686" elapsed="0.820117"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:02.585466" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:02.585083" elapsed="0.000438"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-17T03:26:02.585577" elapsed="0.000044"/>
</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-04-17T03:26:01.763603" elapsed="0.822124"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:01.763406" elapsed="0.822360"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:01.763179" elapsed="0.822624"/>
</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-04-17T03:26:01.759322" elapsed="0.826543"/>
</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-04-17T03:26:02.586088" elapsed="0.000227"/>
</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-04-17T03:26:02.600862" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:02.600710" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:02.600680" elapsed="0.000287"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:02.601375" 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-04-17T03:26:02.601566" 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-04-17T03:26:02.601180" elapsed="0.000420"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:02.602098" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:02.601771" elapsed="0.000372"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:02.602547" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:02.602299" elapsed="0.000291"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:02.603481" 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-04-17T03:26:02.603226" elapsed="0.000372">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-17T03:26:02.603709" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:02.603756" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:02.602756" elapsed="0.001023"/>
</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-04-17T03:26:02.604125" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:02.603856" elapsed="0.000366"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:02.603837" elapsed="0.000415"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:02.605236" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:02.604881" elapsed="0.000389"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:02.605326" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:26:02.605517" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:02.604531" elapsed="0.001033"/>
</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-04-17T03:26:02.605870" elapsed="0.000537"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:02.606738" level="INFO">index=4
host=10.30.170.120
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-04-17T03:26:02.606857" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.120
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-04-17T03:26:02.606614" elapsed="0.000273"/>
</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-04-17T03:26:02.607088" elapsed="0.003139"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:02.610748" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:02.616087" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:02.610435" elapsed="0.006456">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:02.621004" elapsed="0.000425"/>
</kw>
<kw name="Open 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-04-17T03:26:02.621617" elapsed="0.000251"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:26:02.622072" elapsed="0.000113"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:02.618224" elapsed="0.004017"/>
</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-04-17T03:26:02.617416" elapsed="0.004873"/>
</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="FAIL" start="2026-04-17T03:26:02.600279" elapsed="0.022103">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:26:03.643273" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:03.643020" elapsed="0.000372"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:03.642966" elapsed="0.000465"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:03.644160" 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-04-17T03:26:03.644391" 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-04-17T03:26:03.643809" elapsed="0.000625"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:03.646348" 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-04-17T03:26:03.644693" elapsed="0.001812"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:03.647583" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:03.647092" elapsed="0.000566"/>
</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-04-17T03:26:03.648662" elapsed="0.000398"/>
</kw>
<msg time="2026-04-17T03:26:03.649254" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:03.649342" level="INFO">${old_connection_index} = 4</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:03.647971" elapsed="0.001411"/>
</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-04-17T03:26:03.650836" elapsed="0.000263"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:03.652200" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:03.651863" elapsed="0.001223">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:03.651365" elapsed="0.001816"/>
</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-04-17T03:26:03.653921" elapsed="0.000177"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:03.653440" elapsed="0.000725"/>
</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-04-17T03:26:03.650035" elapsed="0.004336"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:03.649550" elapsed="0.004897"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:03.649495" elapsed="0.005003"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:03.655824" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:03.655403" elapsed="0.000460"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:03.655972" elapsed="0.000077"/>
</return>
<msg time="2026-04-17T03:26:03.656283" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:03.654882" elapsed="0.001438"/>
</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-04-17T03:26:03.656558" elapsed="0.000740"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:03.657622" level="INFO">index=6
host=10.30.170.120
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-04-17T03:26:03.657734" level="INFO">${karaf_connection_object} = index=6
host=10.30.170.120
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-04-17T03:26:03.657489" elapsed="0.000274"/>
</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-04-17T03:26:03.657922" elapsed="0.002775"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:03.661196" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:03.662420" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:03.660871" elapsed="0.001954">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:03.666068" elapsed="0.000418"/>
</kw>
<kw name="Open 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-04-17T03:26:03.666663" elapsed="0.000159"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:26:03.667001" elapsed="0.000106"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:03.663760" elapsed="0.003401"/>
</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-04-17T03:26:03.663198" elapsed="0.004010"/>
</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="FAIL" start="2026-04-17T03:26:03.642214" elapsed="0.025086">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:26:04.686036" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:04.685821" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:04.685785" elapsed="0.000368"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:04.686675" 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-04-17T03:26:04.686863" 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-04-17T03:26:04.686426" elapsed="0.000477"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:04.687580" level="INFO">{1: 6}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:04.687155" elapsed="0.000490"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:04.688236" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:04.687867" elapsed="0.000433"/>
</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-04-17T03:26:04.689134" elapsed="0.000262"/>
</kw>
<msg time="2026-04-17T03:26:04.689534" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:04.689599" level="INFO">${old_connection_index} = 6</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:04.688537" elapsed="0.001095"/>
</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-04-17T03:26:04.691014" elapsed="0.000196"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:04.692168" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:04.691917" elapsed="0.000945">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:04.691452" elapsed="0.001512"/>
</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-04-17T03:26:04.693655" elapsed="0.000138"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:04.693201" elapsed="0.000657"/>
</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-04-17T03:26:04.690082" elapsed="0.003838"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:04.689738" elapsed="0.004271"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:04.689712" elapsed="0.004333"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:04.695162" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:04.694749" elapsed="0.000447"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:04.695261" elapsed="0.000045"/>
</return>
<msg time="2026-04-17T03:26:04.695465" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:04.694355" elapsed="0.001141"/>
</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-04-17T03:26:04.695713" elapsed="0.000605"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:04.696722" level="INFO">index=8
host=10.30.170.120
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-04-17T03:26:04.696862" level="INFO">${karaf_connection_object} = index=8
host=10.30.170.120
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-04-17T03:26:04.696562" elapsed="0.000337"/>
</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-04-17T03:26:04.697145" elapsed="0.003486"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:04.701260" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:04.702585" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:04.700871" elapsed="0.002342">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:04.707601" elapsed="0.000505"/>
</kw>
<kw name="Open 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-04-17T03:26:04.708346" elapsed="0.000204"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:26:04.708755" elapsed="0.000143"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:04.704474" elapsed="0.004519"/>
</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-04-17T03:26:04.703663" elapsed="0.005396"/>
</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="FAIL" start="2026-04-17T03:26:04.685279" elapsed="0.023891">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:26:05.727613" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:05.727445" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:05.727417" elapsed="0.000287"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:05.728124" 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-04-17T03:26:05.728249" 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-04-17T03:26:05.727912" elapsed="0.000365"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:05.728795" level="INFO">{1: 8}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:05.728462" elapsed="0.000383"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:05.729453" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:05.729162" elapsed="0.000339"/>
</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-04-17T03:26:05.730151" elapsed="0.000205"/>
</kw>
<msg time="2026-04-17T03:26:05.730461" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:05.730508" level="INFO">${old_connection_index} = 8</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:05.729675" elapsed="0.000855"/>
</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-04-17T03:26:05.731397" elapsed="0.000143"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:05.732390" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:05.732179" elapsed="0.000732">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:05.731787" elapsed="0.001210"/>
</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-04-17T03:26:05.733541" elapsed="0.000103"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:05.733195" elapsed="0.000497"/>
</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-04-17T03:26:05.730843" elapsed="0.002894"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:05.730609" elapsed="0.003178"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:05.730590" elapsed="0.003222"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:05.734654" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:05.734350" elapsed="0.000336"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:05.734737" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:26:05.734901" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:05.734054" elapsed="0.000876"/>
</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-04-17T03:26:05.735108" elapsed="0.000441"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:05.735875" level="INFO">index=10
host=10.30.170.120
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-04-17T03:26:05.735996" level="INFO">${karaf_connection_object} = index=10
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:05.735765" elapsed="0.000260"/>
</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-04-17T03:26:05.736181" elapsed="0.002523"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:05.739163" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:05.740373" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:05.738873" elapsed="0.001923">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:05.744004" elapsed="0.000365"/>
</kw>
<kw name="Open 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-04-17T03:26:05.744557" elapsed="0.000154"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:26:05.744862" elapsed="0.000118"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:05.741699" elapsed="0.003334"/>
</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-04-17T03:26:05.741129" elapsed="0.003951"/>
</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="FAIL" start="2026-04-17T03:26:05.726992" elapsed="0.018172">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:05.745305" level="FAIL">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<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="FAIL" start="2026-04-17T03:26:02.587118" elapsed="3.158289">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:02.586689" elapsed="3.158791"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:02.586541" elapsed="3.158982"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-04-17T03:26:02.586377" elapsed="3.159181"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-17T03:26:01.738050" elapsed="4.007570"/>
</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-04-17T03:26:05.748421" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:05.748306" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:05.748284" 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-04-17T03:26:05.753429" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:05.753321" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:05.753302" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:05.754488" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:05.754096" elapsed="0.000420"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:05.755014" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:05.754691" elapsed="0.000350"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:05.755086" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:26:05.755246" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:05.753740" elapsed="0.001530"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:05.761132" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:05.760997" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:05.760976" elapsed="0.000225"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:05.762466" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:05.762339" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:05.762321" elapsed="0.000215"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:05.763093" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:05.762708" elapsed="0.000413"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:05.763515" 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-04-17T03:26:05.763284" elapsed="0.000256"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:05.764790" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:05.764355" elapsed="0.001181">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:05.765680" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:05.765727" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:05.763753" elapsed="0.001998"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:05.766885" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:05.766483" elapsed="0.001210">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:05.767851" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:05.767992" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:05.765971" elapsed="0.002065"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:05.769106" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/030_bgp_functional_evpn.robot"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:05.768382" elapsed="0.000814">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/030_bgp_functional_evpn.robot"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:05.768126" elapsed="0.001289">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/030_bgp_functional_evpn.robot"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:05.768106" elapsed="0.001345">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/030_bgp_functional_evpn.robot"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:05.769620" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:05.769854" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:05.769708" elapsed="0.000341"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:05.769691" elapsed="0.000406"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:05.770141" elapsed="0.000022"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:05.772260" elapsed="0.000493"/>
</kw>
<kw name="Open 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-04-17T03:26:05.773159" elapsed="0.000314"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:26:05.773810" elapsed="0.000255"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:05.771404" elapsed="0.002770"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:05.770445" elapsed="0.003866"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:05.762047" elapsed="0.012354">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/030_bgp_functional_evpn.robot"</status>
</kw>
<msg time="2026-04-17T03:26:05.774507" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:05.774552" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/030_bgp_functional_evpn.robot"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:05.761359" elapsed="0.013218"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:05.774763" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:05.774653" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:05.774635" elapsed="0.000193"/>
</if>
<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-04-17T03:26:05.775714" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:05.775607" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:05.775589" elapsed="0.000191"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:05.776298" 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-04-17T03:26:05.776411" 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-04-17T03:26:05.775975" elapsed="0.000463"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:05.776866" level="INFO">{1: 10}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:05.776599" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:05.777348" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:05.777087" elapsed="0.000305"/>
</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-04-17T03:26:05.777923" elapsed="0.000315"/>
</kw>
<msg time="2026-04-17T03:26:05.778339" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:05.778385" level="INFO">${old_connection_index} = 10</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:05.777554" elapsed="0.000854"/>
</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-04-17T03:26:05.779616" elapsed="0.000258"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:05.781233" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:05.780970" elapsed="0.000728">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:05.780163" elapsed="0.001625"/>
</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-04-17T03:26:05.782795" elapsed="0.000332"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:05.782051" elapsed="0.001151"/>
</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-04-17T03:26:05.778706" elapsed="0.004580"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:05.778481" elapsed="0.004864"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:05.778464" elapsed="0.004908"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:05.784423" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:05.783868" elapsed="0.000584"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:05.784502" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:26:05.784658" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:05.783583" elapsed="0.001100"/>
</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-04-17T03:26:05.784846" elapsed="0.000467"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:05.785624" level="INFO">index=13
host=10.30.170.120
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-04-17T03:26:05.785728" level="INFO">${karaf_connection_object} = index=13
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:05.785512" elapsed="0.000244"/>
</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-04-17T03:26:05.785911" elapsed="0.002376"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:05.788777" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:05.790021" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:05.788473" elapsed="0.001936">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:05.793980" elapsed="0.000837"/>
</kw>
<kw name="Open 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-04-17T03:26:05.795112" elapsed="0.000413"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:26:05.795753" elapsed="0.000204"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:05.791302" elapsed="0.004740"/>
</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-04-17T03:26:05.790722" elapsed="0.005369"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:05.775359" elapsed="0.020887">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:05.796639" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:05.796733" elapsed="0.000024"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:26:05.760647" elapsed="0.036208">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:05.796984" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:05.797030" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:05.755656" elapsed="0.041398"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:05.797393" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:05.797134" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:05.797114" elapsed="0.000357"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:05.755503" elapsed="0.041991"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:05.755326" elapsed="0.042200"/>
</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-04-17T03:26:05.753026" elapsed="0.044560"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-17T03:26:05.746252" elapsed="0.051435"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:05.745783" elapsed="0.051956"/>
</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-04-17T03:26:01.732092" elapsed="4.065702"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:05.798318" level="INFO">${mininet_conn_id} = 15</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-04-17T03:26:05.797965" elapsed="0.000382"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:26:05.798856" level="INFO">${mininet_conn_id} = 15</msg>
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:26:05.798517" elapsed="0.000383"/>
</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-04-17T03:26:05.801093" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:26:05.801173" 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-04-17T03:26:05.800770" 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>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:05.801357" elapsed="0.000463"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:26:05.802695" level="INFO">Logging into '10.30.171.238:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:26:06.432034" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 17 03:26:06 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:25:23 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:26:05.802377" elapsed="0.629855"/>
</kw>
<msg time="2026-04-17T03:26:06.432326" 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-04-17T03:26:05.802013" elapsed="0.630407"/>
</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-04-17T03:26:05.800319" elapsed="0.632241"/>
</kw>
<msg time="2026-04-17T03:26:06.432617" 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-04-17T03:26:05.799820" elapsed="0.632846"/>
</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-04-17T03:26:05.799197" elapsed="0.633549"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:06.433489" level="INFO">Creating Session using : alias=config-session, url=http://10.30.170.120:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a44241e4f90&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-04-17T03:26:06.433082" elapsed="0.000604"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-04-17T03:26:06.443279" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-04-17T03:26:06.457307" 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-04-17T03:26:06.433871" elapsed="0.023574"/>
</kw>
<kw name="Assure_Library_Ipaddr" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:26:06.460559" level="INFO">Executing command 'bash -c 'cd "." &amp;&amp; python -c "import ipaddr"''.</msg>
<msg time="2026-04-17T03:26:06.493643" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:26:06.494082" level="INFO">${stdout} = </msg>
<msg time="2026-04-17T03:26:06.494161" level="INFO">${stderr} = </msg>
<msg time="2026-04-17T03:26:06.494228" 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-04-17T03:26:06.460233" elapsed="0.034035"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:26:06.496230" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-04-17T03:26:06.495689" elapsed="0.000615"/>
</kw>
<msg time="2026-04-17T03:26:06.496465" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-04-17T03:26:06.496531" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:06.494862" elapsed="0.001704"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:06.497660" 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-04-17T03:26:06.496869" elapsed="0.000832"/>
</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-04-17T03:26:06.498908" elapsed="0.000077"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:06.498041" elapsed="0.001011"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:06.497990" elapsed="0.001113"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-04-17T03:26:06.499373" elapsed="0.000066"/>
</return>
<status status="PASS" start="2026-04-17T03:26:06.499198" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:06.499173" elapsed="0.000363"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-04-17T03:26:06.499682" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:06.499625" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:06.499601" elapsed="0.000178"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:06.500055" elapsed="0.000037"/>
</kw>
<msg time="2026-04-17T03:26:06.500313" 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-04-17T03:26:06.459501" elapsed="0.040863"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-04-17T03:26:06.500640" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-17T03:26:06.500499" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:06.500470" elapsed="0.000280"/>
</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-04-17T03:26:06.501000" elapsed="0.000032"/>
</kw>
<arg>target_dir=.</arg>
<doc>Tests whether ipaddr module is present on ssh-connected machine, Puts ipaddr.py to target_dir if not.</doc>
<status status="PASS" start="2026-04-17T03:26:06.458112" elapsed="0.043009"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:26:06.506260" level="INFO">${EVPN_CONF_URL} = /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes</msg>
<arg>${EVPN_CONF_URL}</arg>
<arg>/rests/data/bgp-rib:application-rib=${ODL_SYSTEM_IP}/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:26:06.501408" elapsed="0.004901"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:26:06.510883" level="INFO">${EVPN_LOC_RIB} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</msg>
<arg>${EVPN_LOC_RIB}</arg>
<arg>/rests/data/bgp-rib:bgp-rib/rib=${RIB_NAME}/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=nonconfig</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:26:06.506478" elapsed="0.004467"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:26:06.515620" level="INFO">${EVPN_FAMILY_LOC_RIB} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig</msg>
<arg>${EVPN_FAMILY_LOC_RIB}</arg>
<arg>/rests/data/bgp-rib:bgp-rib/rib=${RIB_NAME}/loc-rib/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family?content=nonconfig</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:26:06.511120" elapsed="0.004548"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:26:06.540584" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l2vpn_evpn/empty_routes.vanadium/empty_routes.json</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:26:06.540183" elapsed="0.000430"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:26:06.541443" 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-04-17T03:26:06.541154" elapsed="0.000371">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-04-17T03:26:06.541659" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:26:06.540781" elapsed="0.000904"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:06.542265" 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-04-17T03:26:06.541853" elapsed="0.000439"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:26:06.542598" 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-04-17T03:26:06.542786" 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-04-17T03:26:06.542460" elapsed="0.000400"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:06.543293" 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-04-17T03:26:06.543041" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-17T03:26:06.543755" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:06.543411" elapsed="0.000402"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:26:06.544300" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:26:06.544003" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:06.543839" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:06.543390" elapsed="0.000994"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:26:06.545009" 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-04-17T03:26:06.544532" elapsed="0.000507"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:26:06.545089" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:26:06.545249" 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-04-17T03:26:06.538003" elapsed="0.007272"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:26:06.545786" level="INFO">${EMPTY_ROUTES} = {
  "bgp-rib:tables": [
    {
      "afi": "odl-bgp-evpn:l2vpn-address-family",
      "safi": "odl-bgp-evpn:evpn-subsequent-address-family",
      "attributes": {
        "uptodate": false
      }
   ...</msg>
<arg>${EMPTY_ROUTES}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:26:06.545447" elapsed="0.000382"/>
</kw>
<doc>Initialize SetupUtils. Suite setup keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:01.731705" elapsed="4.814182"/>
</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-04-17T03:26:06.549368" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:06.549101" 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-04-17T03:26:06.550763" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:06.550653" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:06.550634" 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-04-17T03:26:06.555767" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:06.555662" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:06.555644" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:06.556862" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:06.556479" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:06.557546" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:06.557245" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:06.557616" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:26:06.557808" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:06.556085" elapsed="0.001749"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:06.565822" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:06.565684" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:06.565666" elapsed="0.000226"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:06.567098" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:06.566990" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:06.566972" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:06.567619" level="INFO">${karaf_connection_index} = 13</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:06.567313" elapsed="0.000332"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:06.568051" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:06.567807" elapsed="0.000270"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:06.568890" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:06.568629" elapsed="0.001072">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:06.569951" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:06.570001" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:06.568281" elapsed="0.001744"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:06.570835" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:06.570590" elapsed="0.000911">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:06.571684" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:06.571730" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:06.570200" elapsed="0.001553"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:06.572680" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Configure_App_Peer"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:06.572067" elapsed="0.000675">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Configure_App_Peer"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:06.571827" elapsed="0.000985">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Configure_App_Peer"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:06.571809" elapsed="0.001037">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Configure_App_Peer"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:06.573041" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:06.573272" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:06.573129" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:06.573112" elapsed="0.000236"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:06.573380" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:06.575958" elapsed="0.000147"/>
</kw>
<msg time="2026-04-17T03:26:06.576167" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:06.574855" elapsed="0.001442"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:06.576570" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:06.576903" elapsed="0.000109"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:06.574234" 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-04-17T03:26:06.573660" 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="FAIL" start="2026-04-17T03:26:06.566664" elapsed="0.010604">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Configure_App_Peer"</status>
</kw>
<msg time="2026-04-17T03:26:06.577374" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:06.577417" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Configure_App_Peer"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:06.566067" elapsed="0.011373"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:06.577620" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:06.577514" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:06.577497" elapsed="0.000189"/>
</if>
<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-04-17T03:26:06.578568" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:06.578463" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:06.578446" elapsed="0.000188"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:06.578916" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:06.579041" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:06.578795" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:06.579521" level="INFO">{1: 13}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:06.579260" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:06.579980" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:06.579719" elapsed="0.000305"/>
</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-04-17T03:26:06.580553" elapsed="0.000259"/>
</kw>
<msg time="2026-04-17T03:26:06.580910" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:06.581024" level="INFO">${old_connection_index} = 13</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:06.580183" elapsed="0.000866"/>
</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-04-17T03:26:06.581899" elapsed="0.000207"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:06.584750" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:06.582754" elapsed="0.002971">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:06.582277" elapsed="0.003546"/>
</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-04-17T03:26:06.586860" elapsed="0.000332"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:06.586311" elapsed="0.000967"/>
</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-04-17T03:26:06.581360" elapsed="0.005964"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:06.581125" elapsed="0.006252"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:06.581107" elapsed="0.006300"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:06.588286" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:06.587977" elapsed="0.000336"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:06.588361" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:26:06.588514" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:06.587629" elapsed="0.000910"/>
</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-04-17T03:26:06.588694" elapsed="0.000444"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:06.589415" level="INFO">index=16
host=10.30.170.120
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-04-17T03:26:06.589514" level="INFO">${karaf_connection_object} = index=16
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:06.589309" elapsed="0.000230"/>
</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-04-17T03:26:06.589689" elapsed="0.002389"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:06.592515" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:06.593782" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:06.592245" elapsed="0.002011">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:06.608516" elapsed="0.000398"/>
</kw>
<msg time="2026-04-17T03:26:06.609324" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:06.607088" elapsed="0.002390"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:06.609641" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:06.609808" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:06.595086" elapsed="0.014805"/>
</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-04-17T03:26:06.594548" elapsed="0.015409"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:06.578170" elapsed="0.031997">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:06.610539" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:06.610613" 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="FAIL" start="2026-04-17T03:26:06.565346" elapsed="0.045377">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:06.610831" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:06.610876" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:06.558252" elapsed="0.052648"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:06.611397" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:06.611137" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:06.611116" elapsed="0.000359"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:06.558105" elapsed="0.053393"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:06.557896" elapsed="0.053636"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:06.555295" elapsed="0.056294"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:06.550358" elapsed="0.061288"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:06.549887" elapsed="0.061805"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:06.546714" elapsed="0.065030"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:26:06.612405" level="INFO">&amp;{mapping} = { BGP_RIB_OPENCONFIG=example-bgp-rib | IP=10.30.170.120 }</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-04-17T03:26:06.611921" elapsed="0.000512"/>
</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-04-17T03:26:06.647209" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:26:06.646782" elapsed="0.000462"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:26:06.648066" 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-04-17T03:26:06.647763" elapsed="0.000385">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-04-17T03:26:06.648243" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:26:06.647421" elapsed="0.000846"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:06.648826" 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-04-17T03:26:06.648432" elapsed="0.000421"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:26:06.649195" 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-04-17T03:26:06.649411" 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-04-17T03:26:06.649035" elapsed="0.000403"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:06.649850" 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-04-17T03:26:06.649598" 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-04-17T03:26:06.651026" level="INFO">mapping: {'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.170.120'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:06.650688" elapsed="0.000384"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:26:06.651507" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:26:06.651235" elapsed="0.000298"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:26:06.652230" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:26:06.651908" elapsed="0.000348"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:26:06.653018" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:26:06.652772" elapsed="0.000272"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:26:06.653098" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:26:06.653262" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:26:06.652450" elapsed="0.000837"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:26:06.653446" elapsed="0.000240"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:26:06.651767" elapsed="0.001960"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:26:06.654300" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:26:06.653996" elapsed="0.000330"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:26:06.655257" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:26:06.655042" elapsed="0.000241"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:26:06.655335" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:26:06.655513" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:26:06.654532" elapsed="0.001006"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:26:06.655692" elapsed="0.000223"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:26:06.653844" elapsed="0.002137"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:26:06.651587" elapsed="0.004431"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:26:06.656061" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:26:06.656221" level="INFO">${mapping_to_use} = {'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.170.120'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:26:06.650323" elapsed="0.005923"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:06.649995" elapsed="0.006284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:06.656460" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:06.656305" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:06.649969" elapsed="0.006567"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:26:06.657298" 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-04-17T03:26:06.656687" elapsed="0.000640"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:26:06.657376" 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-04-17T03:26:06.646104" elapsed="0.011395"/>
</kw>
<msg time="2026-04-17T03:26:06.657554" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:06.633088" elapsed="0.024514"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:26:06.670336" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:06.683002" 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-04-17T03:26:06.695927" elapsed="0.000049"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:06.696310" 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-04-17T03:26:06.696502" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:06.696901" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:06.696750" elapsed="0.000234"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:06.696733" 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-04-17T03:26:06.697157" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:06.697329" 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-04-17T03:26:06.697516" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:26:06.696698" elapsed="0.000873"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:26:06.696584" elapsed="0.001014"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:06.697747" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:26:06.697823" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:26:06.698032" 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-04-17T03:26:06.628576" elapsed="0.069486"/>
</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-04-17T03:26:06.725174" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:26:06.724753" elapsed="0.000451"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:26:06.726003" 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-04-17T03:26:06.725722" elapsed="0.000368">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-04-17T03:26:06.726186" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:26:06.725376" elapsed="0.000834"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:06.726762" 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-04-17T03:26:06.726375" elapsed="0.000415"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:26:06.727132" 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-04-17T03:26:06.727311" 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-04-17T03:26:06.726987" elapsed="0.000394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:06.727798" 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-04-17T03:26:06.727545" 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-04-17T03:26:06.728256" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:06.727917" elapsed="0.000398"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:26:06.728782" level="INFO">${mapping_to_use} = {'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.170.120'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:26:06.728488" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:06.728341" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:06.727897" elapsed="0.000970"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:26:06.729612" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.120&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-04-17T03:26:06.729031" elapsed="0.000611"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:26:06.729692" 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/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-04-17T03:26:06.724129" elapsed="0.005695"/>
</kw>
<msg time="2026-04-17T03:26:06.729879" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:06.711124" elapsed="0.018821"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:26:06.742874" elapsed="0.000033"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:06.755827" 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/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-04-17T03:26:06.777411" elapsed="0.000085"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:06.777809" 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-04-17T03:26:06.778081" 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-04-17T03:26:06.778598" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:06.778428" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:06.778407" 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-04-17T03:26:06.778849" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:06.779052" 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-04-17T03:26:06.779461" elapsed="0.000030"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:26:06.778358" elapsed="0.001171"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:26:06.778188" elapsed="0.001373"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:06.779720" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:26:06.779806" elapsed="0.000021"/>
</return>
<msg time="2026-04-17T03:26:06.780022" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.120&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-04-17T03:26:06.708396" elapsed="0.071662"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:26:06.781895" 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-04-17T03:26:06.781495" elapsed="0.000531">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-04-17T03:26:06.782152" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:26:06.781010" elapsed="0.001170"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:06.782581" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:06.782267" elapsed="0.000386"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:26:06.783335" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:26:06.782961" elapsed="0.000434"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:06.782684" elapsed="0.000751"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:06.782246" elapsed="0.001211"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:06.786559" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:06.783628" elapsed="0.002970"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:26:06.786673" elapsed="0.000047"/>
</return>
<msg time="2026-04-17T03:26:06.786981" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:26:06.780580" elapsed="0.006445"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:06.789275" 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.120</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:06.788899" elapsed="0.000429"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:06.789757" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.120&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-04-17T03:26:06.789500" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:06.790366" 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-04-17T03:26:06.790045" elapsed="0.000370"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:06.790905" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:06.790606" elapsed="0.000366"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:06.791918" 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-04-17T03:26:06.791653" elapsed="0.000310"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:26:06.792363" 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-04-17T03:26:06.792151" elapsed="0.000245"/>
</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-04-17T03:26:06.792602" elapsed="0.000246"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:06.793360" 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-04-17T03:26:06.793042" elapsed="0.000415"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:26:06.793502" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:26:06.793669" 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-04-17T03:26:06.791189" elapsed="0.002506"/>
</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-04-17T03:26:06.800132" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:26:07.002269" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:26:07.405155" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:26:07.408077" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:06.796425" elapsed="0.617959">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:06.793767" elapsed="0.620941">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:07.415344" elapsed="0.000062"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:07.414816" elapsed="0.000980"/>
</branch>
<status status="FAIL" start="2026-04-17T03:26:06.793749" elapsed="0.622115">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:07.416654" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:26:07.416807" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:07.416763" elapsed="0.000093"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:07.416741" elapsed="0.000138"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:07.417083" elapsed="0.000027"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:26:07.417163" elapsed="0.000017"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:26:06.787660" elapsed="0.629633">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:26:07.417378" elapsed="0.000018"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:26:06.617478" elapsed="0.800008">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:07.417922" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:07.417669" elapsed="0.000352"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:07.417650" elapsed="0.000396"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:26:07.418081" elapsed="0.000015"/>
</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="FAIL" start="2026-04-17T03:26:06.612693" elapsed="0.805496">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Configures bgp application peer. Openconfig is used for carbon and above.</doc>
<status status="FAIL" start="2026-04-17T03:26:06.545973" elapsed="0.872398">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:07.422025" elapsed="0.000284"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:07.421695" elapsed="0.000675"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:07.423604" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:07.423412" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:07.423392" elapsed="0.000285"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:07.429267" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:07.429133" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:07.429107" elapsed="0.000234"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:07.430516" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:07.430052" elapsed="0.000495"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:07.431071" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:07.430720" elapsed="0.000380"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:07.431147" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:26:07.431314" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:07.429586" elapsed="0.001753"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:07.437143" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:07.437027" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:07.437006" elapsed="0.000225"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:07.438556" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:07.438443" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:07.438424" elapsed="0.000202"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:07.439129" level="INFO">${karaf_connection_index} = 16</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:07.438779" elapsed="0.000378"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:07.439556" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:07.439326" elapsed="0.000258"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:07.440501" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:07.440217" elapsed="0.001091">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:07.441514" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:07.441564" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:07.439799" elapsed="0.001791"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:07.442408" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:07.442151" elapsed="0.000986">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:07.443332" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:07.443381" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:07.441768" elapsed="0.001637"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:07.444597" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Reconfigure_ODL_To_Accept_Connection"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:07.443750" elapsed="0.000935">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Reconfigure_ODL_To_Accept_Connection"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:07.443484" elapsed="0.001286">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Reconfigure_ODL_To_Accept_Connection"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:07.443464" elapsed="0.001341">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Reconfigure_ODL_To_Accept_Connection"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:07.445005" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:07.445245" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:07.445097" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:07.445080" elapsed="0.000243"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:07.445356" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:07.448027" elapsed="0.000151"/>
</kw>
<msg time="2026-04-17T03:26:07.448254" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:07.446881" elapsed="0.001546"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:07.448778" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:07.449150" 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-04-17T03:26:07.446229" elapsed="0.003111"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:07.445648" elapsed="0.003759"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:07.438120" elapsed="0.011376">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Reconfigure_ODL_To_Accept_Connection"</status>
</kw>
<msg time="2026-04-17T03:26:07.449603" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:07.449649" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Reconfigure_ODL_To_Accept_Connection"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:07.437430" elapsed="0.012243"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:07.449885" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:07.449752" elapsed="0.000391"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:07.449733" elapsed="0.000448"/>
</if>
<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-04-17T03:26:07.451269" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:07.451121" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:07.451097" elapsed="0.000243"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:07.451667" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:07.452082" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:07.451526" elapsed="0.000587"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:07.452642" level="INFO">{1: 16}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:07.452308" elapsed="0.000460"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:07.453207" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:07.452950" elapsed="0.000303"/>
</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-04-17T03:26:07.453818" elapsed="0.000296"/>
</kw>
<msg time="2026-04-17T03:26:07.454219" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:07.454269" level="INFO">${old_connection_index} = 16</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:07.453424" elapsed="0.000868"/>
</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-04-17T03:26:07.455227" elapsed="0.000201"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:07.456605" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:07.456172" elapsed="0.001381">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:07.455603" elapsed="0.002053"/>
</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-04-17T03:26:07.458337" elapsed="0.000285"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:07.457834" elapsed="0.000874"/>
</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-04-17T03:26:07.454603" elapsed="0.004153"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:07.454371" elapsed="0.004436"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:07.454353" elapsed="0.004480"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:07.459917" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:07.459519" elapsed="0.000454"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:07.460044" elapsed="0.000045"/>
</return>
<msg time="2026-04-17T03:26:07.460254" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:07.459131" elapsed="0.001155"/>
</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-04-17T03:26:07.460502" elapsed="0.000530"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:07.461568" level="INFO">index=17
host=10.30.170.120
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-04-17T03:26:07.461680" level="INFO">${karaf_connection_object} = index=17
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:07.461211" elapsed="0.000497"/>
</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-04-17T03:26:07.461874" elapsed="0.002537"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:07.464882" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:07.466100" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:07.464589" elapsed="0.001931">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:07.481242" elapsed="0.000405"/>
</kw>
<msg time="2026-04-17T03:26:07.481744" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:07.479711" elapsed="0.002189"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:07.482093" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:07.482263" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:07.467573" elapsed="0.014778"/>
</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-04-17T03:26:07.466853" elapsed="0.015547"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:07.450642" elapsed="0.031846">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:07.483160" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:07.483242" 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="FAIL" start="2026-04-17T03:26:07.436633" elapsed="0.046728">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:07.483485" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:07.483531" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:07.431811" elapsed="0.051745"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:07.483953" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:07.483641" elapsed="0.000376"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:07.483621" elapsed="0.000423"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:07.431651" elapsed="0.052418"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:07.431402" elapsed="0.052701"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:07.428714" elapsed="0.055449"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:07.423094" elapsed="0.061129"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:07.422540" elapsed="0.061732"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:07.419262" elapsed="0.065068"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:26:07.485167" level="INFO">&amp;{mapping} = { IP=10.30.171.238 | 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-04-17T03:26:07.484514" elapsed="0.000684"/>
</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-04-17T03:26:07.521159" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:26:07.520676" elapsed="0.000518"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:26:07.522141" 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-04-17T03:26:07.521747" elapsed="0.000499">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-04-17T03:26:07.522357" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:26:07.521372" elapsed="0.001011"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:07.523042" 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-04-17T03:26:07.522588" elapsed="0.000483"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:26:07.523386" 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-04-17T03:26:07.523569" 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-04-17T03:26:07.523239" elapsed="0.000357"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:07.524044" 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-04-17T03:26:07.523766" elapsed="0.000328"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:07.525203" level="INFO">mapping: {'IP': '10.30.171.238', '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-04-17T03:26:07.524903" elapsed="0.000401"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:26:07.525759" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:26:07.525475" elapsed="0.000312"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:26:07.526548" level="INFO">${value} = 10.30.171.238</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:26:07.526219" elapsed="0.000356"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:26:07.527357" level="INFO">${encoded} = 10.30.171.238</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:26:07.527125" elapsed="0.000258"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:26:07.527438" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:26:07.527606" level="INFO">${encoded_value} = 10.30.171.238</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:26:07.526771" 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-04-17T03:26:07.527789" elapsed="0.000268"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.238</var>
<status status="PASS" start="2026-04-17T03:26:07.526061" elapsed="0.002039"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:26:07.528754" 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-04-17T03:26:07.528444" elapsed="0.000337"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:26:07.529556" 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-04-17T03:26:07.529332" elapsed="0.000252"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:26:07.529635" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:26:07.529791" 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-04-17T03:26:07.529001" elapsed="0.000816"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:26:07.529990" elapsed="0.000232"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:26:07.528287" elapsed="0.001976"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:26:07.531041" 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-04-17T03:26:07.530544" elapsed="0.000524"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:26:07.531805" 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-04-17T03:26:07.531588" elapsed="0.000243"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:26:07.531881" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:26:07.532059" 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-04-17T03:26:07.531261" elapsed="0.000823"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:26:07.532259" elapsed="0.000236"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:26:07.530407" elapsed="0.002131"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:26:07.533183" 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-04-17T03:26:07.532840" elapsed="0.000370"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:26:07.534035" 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-04-17T03:26:07.533796" elapsed="0.000266"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:26:07.534112" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:26:07.534268" 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-04-17T03:26:07.533440" 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-04-17T03:26:07.534453" elapsed="0.000254"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:26:07.532656" elapsed="0.002098"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:26:07.535371" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:26:07.535063" elapsed="0.000335"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:26:07.536278" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:26:07.535967" elapsed="0.000345"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:26:07.536376" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:26:07.536541" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:26:07.535595" elapsed="0.000976"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:26:07.536773" elapsed="0.000312"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:26:07.534894" elapsed="0.002241"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:26:07.537722" 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-04-17T03:26:07.537403" elapsed="0.000352"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:26:07.538525" 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-04-17T03:26:07.538309" elapsed="0.000244"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:26:07.538614" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:26:07.538784" 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-04-17T03:26:07.537977" 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-04-17T03:26:07.538991" elapsed="0.000235"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:26:07.537263" elapsed="0.002005"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:26:07.525845" elapsed="0.013459"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:26:07.539355" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:26:07.539545" level="INFO">${mapping_to_use} = {'IP': '10.30.171.238', '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-04-17T03:26:07.524545" elapsed="0.015028"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:07.524195" elapsed="0.015416"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:07.539830" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:07.539641" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:07.524150" elapsed="0.015805"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:26:07.540855" 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-04-17T03:26:07.540119" elapsed="0.000767"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:26:07.540952" 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/bgp_peer.vanadium/${file_name} 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-04-17T03:26:07.519895" elapsed="0.021186"/>
</kw>
<msg time="2026-04-17T03:26:07.541138" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:07.506179" elapsed="0.035010"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:26:07.555712" 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/bgp_peer.vanadium/${file_name} 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-04-17T03:26:07.568798" 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/bgp_peer.vanadium/${file_name} 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-04-17T03:26:07.581921" elapsed="0.000042"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:07.582242" 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-04-17T03:26:07.582429" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:07.582843" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:07.582689" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:07.582672" 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-04-17T03:26:07.583090" 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-04-17T03:26:07.583263" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:07.583435" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:26:07.582633" elapsed="0.000855"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:26:07.582514" elapsed="0.001002"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:07.583693" elapsed="0.000036"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:26:07.583791" elapsed="0.000024"/>
</return>
<msg time="2026-04-17T03:26:07.583977" 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-04-17T03:26:07.501230" elapsed="0.082778"/>
</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-04-17T03:26:07.611186" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:26:07.610770" elapsed="0.000444"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:26:07.612025" 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-04-17T03:26:07.611730" elapsed="0.000375">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-04-17T03:26:07.612201" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:26:07.611378" elapsed="0.000847"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:07.612834" 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-04-17T03:26:07.612391" elapsed="0.000471"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:26:07.613390" 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-04-17T03:26:07.613961" 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-04-17T03:26:07.613066" elapsed="0.000944"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:07.614885" 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-04-17T03:26:07.614466" elapsed="0.000586"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-17T03:26:07.615630" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:07.615155" elapsed="0.000559"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:26:07.616611" level="INFO">${mapping_to_use} = {'IP': '10.30.171.238', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:26:07.616034" elapsed="0.000617"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:07.615764" elapsed="0.000937"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:07.615127" elapsed="0.001605"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:26:07.618220" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.238&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflec...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:26:07.617390" elapsed="0.000861"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:26:07.618303" elapsed="0.000033"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:26:07.610130" elapsed="0.008303"/>
</kw>
<msg time="2026-04-17T03:26:07.618492" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:07.596990" elapsed="0.021548"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:26:07.633593" 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/bgp_peer.vanadium/${file_name} 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-04-17T03:26:07.646200" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name} 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-04-17T03:26:07.658875" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:07.659104" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:07.659283" elapsed="0.000019"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:07.659683" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:07.659533" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:07.659516" 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-04-17T03:26:07.659907" 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-04-17T03:26:07.660090" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:07.660254" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:26:07.659479" elapsed="0.000826"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:26:07.659366" elapsed="0.000967"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:07.660538" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:26:07.660617" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:26:07.660775" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.238&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflec...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:26:07.594242" elapsed="0.066562"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:26:07.662244" 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-04-17T03:26:07.661953" elapsed="0.000362">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-04-17T03:26:07.662414" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:26:07.661535" elapsed="0.000903"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:07.662775" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:07.662508" elapsed="0.000324"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:26:07.663374" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:26:07.663077" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:07.662856" elapsed="0.000579"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:07.662490" elapsed="0.000967"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:07.665898" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:07.663608" elapsed="0.002316"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:26:07.665992" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:26:07.666162" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:26:07.661184" elapsed="0.005003"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:07.667601" 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.238</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:07.667346" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:07.668068" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.238&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-04-17T03:26:07.667805" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:07.668580" 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-04-17T03:26:07.668277" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:07.669030" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:07.668773" elapsed="0.000300"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:07.669974" 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-04-17T03:26:07.669740" elapsed="0.000261"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:26:07.670337" 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-04-17T03:26:07.670164" elapsed="0.000198"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:26:07.670557" elapsed="0.000209"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:07.671192" 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-04-17T03:26:07.670943" elapsed="0.000293"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:26:07.671279" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:26:07.671433" 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-04-17T03:26:07.669332" elapsed="0.002125"/>
</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-04-17T03:26:07.678304" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:26:07.880049" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:26:08.283082" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:26:08.285342" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:07.675317" elapsed="0.612872">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:07.671525" elapsed="0.616807">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:08.288682" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:08.288398" elapsed="0.000408"/>
</branch>
<status status="FAIL" start="2026-04-17T03:26:07.671508" elapsed="0.617325">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:08.289358" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:26:08.289644" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:08.289562" elapsed="0.000177"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:08.289522" elapsed="0.000263"/>
</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-04-17T03:26:08.290136" elapsed="0.000048"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:26:08.290284" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:26:07.666521" elapsed="0.623997">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:26:08.290755" elapsed="0.000034"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:26:07.490219" elapsed="0.800775">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:08.291609" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:08.291222" elapsed="0.000529"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:08.291189" elapsed="0.000615"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:26:08.291875" elapsed="0.000030"/>
</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="FAIL" start="2026-04-17T03:26:07.485488" elapsed="0.806633">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Configures BGP peer module with initiate-connection set to false.</doc>
<status status="FAIL" start="2026-04-17T03:26:07.418642" elapsed="0.873830">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:08.298105" elapsed="0.000390"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:08.297646" elapsed="0.000947"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:08.300062" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:08.299857" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:08.299826" elapsed="0.000342"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:08.307651" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:08.307473" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:08.307442" elapsed="0.000321"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:08.309441" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:08.308748" elapsed="0.000734"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:08.310173" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:08.309720" elapsed="0.000489"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:08.310272" elapsed="0.000052"/>
</return>
<msg time="2026-04-17T03:26:08.310514" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:08.308183" elapsed="0.002368"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:08.317904" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:08.317770" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:08.317746" 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-04-17T03:26:08.319544" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:08.319429" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:08.319409" elapsed="0.000206"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:08.320132" level="INFO">${karaf_connection_index} = 17</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:08.319770" elapsed="0.000391"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:08.320646" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:08.320359" elapsed="0.000321"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:08.321923" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:08.321540" elapsed="0.001437">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:08.323236" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:08.323301" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:08.321055" elapsed="0.002279"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:08.324435" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:08.324092" elapsed="0.001339">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:08.325680" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:08.325742" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:08.323579" elapsed="0.002197"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:08.327103" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Start_Bgp_Peer"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:08.326236" elapsed="0.000955">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Start_Bgp_Peer"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:08.325890" elapsed="0.001401">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Start_Bgp_Peer"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:08.325858" elapsed="0.001792">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Start_Bgp_Peer"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:08.327904" elapsed="0.000066"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:08.328275" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:08.328068" elapsed="0.000280"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:08.328042" elapsed="0.000341"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:08.328429" elapsed="0.000023"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:08.331877" elapsed="0.000273"/>
</kw>
<msg time="2026-04-17T03:26:08.332242" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:08.330397" elapsed="0.002025"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:08.332777" elapsed="0.000098"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:08.333328" 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-04-17T03:26:08.329666" 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-04-17T03:26:08.328859" elapsed="0.004987"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:08.319034" elapsed="0.014941">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Start_Bgp_Peer"</status>
</kw>
<msg time="2026-04-17T03:26:08.334118" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:08.334165" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Start_Bgp_Peer"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:08.318195" elapsed="0.015995"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:08.334437" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:08.334288" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:08.334258" elapsed="0.000252"/>
</if>
<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-04-17T03:26:08.335554" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:08.335444" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:08.335424" elapsed="0.000217"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:08.336114" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:08.336261" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:08.335869" elapsed="0.000429"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:08.336920" level="INFO">{1: 17}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:08.336564" elapsed="0.000434"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:08.337445" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:08.337189" elapsed="0.000301"/>
</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-04-17T03:26:08.338132" elapsed="0.000279"/>
</kw>
<msg time="2026-04-17T03:26:08.338541" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:08.338599" level="INFO">${old_connection_index} = 17</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:08.337704" elapsed="0.000923"/>
</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-04-17T03:26:08.339680" elapsed="0.000406"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:08.341476" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:08.340928" elapsed="0.001563">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:08.340309" elapsed="0.002287"/>
</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-04-17T03:26:08.343399" elapsed="0.000386"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:08.342828" elapsed="0.001077"/>
</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-04-17T03:26:08.339047" elapsed="0.004971"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:08.338734" elapsed="0.005357"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:08.338709" elapsed="0.005422"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:08.345339" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:08.344851" elapsed="0.000527"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:08.345454" elapsed="0.000048"/>
</return>
<msg time="2026-04-17T03:26:08.345672" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:08.344450" elapsed="0.001250"/>
</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-04-17T03:26:08.345866" elapsed="0.000542"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:08.346788" level="INFO">index=18
host=10.30.170.120
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-04-17T03:26:08.346945" level="INFO">${karaf_connection_object} = index=18
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:08.346629" elapsed="0.000357"/>
</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-04-17T03:26:08.347198" elapsed="0.003332"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:08.351076" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:08.352494" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:08.350770" elapsed="0.002172">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:08.370606" elapsed="0.000706"/>
</kw>
<msg time="2026-04-17T03:26:08.371423" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:08.368636" elapsed="0.002957"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:08.371769" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:08.371961" elapsed="0.000023"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:08.353904" elapsed="0.018150"/>
</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-04-17T03:26:08.353323" elapsed="0.018784"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:08.335043" elapsed="0.037238">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:08.372798" elapsed="0.000038"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:08.372904" elapsed="0.000413"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:26:08.317256" elapsed="0.056176">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:08.373746" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:08.373798" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:08.311126" elapsed="0.062696"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:08.374207" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:08.373912" elapsed="0.000351"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:08.373890" elapsed="0.000399"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:08.310890" elapsed="0.063423"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:08.310633" elapsed="0.063716"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:08.306814" elapsed="0.067600"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:08.299494" elapsed="0.074981"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:08.298823" elapsed="0.075701"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:08.294370" elapsed="0.080209"/>
</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-04-17T03:26:08.377204" level="INFO">${command} = python3 play.py --amount 0 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --peerport=1790 --debug --evpn --wfr 1 &amp;&gt; play.py.out</msg>
<var>${command}</var>
<arg>python3 play.py ${arguments} &amp;&gt; ${BGPSpeaker__OUTPUT_LOG}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:26:08.376557" elapsed="0.000679"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:08.378074" level="INFO">python3 play.py --amount 0 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --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-04-17T03:26:08.377675" elapsed="0.000464"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:08.381911" level="INFO">python3 play.py --amount 0 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --peerport=1790 --debug --evpn --wfr 1 &amp;&gt; play.py.out</msg>
<msg time="2026-04-17T03:26:08.382062" level="INFO">${output} =  python3 play.py --amount 0 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --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-04-17T03:26:08.378358" elapsed="0.003740"/>
</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-04-17T03:26:08.375929" elapsed="0.006261"/>
</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-04-17T03:26:14.385283" 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-04-17T03:26:08.384599" elapsed="6.001653">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-04-17T03:26:14.386663" 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-04-17T03:26:08.384211" elapsed="6.002683">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-04-17T03:26:08.383598" elapsed="6.003488"/>
</kw>
<msg time="2026-04-17T03:26:14.387254" 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-04-17T03:26:08.383048" elapsed="6.004242"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-04-17T03:26:14.387554" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-04-17T03:26:14.387421" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:14.387383" elapsed="0.000428"/>
</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-04-17T03:26:14.388183" elapsed="0.000041"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was seen but it was not expected yet</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:14.388443" elapsed="0.000029"/>
</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-04-17T03:26:08.382600" elapsed="6.005960"/>
</kw>
<doc>Starts bgp peer and verifies that the peer runs.</doc>
<status status="PASS" start="2026-04-17T03:26:08.375449" elapsed="6.013187"/>
</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-04-17T03:26:08.374811" elapsed="6.013900"/>
</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-04-17T03:26:08.293221" elapsed="6.095675"/>
</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-04-17T03:26:14.395181" elapsed="0.000306"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:14.394782" elapsed="0.000785"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:14.396856" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:14.396705" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:14.396672" elapsed="0.000284"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:14.403513" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:14.403345" elapsed="0.000244"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:14.403315" elapsed="0.000307"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:14.405178" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:14.404555" elapsed="0.000665"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:14.405924" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:14.405451" elapsed="0.000532"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:14.406043" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:26:14.406221" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:14.404008" elapsed="0.002238"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:14.413729" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:14.413547" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:14.413514" elapsed="0.000319"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:14.415988" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:14.415729" elapsed="0.000369"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:14.415703" elapsed="0.000454"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:14.416868" level="INFO">${karaf_connection_index} = 18</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:14.416334" elapsed="0.000625"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:14.417687" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:14.417337" elapsed="0.000416"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:14.420696" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:14.420102" elapsed="0.001416">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:14.421715" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:14.421850" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:14.418138" elapsed="0.003863"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:14.425010" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:14.424413" elapsed="0.001382">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:14.426059" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:14.426190" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:14.422471" elapsed="0.003795"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:14.428535" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_es_arb"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:14.427294" elapsed="0.001512">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_es_arb"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:14.426763" elapsed="0.002218">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_es_arb"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:14.426727" elapsed="0.002371">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_es_arb"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:14.429333" elapsed="0.000033"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:14.429958" elapsed="0.000067"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:14.429600" elapsed="0.000518"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:14.429572" elapsed="0.000619"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:14.430248" 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-04-17T03:26:14.435607" elapsed="0.000209"/>
</kw>
<msg time="2026-04-17T03:26:14.435912" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:14.434761" elapsed="0.001273"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:14.436319" elapsed="0.000032"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:14.436620" elapsed="0.000029"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:14.433469" elapsed="0.003436"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:14.430670" elapsed="0.006375"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:14.415075" elapsed="0.022195">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_es_arb"</status>
</kw>
<msg time="2026-04-17T03:26:14.437424" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:14.437485" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_es_arb"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:14.414139" elapsed="0.023380"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:14.437801" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:14.437644" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:14.437609" elapsed="0.000288"/>
</if>
<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-04-17T03:26:14.439733" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:14.439559" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:14.439533" elapsed="0.000290"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:14.440400" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:14.440548" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:14.440214" elapsed="0.000371"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:14.441307" level="INFO">{1: 18}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:14.440808" elapsed="0.000563"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:14.442060" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:14.441593" elapsed="0.000528"/>
</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-04-17T03:26:14.442902" elapsed="0.000523"/>
</kw>
<msg time="2026-04-17T03:26:14.443777" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:14.443843" level="INFO">${old_connection_index} = 18</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:14.442344" elapsed="0.001532"/>
</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-04-17T03:26:14.446391" elapsed="0.000504"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:14.450290" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:14.450080" elapsed="0.000802">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:14.447278" elapsed="0.003771"/>
</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-04-17T03:26:14.452320" elapsed="0.000130"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:14.451467" elapsed="0.001090"/>
</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-04-17T03:26:14.444399" elapsed="0.008273"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:14.444081" elapsed="0.008658"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:14.444052" elapsed="0.008723"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:14.454332" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:14.453583" elapsed="0.000804"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:14.454593" elapsed="0.000051"/>
</return>
<msg time="2026-04-17T03:26:14.454814" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:14.453089" elapsed="0.001760"/>
</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-04-17T03:26:14.455098" elapsed="0.001037"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:14.456523" level="INFO">index=19
host=10.30.170.120
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-04-17T03:26:14.456686" level="INFO">${karaf_connection_object} = index=19
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:14.456363" elapsed="0.000367"/>
</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-04-17T03:26:14.456956" elapsed="0.010396"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:14.468338" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:14.469547" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:14.467615" elapsed="0.002558">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:14.476529" elapsed="0.000175"/>
</kw>
<msg time="2026-04-17T03:26:14.476795" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:14.475260" elapsed="0.001741"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:14.478145" elapsed="0.000072"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:14.479090" elapsed="0.000068"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:14.471379" elapsed="0.007897"/>
</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-04-17T03:26:14.470621" elapsed="0.008764"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:14.439135" elapsed="0.040343">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:14.479977" elapsed="0.000030"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:14.480061" 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="FAIL" start="2026-04-17T03:26:14.412963" elapsed="0.067215">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:14.480295" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:14.480341" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:14.406692" elapsed="0.073673"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:14.480783" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:14.480512" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:14.480491" elapsed="0.000373"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:14.406539" elapsed="0.074349"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:14.406309" elapsed="0.074613"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:14.402744" elapsed="0.078258"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:14.396364" elapsed="0.084698"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:14.395778" 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-04-17T03:26:14.391618" elapsed="0.089548"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:14.484225" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:14.685873" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:15.088656" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:15.091318" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:14.481612" elapsed="0.615095">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:15.097266" elapsed="0.000061"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:15.097706" elapsed="0.000063"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:15.098392" elapsed="0.000058"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:14.481322" elapsed="0.617369">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:14.390817" elapsed="0.708031">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:14.389487" elapsed="0.709721">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:15.104708" elapsed="0.000242"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:15.104430" 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-04-17T03:26:15.106082" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:15.105949" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:15.105909" elapsed="0.000307"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:15.111252" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:15.111142" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:15.111124" elapsed="0.000197"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:15.112382" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:15.111984" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:15.112870" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:15.112572" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:15.112956" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:26:15.113118" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:15.111553" elapsed="0.001589"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:15.120572" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:15.120385" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:15.120353" elapsed="0.000347"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:15.122467" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:15.122272" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:15.122253" elapsed="0.000383"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:15.123293" level="INFO">${karaf_connection_index} = 19</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:15.122797" elapsed="0.000561"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:15.124177" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:15.123764" elapsed="0.000490"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:15.126995" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:15.126298" elapsed="0.001301">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:15.127867" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:15.127997" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:15.124631" elapsed="0.003429"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:15.130722" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:15.130280" elapsed="0.001058">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:15.131483" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:15.131580" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:15.128467" elapsed="0.003192"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:15.133244" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_es_arb"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:15.132439" elapsed="0.001014">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_es_arb"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:15.132067" elapsed="0.001497">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_es_arb"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:15.132041" elapsed="0.001603">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_es_arb"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:15.133817" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:15.134265" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:15.134056" elapsed="0.000326"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:15.134034" elapsed="0.000407"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:15.134480" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:15.138543" elapsed="0.000200"/>
</kw>
<msg time="2026-04-17T03:26:15.138794" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:15.137953" 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-04-17T03:26:15.139250" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:15.139473" 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-04-17T03:26:15.137175" elapsed="0.002547"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:15.134781" elapsed="0.005034"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:15.121743" elapsed="0.018287">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_es_arb"</status>
</kw>
<msg time="2026-04-17T03:26:15.140141" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:15.140186" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_es_arb"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:15.120922" elapsed="0.019289"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:15.140397" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:15.140289" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:15.140271" elapsed="0.000191"/>
</if>
<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-04-17T03:26:15.141353" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:15.141247" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:15.141228" elapsed="0.000192"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:15.141702" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:15.141807" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:15.141575" elapsed="0.000260"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:15.142360" level="INFO">{1: 19}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:15.142013" elapsed="0.000394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:15.142867" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:15.142563" elapsed="0.000349"/>
</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-04-17T03:26:15.143563" elapsed="0.000465"/>
</kw>
<msg time="2026-04-17T03:26:15.144273" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:15.144321" level="INFO">${old_connection_index} = 19</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:15.143173" elapsed="0.001171"/>
</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-04-17T03:26:15.146146" elapsed="0.000384"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:15.148102" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:15.147682" elapsed="0.000919">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:15.146835" elapsed="0.001879"/>
</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-04-17T03:26:15.149952" elapsed="0.000125"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:15.149051" elapsed="0.001224"/>
</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-04-17T03:26:15.144645" elapsed="0.005733"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:15.144421" elapsed="0.006008"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:15.144402" elapsed="0.006053"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:15.152485" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:15.151128" elapsed="0.001401"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:15.152693" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:26:15.152858" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:15.150676" elapsed="0.002207"/>
</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-04-17T03:26:15.153100" elapsed="0.000657"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:15.154062" level="INFO">index=20
host=10.30.170.120
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-04-17T03:26:15.154164" level="INFO">${karaf_connection_object} = index=20
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:15.153949" elapsed="0.000242"/>
</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-04-17T03:26:15.154344" elapsed="0.008510"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:15.163499" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:15.164834" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:15.163045" elapsed="0.002189">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:15.170555" elapsed="0.000148"/>
</kw>
<msg time="2026-04-17T03:26:15.170788" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:15.169734" 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-04-17T03:26:15.172100" elapsed="0.000069"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:15.173031" elapsed="0.000066"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:15.166315" elapsed="0.006895"/>
</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-04-17T03:26:15.165530" elapsed="0.023987"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:15.140946" elapsed="0.048666">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:15.190113" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:15.190194" 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="FAIL" start="2026-04-17T03:26:15.119664" elapsed="0.070648">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:15.190451" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:15.190505" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:15.113538" elapsed="0.076991"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:15.190901" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:15.190614" elapsed="0.000365"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:15.190594" elapsed="0.000411"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:15.113377" elapsed="0.077653"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:15.113198" elapsed="0.077866"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:15.110755" elapsed="0.080371"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:15.105620" elapsed="0.085564"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:15.105169" elapsed="0.086062"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:15.101634" elapsed="0.089653"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:15.194579" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:15.447136" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:15.850174" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:15.853571" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:15.191868" elapsed="0.667149">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:15.859315" elapsed="0.000032"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:15.859509" elapsed="0.000022"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:15.859800" elapsed="0.000027"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:15.191445" elapsed="0.668523">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:15.101034" elapsed="0.759017">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:15.100153" elapsed="0.760079">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:15.864533" elapsed="0.000261"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:15.864254" elapsed="0.000620"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:15.866229" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:15.866067" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:15.866041" 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-04-17T03:26:15.871387" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:15.871280" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:15.871262" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:15.872510" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:15.872087" elapsed="0.000451"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:15.873020" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:15.872701" elapsed="0.000344"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:15.873089" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:26:15.873251" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:15.871689" elapsed="0.001586"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:15.880794" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:15.880686" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:15.880668" 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-04-17T03:26:15.882595" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:15.882413" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:15.882395" elapsed="0.000359"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:15.883348" level="INFO">${karaf_connection_index} = 20</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:15.882909" elapsed="0.000502"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:15.884051" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:15.883764" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:15.886441" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:15.886004" elapsed="0.001044">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:15.887194" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:15.887288" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:15.884420" elapsed="0.002926"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:15.889795" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:15.889303" elapsed="0.001152">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:15.890614" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:15.890715" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:15.887752" elapsed="0.003025"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:15.892440" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_es_as"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:15.891605" elapsed="0.001041">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_es_as"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:15.891196" elapsed="0.001562">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_es_as"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:15.891170" elapsed="0.001669">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_es_as"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:15.893032" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:15.893455" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:15.893246" elapsed="0.000326"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:15.893227" elapsed="0.000403"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:15.893669" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:15.897600" elapsed="0.000150"/>
</kw>
<msg time="2026-04-17T03:26:15.897874" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:15.896922" elapsed="0.001051"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:15.898197" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:15.898413" 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-04-17T03:26:15.896167" elapsed="0.002462"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:15.894022" elapsed="0.004691"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:15.881963" elapsed="0.016911">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_es_as"</status>
</kw>
<msg time="2026-04-17T03:26:15.898996" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:15.899042" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_es_as"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:15.881096" elapsed="0.017969"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:15.899251" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:15.899143" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:15.899124" elapsed="0.000240"/>
</if>
<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-04-17T03:26:15.900548" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:15.900438" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:15.900417" elapsed="0.000199"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:15.900902" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:15.901026" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:15.900773" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:15.901532" level="INFO">{1: 20}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:15.901208" elapsed="0.000370"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:15.902097" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:15.901735" elapsed="0.000406"/>
</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-04-17T03:26:15.902682" elapsed="0.000405"/>
</kw>
<msg time="2026-04-17T03:26:15.903342" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:15.903392" level="INFO">${old_connection_index} = 20</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:15.902305" elapsed="0.001111"/>
</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-04-17T03:26:15.905374" elapsed="0.000385"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:15.907437" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:15.906853" elapsed="0.001447">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:15.906162" elapsed="0.002299"/>
</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-04-17T03:26:15.909879" elapsed="0.000178"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:15.908901" elapsed="0.001302"/>
</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-04-17T03:26:15.903731" elapsed="0.006606"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:15.903495" elapsed="0.006914"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:15.903476" elapsed="0.007006"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:15.911805" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:15.911243" elapsed="0.000604"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:15.912070" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:26:15.912251" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:15.910805" elapsed="0.001472"/>
</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-04-17T03:26:15.912471" elapsed="0.000647"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:15.913419" level="INFO">index=21
host=10.30.170.120
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-04-17T03:26:15.913524" level="INFO">${karaf_connection_object} = index=21
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:15.913305" elapsed="0.000246"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:26:15.913707" elapsed="0.008760"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:15.923131" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:15.924353" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:15.922644" elapsed="0.002120">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:15.930579" elapsed="0.000166"/>
</kw>
<msg time="2026-04-17T03:26:15.930896" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:15.929460" elapsed="0.001615"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:15.932068" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:15.933143" elapsed="0.000084"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:15.925761" elapsed="0.007609"/>
</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-04-17T03:26:15.925108" elapsed="0.008410"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:15.899825" elapsed="0.033811">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:15.934319" elapsed="0.000038"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:15.934427" 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="FAIL" start="2026-04-17T03:26:15.880338" elapsed="0.054219">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:15.934712" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:15.934773" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:15.873664" elapsed="0.061140"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:15.935294" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:15.934920" elapsed="0.000446"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:15.934892" elapsed="0.000509"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:15.873516" elapsed="0.061920"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:15.873333" elapsed="0.062148"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:15.870901" elapsed="0.064657"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:15.865686" elapsed="0.069949"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:15.865098" elapsed="0.070600"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:15.861715" elapsed="0.074057"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:15.939400" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:16.140845" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:16.543915" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:16.546763" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:15.936499" elapsed="0.615034">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:16.552060" elapsed="0.000049"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:16.552475" elapsed="0.000037"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:16.552949" elapsed="0.000049"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:15.936104" elapsed="0.617091">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:15.861105" elapsed="0.692204">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:15.860583" elapsed="0.692993">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:16.558675" elapsed="0.000230"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:16.558398" elapsed="0.000586"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:16.560180" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:16.560048" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:16.560022" 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-04-17T03:26:16.565537" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:16.565399" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:16.565375" elapsed="0.000255"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:16.566709" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:16.566302" elapsed="0.000436"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:16.567230" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:16.566902" elapsed="0.000361"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:16.567310" elapsed="0.000060"/>
</return>
<msg time="2026-04-17T03:26:16.567542" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:16.565891" elapsed="0.001679"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:16.573686" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:16.573566" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:16.573545" 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-04-17T03:26:16.575441" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:16.575177" elapsed="0.000402"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:16.575159" elapsed="0.000493"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:16.576345" level="INFO">${karaf_connection_index} = 21</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:16.575887" elapsed="0.000523"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:16.577075" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:16.576762" elapsed="0.000394"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:16.579647" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:16.579138" elapsed="0.001342">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:16.580658" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:16.580757" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:16.577473" elapsed="0.003345"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:16.583375" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:16.582899" elapsed="0.001135">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:16.584248" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:16.584373" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:16.581242" elapsed="0.003208"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:16.586160" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_es_as"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:16.585311" elapsed="0.001078">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_es_as"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:16.584819" elapsed="0.001707">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_es_as"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:16.584789" elapsed="0.001821">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_es_as"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:16.586852" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:16.587455" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:16.587140" elapsed="0.000464"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:16.587116" elapsed="0.000562"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:16.587730" elapsed="0.000018"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:16.591671" elapsed="0.000162"/>
</kw>
<msg time="2026-04-17T03:26:16.591883" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:16.591001" elapsed="0.001000"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:16.592241" elapsed="0.000031"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:16.592489" 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-04-17T03:26:16.590161" elapsed="0.002547"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:16.588208" elapsed="0.004586"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:16.574629" elapsed="0.018381">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_es_as"</status>
</kw>
<msg time="2026-04-17T03:26:16.593122" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:16.593166" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_es_as"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:16.573970" elapsed="0.019219"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:16.593382" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:16.593270" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:16.593250" elapsed="0.000199"/>
</if>
<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-04-17T03:26:16.594489" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:16.594381" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:16.594362" elapsed="0.000193"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:16.594840" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:16.594961" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:16.594713" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:16.595508" level="INFO">{1: 21}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:16.595144" elapsed="0.000414"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:16.596283" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:16.595741" elapsed="0.000602"/>
</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-04-17T03:26:16.597080" elapsed="0.000452"/>
</kw>
<msg time="2026-04-17T03:26:16.597837" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:16.597897" level="INFO">${old_connection_index} = 21</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:16.596561" elapsed="0.001436"/>
</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-04-17T03:26:16.599885" elapsed="0.000562"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:16.601625" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:16.601441" elapsed="0.001080">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:16.600755" elapsed="0.001903"/>
</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-04-17T03:26:16.603902" elapsed="0.000164"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:16.603073" elapsed="0.001107"/>
</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-04-17T03:26:16.598344" elapsed="0.005946"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:16.598102" elapsed="0.006249"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:16.598072" elapsed="0.006311"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:16.605718" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:16.605171" elapsed="0.000614"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:16.606017" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:26:16.606222" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:16.604644" elapsed="0.001604"/>
</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-04-17T03:26:16.606413" elapsed="0.000758"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:16.607629" level="INFO">index=22
host=10.30.170.120
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-04-17T03:26:16.607740" level="INFO">${karaf_connection_object} = index=22
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:16.607462" elapsed="0.000305"/>
</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-04-17T03:26:16.607926" elapsed="0.009478"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:16.618019" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:16.619182" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:16.617586" elapsed="0.002059">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:16.625920" elapsed="0.000177"/>
</kw>
<msg time="2026-04-17T03:26:16.626176" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:16.624791" elapsed="0.001537"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:16.627216" elapsed="0.000069"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:16.628300" elapsed="0.000071"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:16.621080" elapsed="0.007406"/>
</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-04-17T03:26:16.620373" elapsed="0.008223"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:16.594074" elapsed="0.034614">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:16.629170" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:16.629250" 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="FAIL" start="2026-04-17T03:26:16.573168" elapsed="0.056200">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:16.629548" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:16.629592" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:16.567985" elapsed="0.061631"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:16.630045" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:16.629702" elapsed="0.000412"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:16.629682" elapsed="0.000459"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:16.567817" elapsed="0.062349"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:16.567632" elapsed="0.062568"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:16.564906" elapsed="0.065355"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:16.559679" elapsed="0.070641"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:16.559143" elapsed="0.071225"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:16.555725" elapsed="0.074699"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:16.633884" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:16.835677" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:17.239813" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:17.243534" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:16.630984" elapsed="0.616274">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:17.247760" elapsed="0.000053"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:17.248133" elapsed="0.000036"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:17.248604" elapsed="0.000043"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:16.630608" elapsed="0.618306">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:16.554796" elapsed="0.694273">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:16.554087" elapsed="0.695301">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:17.259409" elapsed="0.000356"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:17.258982" elapsed="0.000891"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:17.261852" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:17.261606" elapsed="0.000351"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:17.261555" 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-04-17T03:26:17.269911" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:17.269794" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:17.269774" elapsed="0.000224"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:17.271098" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:17.270648" elapsed="0.000481"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:17.271612" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:17.271301" elapsed="0.000337"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:17.271684" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:26:17.271861" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:17.270252" elapsed="0.001634"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:17.277962" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:17.277779" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:17.277751" elapsed="0.000314"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:17.280206" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:17.279916" elapsed="0.000445"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:17.279890" elapsed="0.000553"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:17.281352" level="INFO">${karaf_connection_index} = 22</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:17.280671" elapsed="0.000770"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:17.282173" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:17.281885" elapsed="0.000348"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:17.284562" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:17.284096" elapsed="0.001123">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:17.285371" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:17.285467" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:17.282538" elapsed="0.002986"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:17.287869" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:17.287452" elapsed="0.001039">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:17.288631" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:17.288723" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:17.285942" elapsed="0.002837"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:17.290250" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_es_lacp"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:17.289474" elapsed="0.000979">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_es_lacp"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:17.289115" elapsed="0.001449">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_es_lacp"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:17.289094" elapsed="0.001549">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_es_lacp"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:17.290823" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:17.291244" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:17.291036" elapsed="0.000375"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:17.291017" elapsed="0.000454"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:17.291507" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:17.295267" elapsed="0.000142"/>
</kw>
<msg time="2026-04-17T03:26:17.295460" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:17.294631" elapsed="0.000893"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:17.295738" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:17.295977" 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-04-17T03:26:17.293881" elapsed="0.002314"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:17.291810" elapsed="0.004470"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:17.279269" elapsed="0.017175">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_es_lacp"</status>
</kw>
<msg time="2026-04-17T03:26:17.296551" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:17.296593" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_es_lacp"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:17.278298" elapsed="0.018318"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:17.296804" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:17.296692" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:17.296674" elapsed="0.000195"/>
</if>
<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-04-17T03:26:17.298000" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:17.297876" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:17.297859" elapsed="0.000207"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:17.298350" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:17.298455" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:17.298222" elapsed="0.000260"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:17.299068" level="INFO">{1: 22}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:17.298636" elapsed="0.000479"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:17.299566" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:17.299270" elapsed="0.000340"/>
</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-04-17T03:26:17.300154" elapsed="0.000350"/>
</kw>
<msg time="2026-04-17T03:26:17.300744" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:17.300791" level="INFO">${old_connection_index} = 22</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:17.299769" elapsed="0.001044"/>
</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-04-17T03:26:17.302581" elapsed="0.000516"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:17.304199" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:17.304043" elapsed="0.000584">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:17.303408" elapsed="0.001329"/>
</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-04-17T03:26:17.305696" elapsed="0.000105"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:17.305087" elapsed="0.000805"/>
</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-04-17T03:26:17.301140" elapsed="0.004861"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:17.300888" elapsed="0.005164"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:17.300870" elapsed="0.005207"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:17.307283" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:17.306660" elapsed="0.000665"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:17.307485" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:26:17.307644" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:17.306281" elapsed="0.001388"/>
</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-04-17T03:26:17.307825" elapsed="0.000625"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:17.308733" level="INFO">index=23
host=10.30.170.120
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-04-17T03:26:17.308832" level="INFO">${karaf_connection_object} = index=23
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:17.308626" 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-04-17T03:26:17.309059" elapsed="0.008430"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:17.318114" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:17.319213" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:17.317661" elapsed="0.001934">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:17.325085" elapsed="0.000157"/>
</kw>
<msg time="2026-04-17T03:26:17.325331" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:17.324225" elapsed="0.001255"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:17.326522" elapsed="0.000067"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:17.327697" elapsed="0.000070"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:17.320480" elapsed="0.007398"/>
</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-04-17T03:26:17.319885" elapsed="0.008119"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:17.297576" elapsed="0.030515">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:17.328514" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:17.328590" 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="FAIL" start="2026-04-17T03:26:17.277406" elapsed="0.051291">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:17.328805" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:17.328848" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:17.272326" elapsed="0.056545"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:17.329293" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:17.329007" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:17.328950" elapsed="0.000423"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:17.272173" elapsed="0.057224"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:17.271972" elapsed="0.057463"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:17.269261" elapsed="0.060234"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:17.260988" elapsed="0.068565"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:17.260133" elapsed="0.069468"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:17.252987" elapsed="0.076668"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:17.332744" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:17.540634" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:17.957358" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:17.959902" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:17.330181" elapsed="0.633025">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:17.963554" elapsed="0.000041"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:17.963876" elapsed="0.000034"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:17.964290" elapsed="0.000036"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:17.329878" elapsed="0.634602">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:17.251831" elapsed="0.712749">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:17.250995" elapsed="0.713801">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:17.970728" elapsed="0.000262"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:17.970250" elapsed="0.000796"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:17.972138" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:17.972007" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:17.971975" 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-04-17T03:26:17.977275" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:17.977166" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:17.977147" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:17.978625" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:17.978128" elapsed="0.000525"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:17.979144" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:17.978824" elapsed="0.000346"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:17.979214" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:26:17.979373" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:17.977575" elapsed="0.001822"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:17.984999" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:17.984874" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:17.984856" elapsed="0.000210"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:17.986580" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:17.986307" elapsed="0.000377"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:17.986289" elapsed="0.000451"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:17.987339" level="INFO">${karaf_connection_index} = 23</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:17.986898" elapsed="0.000504"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:17.988036" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:17.987748" elapsed="0.000348"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:17.990893" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:17.990259" elapsed="0.001199">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:17.991602" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:17.991697" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:17.988406" elapsed="0.003349"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:17.994102" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:17.993670" elapsed="0.001065">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:17.994881" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:17.995058" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:17.992164" elapsed="0.002953"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:17.996591" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_es_lacp"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:17.995818" elapsed="0.000972">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_es_lacp"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:17.995408" elapsed="0.001489">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_es_lacp"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:17.995388" elapsed="0.001602">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_es_lacp"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:17.997165" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:17.997564" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:17.997362" elapsed="0.000312"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:17.997343" elapsed="0.000387"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:17.997766" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:18.002213" elapsed="0.000215"/>
</kw>
<msg time="2026-04-17T03:26:18.002484" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:18.001561" elapsed="0.000995"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:18.002783" elapsed="0.000038"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:18.003170" elapsed="0.000033"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:18.000663" elapsed="0.002817"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:17.998064" elapsed="0.005544"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:17.985843" elapsed="0.018072">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_es_lacp"</status>
</kw>
<msg time="2026-04-17T03:26:18.004416" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:18.004480" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_es_lacp"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:17.985220" elapsed="0.019354"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:18.004857" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:18.004694" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:18.004665" elapsed="0.000312"/>
</if>
<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-04-17T03:26:18.006245" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:18.006093" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:18.006068" elapsed="0.000271"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:18.006804" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:18.006995" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:18.006603" elapsed="0.000434"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:18.007782" level="INFO">{1: 23}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:18.007269" elapsed="0.000596"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:18.008588" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:18.008131" elapsed="0.000524"/>
</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-04-17T03:26:18.009730" elapsed="0.000568"/>
</kw>
<msg time="2026-04-17T03:26:18.010774" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:18.010825" level="INFO">${old_connection_index} = 23</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:18.008902" elapsed="0.001948"/>
</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-04-17T03:26:18.012765" elapsed="0.000433"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:18.016358" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:18.014186" elapsed="0.002683">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:18.013510" elapsed="0.003517"/>
</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-04-17T03:26:18.018069" elapsed="0.000114"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:18.017388" elapsed="0.000892"/>
</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-04-17T03:26:18.011200" elapsed="0.007196"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:18.010950" elapsed="0.007507"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:18.010912" elapsed="0.007573"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:18.020027" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:18.019321" elapsed="0.000771"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:18.020336" elapsed="0.000056"/>
</return>
<msg time="2026-04-17T03:26:18.020585" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:18.018708" elapsed="0.001915"/>
</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-04-17T03:26:18.020859" elapsed="0.000919"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:18.022281" level="INFO">index=24
host=10.30.170.120
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-04-17T03:26:18.022485" level="INFO">${karaf_connection_object} = index=24
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:18.022104" elapsed="0.000424"/>
</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-04-17T03:26:18.022740" elapsed="0.008605"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:18.031941" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:18.033124" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:18.031518" elapsed="0.002003">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:18.039416" elapsed="0.000175"/>
</kw>
<msg time="2026-04-17T03:26:18.039670" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:18.038189" 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-04-17T03:26:18.040699" elapsed="0.000068"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:18.041617" elapsed="0.000071"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:18.034786" elapsed="0.007057"/>
</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-04-17T03:26:18.033915" elapsed="0.008097"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:18.005643" elapsed="0.036492">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:18.042761" elapsed="0.000035"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:18.042862" 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="FAIL" start="2026-04-17T03:26:17.984534" elapsed="0.058510">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:18.043162" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:18.043221" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:17.979840" elapsed="0.063414"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:18.043706" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:18.043361" elapsed="0.000421"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:18.043337" elapsed="0.000477"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:17.979692" elapsed="0.064157"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:17.979504" elapsed="0.064391"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:17.976774" elapsed="0.067253"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:17.971657" elapsed="0.072451"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:17.971200" elapsed="0.072969"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:17.966678" elapsed="0.077564"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:18.048320" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:18.250052" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:18.653274" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:18.656173" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:18.044813" elapsed="0.615026">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:18.660329" elapsed="0.000047"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:18.660619" elapsed="0.000032"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:18.661052" elapsed="0.000040"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:18.044440" elapsed="0.616818">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:17.965741" elapsed="0.695622">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:17.965139" elapsed="0.696464">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:18.667077" elapsed="0.000240"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:18.666759" elapsed="0.000620"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:18.668607" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:18.668461" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:18.668436" 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-04-17T03:26:18.673896" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:18.673781" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:18.673762" elapsed="0.000224"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:18.675199" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:18.674637" elapsed="0.000601"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:18.675886" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:18.675463" elapsed="0.000456"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:18.675984" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:26:18.676163" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:18.674234" elapsed="0.001959"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:18.682868" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:18.682741" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:18.682718" 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-04-17T03:26:18.684609" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:18.684418" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:18.684398" elapsed="0.000393"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:18.685428" level="INFO">${karaf_connection_index} = 24</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:18.684994" elapsed="0.000496"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:18.686144" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:18.685848" elapsed="0.000359"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:18.688668" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:18.688202" elapsed="0.001085">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:18.689440" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:18.689539" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:18.686524" elapsed="0.003079"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:18.692396" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:18.691866" elapsed="0.001201">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:18.693224" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:18.693320" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:18.690094" elapsed="0.003286"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:18.694857" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_es_lan"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:18.694078" elapsed="0.001007">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_es_lan"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:18.693681" elapsed="0.001520">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_es_lan"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:18.693658" elapsed="0.001654">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_es_lan"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:18.695500" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:18.695976" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:18.695748" elapsed="0.000344"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:18.695727" elapsed="0.000426"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:18.696193" elapsed="0.000018"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:18.700352" elapsed="0.000158"/>
</kw>
<msg time="2026-04-17T03:26:18.700562" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:18.699692" elapsed="0.000941"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:18.700854" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:18.701213" elapsed="0.000024"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:18.698803" elapsed="0.002637"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:18.696512" elapsed="0.005018"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:18.683890" elapsed="0.017809">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_es_lan"</status>
</kw>
<msg time="2026-04-17T03:26:18.701845" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:18.701893" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_es_lan"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:18.683151" elapsed="0.018768"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:18.702135" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:18.702018" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:18.701997" elapsed="0.000206"/>
</if>
<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-04-17T03:26:18.703366" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:18.703250" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:18.703228" elapsed="0.000209"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:18.703818" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:18.703956" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:18.703604" elapsed="0.000381"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:18.704488" level="INFO">{1: 24}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:18.704155" elapsed="0.000381"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:18.705191" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:18.704695" elapsed="0.000544"/>
</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-04-17T03:26:18.705850" elapsed="0.000438"/>
</kw>
<msg time="2026-04-17T03:26:18.706606" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:18.706656" level="INFO">${old_connection_index} = 24</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:18.705406" elapsed="0.001275"/>
</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-04-17T03:26:18.708822" elapsed="0.000541"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:18.710590" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:18.710400" elapsed="0.000700">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:18.709717" elapsed="0.001500"/>
</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-04-17T03:26:18.712330" elapsed="0.000109"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:18.711536" elapsed="0.000998"/>
</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-04-17T03:26:18.707091" elapsed="0.005537"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:18.706760" elapsed="0.005921"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:18.706741" elapsed="0.005968"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:18.713974" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:18.713405" elapsed="0.000613"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:18.714184" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:26:18.714355" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:18.712995" elapsed="0.001386"/>
</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-04-17T03:26:18.714548" elapsed="0.000665"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:18.715511" level="INFO">index=25
host=10.30.170.120
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-04-17T03:26:18.715615" level="INFO">${karaf_connection_object} = index=25
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:18.715392" elapsed="0.000251"/>
</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-04-17T03:26:18.715839" elapsed="0.008900"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:18.725635" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:18.726978" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:18.725130" elapsed="0.002301">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:18.734183" elapsed="0.000204"/>
</kw>
<msg time="2026-04-17T03:26:18.734491" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:18.732914" 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-04-17T03:26:18.735677" elapsed="0.000133"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:18.736734" elapsed="0.000073"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:18.728595" elapsed="0.008441"/>
</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-04-17T03:26:18.727881" elapsed="0.009274"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:18.702688" elapsed="0.034568">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:18.737759" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:18.737913" 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="FAIL" start="2026-04-17T03:26:18.682357" elapsed="0.055704">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:18.738203" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:18.738255" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:18.676667" elapsed="0.061614"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:18.738689" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:18.738374" elapsed="0.000386"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:18.738351" elapsed="0.000442"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:18.676511" elapsed="0.062315"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:18.676269" elapsed="0.062601"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:18.673395" elapsed="0.065576"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:18.668099" elapsed="0.070957"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:18.667539" elapsed="0.071582"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:18.664003" elapsed="0.075193"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:18.743130" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:18.944909" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:19.347897" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:19.350069" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:18.739828" elapsed="0.613834">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:19.354076" elapsed="0.000046"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:19.354361" elapsed="0.000031"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:19.354764" elapsed="0.000039"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:18.739404" elapsed="0.615634">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:18.662979" elapsed="0.692176">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:18.662195" elapsed="0.693188">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:19.360881" elapsed="0.000259"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:19.360532" elapsed="0.000672"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:19.362302" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:19.362165" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:19.362139" 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-04-17T03:26:19.367557" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:19.367443" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:19.367423" elapsed="0.000205"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:19.368692" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:19.368282" elapsed="0.000438"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:19.369300" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:19.368979" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:19.369371" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:26:19.369535" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:19.367873" elapsed="0.001687"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:19.375812" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:19.375650" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:19.375623" elapsed="0.000289"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:19.378109" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:19.377820" elapsed="0.000442"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:19.377794" elapsed="0.000550"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:19.379205" level="INFO">${karaf_connection_index} = 25</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:19.378568" elapsed="0.000727"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:19.380222" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:19.379804" elapsed="0.000505"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:19.383164" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:19.382688" elapsed="0.001225">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:19.384085" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:19.384186" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:19.380757" elapsed="0.003490"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:19.386667" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:19.386239" elapsed="0.001006">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:19.387390" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:19.387487" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:19.384651" elapsed="0.002894"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:19.389259" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_es_lan"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:19.388397" elapsed="0.001066">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_es_lan"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:19.387843" elapsed="0.001729">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_es_lan"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:19.387822" elapsed="0.001831">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_es_lan"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:19.389830" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:19.390321" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:19.390055" elapsed="0.000381"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:19.390035" elapsed="0.000459"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:19.390533" elapsed="0.000018"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:19.394294" elapsed="0.000154"/>
</kw>
<msg time="2026-04-17T03:26:19.394498" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:19.393729" elapsed="0.000836"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:19.394784" elapsed="0.000025"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:19.395130" 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-04-17T03:26:19.392963" elapsed="0.002418"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:19.390833" elapsed="0.004641"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:19.377169" elapsed="0.018472">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_es_lan"</status>
</kw>
<msg time="2026-04-17T03:26:19.395751" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:19.395800" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_es_lan"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:19.376161" elapsed="0.019662"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:19.396152" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:19.395901" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:19.395882" elapsed="0.000338"/>
</if>
<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-04-17T03:26:19.397248" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:19.397133" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:19.397113" elapsed="0.000202"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:19.397632" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:19.397765" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:19.397479" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:19.398298" level="INFO">{1: 25}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:19.397971" elapsed="0.000373"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:19.398814" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:19.398499" elapsed="0.000373"/>
</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-04-17T03:26:19.399448" elapsed="0.000370"/>
</kw>
<msg time="2026-04-17T03:26:19.400248" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:19.400297" level="INFO">${old_connection_index} = 25</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:19.399068" elapsed="0.001253"/>
</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-04-17T03:26:19.402132" elapsed="0.000383"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:19.403784" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:19.403464" elapsed="0.000915">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:19.402819" elapsed="0.001673"/>
</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-04-17T03:26:19.405478" elapsed="0.000110"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:19.404802" elapsed="0.000879"/>
</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-04-17T03:26:19.400624" elapsed="0.005151"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:19.400399" elapsed="0.005428"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:19.400380" elapsed="0.005473"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:19.407330" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:19.406584" elapsed="0.000788"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:19.407537" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:26:19.407702" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:19.406140" elapsed="0.001587"/>
</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-04-17T03:26:19.408119" elapsed="0.000656"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:19.409131" level="INFO">index=26
host=10.30.170.120
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-04-17T03:26:19.409243" level="INFO">${karaf_connection_object} = index=26
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:19.409015" elapsed="0.000257"/>
</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-04-17T03:26:19.409445" elapsed="0.008820"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:19.418974" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:19.420305" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:19.418498" elapsed="0.002273">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:19.426840" elapsed="0.000211"/>
</kw>
<msg time="2026-04-17T03:26:19.427137" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:19.425748" elapsed="0.001567"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:19.428310" elapsed="0.000071"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:19.429348" elapsed="0.000080"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:19.421997" elapsed="0.007549"/>
</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-04-17T03:26:19.421275" elapsed="0.008397"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:19.396721" elapsed="0.033053">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:19.430324" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:19.430406" 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="FAIL" start="2026-04-17T03:26:19.375149" elapsed="0.055393">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:19.430675" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:19.430722" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:19.369962" elapsed="0.060785"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:19.431171" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:19.430843" elapsed="0.000391"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:19.430817" elapsed="0.000450"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:19.369799" elapsed="0.061498"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:19.369619" elapsed="0.061719"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:19.367062" elapsed="0.064347"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:19.361829" elapsed="0.069655"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:19.361363" elapsed="0.070181"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:19.357593" elapsed="0.074121"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:19.435185" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:19.636600" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:20.039238" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:20.043302" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:19.432349" elapsed="0.616723">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:20.049649" elapsed="0.000054"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:20.049979" elapsed="0.000107"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:20.050485" elapsed="0.000040"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:19.431889" elapsed="0.618842">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:19.356570" elapsed="0.694286">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:19.355824" elapsed="0.695331">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:20.057410" elapsed="0.000333"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:20.056919" elapsed="0.000910"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:20.059372" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:20.059235" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:20.059206" elapsed="0.000249"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:20.065446" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:20.065258" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:20.065232" elapsed="0.000333"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:20.067162" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:20.066505" elapsed="0.000699"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:20.067809" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:20.067432" elapsed="0.000413"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:20.067905" elapsed="0.000072"/>
</return>
<msg time="2026-04-17T03:26:20.068232" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:20.065986" elapsed="0.002272"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:20.075136" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:20.074986" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:20.074958" elapsed="0.000269"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:20.077077" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:20.076854" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:20.076836" elapsed="0.000406"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:20.077969" level="INFO">${karaf_connection_index} = 26</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:20.077409" elapsed="0.000680"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:20.078876" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:20.078502" elapsed="0.000676"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:20.082348" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:20.081624" elapsed="0.001604">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:20.083416" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:20.083556" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:20.079598" elapsed="0.004039"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:20.086448" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:20.085816" elapsed="0.001489">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:20.087488" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:20.087613" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:20.084078" elapsed="0.003615"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:20.089717" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_es_mac"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:20.088640" elapsed="0.001614">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_es_mac"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:20.088100" elapsed="0.002276">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_es_mac"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:20.088067" elapsed="0.002394">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_es_mac"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:20.090694" elapsed="0.000034"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:20.091205" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:20.090985" elapsed="0.000334"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:20.090956" elapsed="0.000419"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:20.091419" elapsed="0.000021"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:20.095565" elapsed="0.000171"/>
</kw>
<msg time="2026-04-17T03:26:20.095809" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:20.094783" elapsed="0.001106"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:20.096244" elapsed="0.000025"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:20.096483" 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-04-17T03:26:20.093758" 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-04-17T03:26:20.091764" elapsed="0.005045"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:20.076403" elapsed="0.020603">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_es_mac"</status>
</kw>
<msg time="2026-04-17T03:26:20.097201" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:20.097249" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_es_mac"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:20.075433" elapsed="0.021842"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:20.097495" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:20.097370" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:20.097346" elapsed="0.000225"/>
</if>
<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-04-17T03:26:20.098893" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:20.098780" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:20.098761" elapsed="0.000223"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:20.099324" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:20.099441" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:20.099165" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:20.100199" level="INFO">{1: 26}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:20.099643" elapsed="0.000605"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:20.100732" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:20.100425" elapsed="0.000353"/>
</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-04-17T03:26:20.101359" elapsed="0.000366"/>
</kw>
<msg time="2026-04-17T03:26:20.102003" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:20.102051" level="INFO">${old_connection_index} = 26</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:20.100962" elapsed="0.001133"/>
</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-04-17T03:26:20.103912" elapsed="0.000438"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:20.105521" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:20.105335" elapsed="0.000809">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:20.104657" elapsed="0.001605"/>
</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-04-17T03:26:20.107209" elapsed="0.000107"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:20.106574" elapsed="0.000834"/>
</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-04-17T03:26:20.102417" elapsed="0.005084"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:20.102180" elapsed="0.005371"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:20.102160" elapsed="0.005418"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:20.108794" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:20.108261" elapsed="0.000574"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:20.109017" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:26:20.109184" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:20.107801" elapsed="0.001407"/>
</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-04-17T03:26:20.109369" elapsed="0.000654"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:20.110364" level="INFO">index=27
host=10.30.170.120
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-04-17T03:26:20.110466" level="INFO">${karaf_connection_object} = index=27
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:20.110247" elapsed="0.000245"/>
</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-04-17T03:26:20.110652" elapsed="0.010720"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:20.122283" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:20.123537" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:20.121650" elapsed="0.002727">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:20.130211" elapsed="0.000185"/>
</kw>
<msg time="2026-04-17T03:26:20.130483" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:20.129145" elapsed="0.001498"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:20.131572" elapsed="0.000070"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:20.132576" elapsed="0.000070"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:20.125536" elapsed="0.007228"/>
</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-04-17T03:26:20.124772" elapsed="0.008106"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:20.098444" elapsed="0.034558">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:20.133522" elapsed="0.000030"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:20.133609" 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="FAIL" start="2026-04-17T03:26:20.074501" elapsed="0.059242">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:20.133869" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:20.133916" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:20.068717" elapsed="0.065241"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:20.134380" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:20.134053" elapsed="0.000384"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:20.134029" elapsed="0.000435"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:20.068553" elapsed="0.065938"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:20.068334" elapsed="0.066199"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:20.064668" elapsed="0.069931"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:20.058847" elapsed="0.075814"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:20.058172" elapsed="0.076538"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:20.053458" elapsed="0.081313"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:20.138602" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:20.340366" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:20.743346" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:20.745852" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:20.135273" elapsed="0.614945">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:20.750730" elapsed="0.000057"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:20.751188" elapsed="0.000050"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:20.751747" elapsed="0.000050"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:20.134957" elapsed="0.617055">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:20.052604" elapsed="0.699517">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:20.051818" elapsed="0.700546">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:20.759356" elapsed="0.000233"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:20.759034" elapsed="0.000614"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:20.760776" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:20.760640" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:20.760616" 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-04-17T03:26:20.766662" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:20.766545" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:20.766525" elapsed="0.000207"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:20.767803" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:20.767396" elapsed="0.000436"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:20.768318" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:20.768013" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:20.768388" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:26:20.768551" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:20.766988" elapsed="0.001588"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:20.774551" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:20.774435" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:20.774415" elapsed="0.000205"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:20.776285" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:20.776089" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:20.776069" elapsed="0.000384"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:20.777116" level="INFO">${karaf_connection_index} = 27</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:20.776611" elapsed="0.000571"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:20.777821" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:20.777544" elapsed="0.000342"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:20.780471" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:20.779998" elapsed="0.001097">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:20.781244" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:20.781340" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:20.778286" elapsed="0.003114"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:20.784117" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:20.783620" elapsed="0.001068">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:20.784833" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:20.785018" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:20.781799" elapsed="0.003285"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:20.786547" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_es_mac"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:20.785759" elapsed="0.000997">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_es_mac"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:20.785388" elapsed="0.001485">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_es_mac"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:20.785366" elapsed="0.001619">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_es_mac"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:20.787208" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:20.787669" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:20.787456" elapsed="0.000330"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:20.787433" elapsed="0.000412"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:20.787883" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:20.791754" elapsed="0.000160"/>
</kw>
<msg time="2026-04-17T03:26:20.791991" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:20.791212" 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-04-17T03:26:20.792305" elapsed="0.000029"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:20.792537" elapsed="0.000024"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:20.790356" elapsed="0.002405"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:20.788204" 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="FAIL" start="2026-04-17T03:26:20.775568" elapsed="0.017613">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_es_mac"</status>
</kw>
<msg time="2026-04-17T03:26:20.793298" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:20.793344" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_es_mac"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:20.774779" elapsed="0.018589"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:20.793567" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:20.793453" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:20.793430" elapsed="0.000206"/>
</if>
<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-04-17T03:26:20.794811" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:20.794694" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:20.794671" elapsed="0.000209"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:20.795240" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:20.795364" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:20.795061" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:20.795948" level="INFO">{1: 27}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:20.795602" elapsed="0.000395"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:20.796458" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:20.796154" elapsed="0.000349"/>
</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-04-17T03:26:20.797221" elapsed="0.000365"/>
</kw>
<msg time="2026-04-17T03:26:20.797833" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:20.797881" level="INFO">${old_connection_index} = 27</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:20.796665" elapsed="0.001238"/>
</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-04-17T03:26:20.800097" elapsed="0.000403"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:20.801889" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:20.801668" elapsed="0.000774">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:20.800831" elapsed="0.001726"/>
</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-04-17T03:26:20.803723" elapsed="0.000115"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:20.802943" elapsed="0.001030"/>
</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-04-17T03:26:20.798240" elapsed="0.005848"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:20.797999" elapsed="0.006142"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:20.797980" elapsed="0.006191"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:20.805532" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:20.804866" elapsed="0.000709"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:20.805743" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:26:20.805960" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:20.804413" elapsed="0.001578"/>
</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-04-17T03:26:20.806158" elapsed="0.000633"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:20.807122" level="INFO">index=28
host=10.30.170.120
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-04-17T03:26:20.807254" level="INFO">${karaf_connection_object} = index=28
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:20.806995" elapsed="0.000307"/>
</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-04-17T03:26:20.807497" elapsed="0.010095"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:20.818327" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:20.819591" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:20.817843" elapsed="0.002260">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:20.826616" elapsed="0.000169"/>
</kw>
<msg time="2026-04-17T03:26:20.826871" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:20.825589" elapsed="0.001460"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:20.828029" elapsed="0.000070"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:20.828995" elapsed="0.000069"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:20.821639" elapsed="0.007542"/>
</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-04-17T03:26:20.820537" elapsed="0.008752"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:20.794145" elapsed="0.035238">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:20.829943" elapsed="0.000030"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:20.830026" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:26:20.774053" elapsed="0.056092">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:20.830262" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:20.830307" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:20.768982" elapsed="0.061349"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:20.830684" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:20.830419" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:20.830397" elapsed="0.000366"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:20.768816" elapsed="0.061971"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:20.768634" elapsed="0.062191"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:20.766109" elapsed="0.064778"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:20.760326" elapsed="0.070637"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:20.759811" elapsed="0.071201"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:20.756544" elapsed="0.074523"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:20.834900" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:21.036601" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:21.438796" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:21.440688" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:20.831649" elapsed="0.615195">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:21.447470" elapsed="0.000078"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:21.448051" elapsed="0.000133"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:21.448799" elapsed="0.000060"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:20.831271" elapsed="0.617758">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:20.753450" elapsed="0.695663">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:20.752730" elapsed="0.696645">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:21.454171" elapsed="0.000239"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:21.453846" elapsed="0.000630"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:21.455705" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:21.455538" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:21.455504" elapsed="0.000285"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:21.461306" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:21.461185" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:21.461164" elapsed="0.000216"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:21.462571" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:21.462124" elapsed="0.000477"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:21.463105" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:21.462773" elapsed="0.000358"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:21.463177" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:26:21.463344" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:21.461636" elapsed="0.001732"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:21.469461" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:21.469348" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:21.469328" elapsed="0.000204"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:21.471258" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:21.471023" elapsed="0.000353"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:21.471002" elapsed="0.000433"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:21.472044" level="INFO">${karaf_connection_index} = 28</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:21.471593" elapsed="0.000513"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:21.472816" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:21.472504" elapsed="0.000377"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:21.475346" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:21.474818" elapsed="0.001514">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:21.476500" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:21.476607" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:21.473225" elapsed="0.003445"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:21.479287" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:21.478801" elapsed="0.001076">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:21.480105" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:21.480261" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:21.477123" elapsed="0.003200"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:21.481946" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_es_rou"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:21.481081" elapsed="0.001106">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_es_rou"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:21.480642" elapsed="0.001669">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_es_rou"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:21.480620" elapsed="0.001835">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_es_rou"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:21.482656" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:21.483142" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:21.482880" elapsed="0.000383"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:21.482856" elapsed="0.000467"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:21.483362" elapsed="0.000018"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:21.487638" elapsed="0.000159"/>
</kw>
<msg time="2026-04-17T03:26:21.487849" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:21.486883" elapsed="0.001039"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:21.488234" elapsed="0.000027"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:21.488467" 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-04-17T03:26:21.486108" elapsed="0.002580"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:21.483691" elapsed="0.005084"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:21.470481" elapsed="0.018528">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_es_rou"</status>
</kw>
<msg time="2026-04-17T03:26:21.489136" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:21.489373" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_es_rou"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:21.469745" elapsed="0.019660"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:21.489634" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:21.489509" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:21.489484" elapsed="0.000222"/>
</if>
<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-04-17T03:26:21.490715" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:21.490608" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:21.490590" elapsed="0.000196"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:21.491191" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:21.491311" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:21.491038" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:21.491834" level="INFO">{1: 28}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:21.491507" elapsed="0.000372"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:21.492595" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:21.492265" elapsed="0.000379"/>
</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-04-17T03:26:21.493314" elapsed="0.000409"/>
</kw>
<msg time="2026-04-17T03:26:21.494018" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:21.494072" level="INFO">${old_connection_index} = 28</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:21.492829" elapsed="0.001269"/>
</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-04-17T03:26:21.496331" elapsed="0.000414"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:21.498040" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:21.497812" elapsed="0.001106">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:21.497116" elapsed="0.001949"/>
</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-04-17T03:26:21.500138" elapsed="0.000180"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:21.499416" elapsed="0.001004"/>
</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-04-17T03:26:21.494463" elapsed="0.006061"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:21.494192" elapsed="0.006461"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:21.494168" elapsed="0.006517"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:21.502046" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:21.501433" elapsed="0.000659"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:21.502271" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:26:21.502462" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:21.500974" elapsed="0.001517"/>
</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-04-17T03:26:21.502676" elapsed="0.000704"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:21.503717" level="INFO">index=29
host=10.30.170.120
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-04-17T03:26:21.503830" level="INFO">${karaf_connection_object} = index=29
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:21.503584" elapsed="0.000275"/>
</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-04-17T03:26:21.504173" elapsed="0.009500"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:21.514333" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:21.515476" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:21.513877" elapsed="0.002384">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:21.521626" elapsed="0.000152"/>
</kw>
<msg time="2026-04-17T03:26:21.521851" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:21.520657" 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-04-17T03:26:21.522894" elapsed="0.000087"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:21.524031" elapsed="0.000071"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:21.517312" elapsed="0.006928"/>
</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-04-17T03:26:21.516638" elapsed="0.007716"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:21.490280" elapsed="0.034172">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:21.524955" elapsed="0.000030"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:21.525041" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:26:21.468983" elapsed="0.056182">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:21.525285" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:21.525331" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:21.463785" elapsed="0.061571"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:21.525734" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:21.525447" elapsed="0.000344"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:21.525425" elapsed="0.000393"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:21.463636" elapsed="0.062209"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:21.463446" elapsed="0.062435"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:21.460741" elapsed="0.065221"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:21.455143" elapsed="0.070945"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:21.454636" elapsed="0.071506"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:21.450885" elapsed="0.075319"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:21.529534" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:21.731158" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:22.133899" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:22.136205" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:21.526680" elapsed="0.612012">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:22.139113" elapsed="0.000044"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:22.139441" elapsed="0.000042"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:22.139908" elapsed="0.000061"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:21.526373" elapsed="0.613752">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:21.450326" elapsed="0.689896">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:21.449627" elapsed="0.690811">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:22.146280" elapsed="0.000230"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:22.145987" 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-04-17T03:26:22.147671" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:22.147513" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:22.147482" elapsed="0.000266"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:22.153076" elapsed="0.000050"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:22.152963" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:22.152943" elapsed="0.000238"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:22.154273" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:22.153849" elapsed="0.000453"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:22.154955" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:22.154538" elapsed="0.000452"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:22.155047" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:26:22.155265" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:22.153430" elapsed="0.001871"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:22.161993" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:22.161838" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:22.161813" 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-04-17T03:26:22.163660" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:22.163480" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:22.163462" elapsed="0.000359"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:22.164427" level="INFO">${karaf_connection_index} = 29</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:22.163993" elapsed="0.000497"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:22.165162" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:22.164843" elapsed="0.000385"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:22.167580" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:22.167116" elapsed="0.001272">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:22.168537" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:22.168634" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:22.165546" elapsed="0.003147"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:22.171426" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:22.170877" elapsed="0.001193">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:22.172215" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:22.172310" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:22.169201" elapsed="0.003168"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:22.173915" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_es_rou"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:22.173057" elapsed="0.001090">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_es_rou"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:22.172672" elapsed="0.001584">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_es_rou"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:22.172651" elapsed="0.001690">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_es_rou"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:22.174521" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:22.174941" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:22.174721" elapsed="0.000336"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:22.174702" elapsed="0.000414"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:22.175153" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:22.178943" elapsed="0.000153"/>
</kw>
<msg time="2026-04-17T03:26:22.179146" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:22.178319" elapsed="0.000892"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:22.179425" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:22.179645" 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-04-17T03:26:22.177557" elapsed="0.002306"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:22.175443" elapsed="0.004635"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:22.163033" elapsed="0.017256">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_es_rou"</status>
</kw>
<msg time="2026-04-17T03:26:22.180398" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:22.180441" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_es_rou"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:22.162280" elapsed="0.018185"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:22.180673" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:22.180541" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:22.180522" elapsed="0.000236"/>
</if>
<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-04-17T03:26:22.181900" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:22.181792" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:22.181775" elapsed="0.000211"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:22.182270" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:22.182374" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:22.182142" elapsed="0.000258"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:22.182871" level="INFO">{1: 29}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:22.182555" elapsed="0.000361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:22.183417" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:22.183093" elapsed="0.000387"/>
</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-04-17T03:26:22.184258" elapsed="0.000376"/>
</kw>
<msg time="2026-04-17T03:26:22.184888" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:22.184954" level="INFO">${old_connection_index} = 29</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:22.183697" elapsed="0.001284"/>
</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-04-17T03:26:22.186871" elapsed="0.000405"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:22.188475" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:22.188305" elapsed="0.000709">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:22.187603" elapsed="0.001546"/>
</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-04-17T03:26:22.190227" elapsed="0.000112"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:22.189477" elapsed="0.000957"/>
</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-04-17T03:26:22.185338" elapsed="0.005192"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:22.185062" elapsed="0.005523"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:22.185043" elapsed="0.005569"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:22.191816" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:22.191266" elapsed="0.000593"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:22.192058" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:26:22.192231" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:22.190841" elapsed="0.001416"/>
</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-04-17T03:26:22.192431" elapsed="0.000657"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:22.193448" level="INFO">index=30
host=10.30.170.120
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-04-17T03:26:22.193560" level="INFO">${karaf_connection_object} = index=30
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:22.193329" elapsed="0.000261"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:26:22.193796" elapsed="0.009339"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:22.203745" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:22.204810" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:22.203323" elapsed="0.001942">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:22.210577" elapsed="0.000161"/>
</kw>
<msg time="2026-04-17T03:26:22.210816" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:22.209678" elapsed="0.001306"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:22.211879" elapsed="0.000113"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:22.212862" elapsed="0.000086"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:22.206216" elapsed="0.006850"/>
</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-04-17T03:26:22.205582" elapsed="0.007614"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:22.181499" elapsed="0.031791">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:22.213750" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:22.213832" elapsed="0.000024"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:26:22.161403" elapsed="0.052593">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:22.214114" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:22.214160" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:22.155731" elapsed="0.058453"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:22.214549" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:22.214269" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:22.214249" elapsed="0.000384"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:22.155560" elapsed="0.059098"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:22.155376" elapsed="0.059319"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:22.152556" elapsed="0.062200"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:22.147183" elapsed="0.067634"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:22.146721" elapsed="0.068143"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:22.142241" elapsed="0.072700"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:22.218389" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:22.419893" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:22.822806" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:22.825486" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:22.215420" elapsed="0.615449">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:22.831442" elapsed="0.000063"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:22.831864" elapsed="0.000047"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:22.832569" elapsed="0.000062"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:22.215119" elapsed="0.617753">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:22.141420" elapsed="0.691660">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:22.140753" elapsed="0.692674">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:22.838524" elapsed="0.000225"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:22.838251" elapsed="0.000568"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:22.840326" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:22.840148" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:22.840117" elapsed="0.000311"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:22.845709" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:22.845592" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:22.845573" elapsed="0.000205"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:22.846869" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:22.846467" elapsed="0.000429"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:22.847386" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:22.847082" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:22.847457" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:26:22.847622" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:22.846065" elapsed="0.001582"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:22.853343" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:22.853234" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:22.853214" 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-04-17T03:26:22.855059" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:22.854844" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:22.854826" elapsed="0.000404"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:22.855806" level="INFO">${karaf_connection_index} = 30</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:22.855387" elapsed="0.000480"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:22.856615" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:22.856249" elapsed="0.000443"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:22.861372" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:22.860888" elapsed="0.001064">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:22.862143" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:22.862240" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:22.857172" elapsed="0.005127"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:22.864774" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:22.864351" elapsed="0.001005">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:22.865502" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:22.865597" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:22.862702" elapsed="0.002955"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:22.867189" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_arb"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:22.866400" elapsed="0.000991">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_arb"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:22.865975" elapsed="0.001535">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_arb"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:22.865950" elapsed="0.001644">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_arb"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:22.867767" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:22.868292" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:22.868084" elapsed="0.000324"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:22.868063" elapsed="0.000404"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:22.868505" elapsed="0.000018"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:22.872450" elapsed="0.000162"/>
</kw>
<msg time="2026-04-17T03:26:22.872663" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:22.871595" elapsed="0.001136"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:22.872976" elapsed="0.000026"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:22.873202" 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-04-17T03:26:22.870812" elapsed="0.002616"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:22.868806" elapsed="0.004711"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:22.854398" elapsed="0.019285">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_arb"</status>
</kw>
<msg time="2026-04-17T03:26:22.873834" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:22.873880" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_arb"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:22.853606" elapsed="0.020298"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:22.874197" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:22.874005" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:22.873985" elapsed="0.000281"/>
</if>
<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-04-17T03:26:22.875175" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:22.875066" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:22.875046" elapsed="0.000196"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:22.875523" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:22.875629" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:22.875398" elapsed="0.000257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:22.876452" level="INFO">{1: 30}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:22.875858" elapsed="0.000640"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:22.876971" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:22.876653" elapsed="0.000363"/>
</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-04-17T03:26:22.877551" elapsed="0.000355"/>
</kw>
<msg time="2026-04-17T03:26:22.878201" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:22.878249" level="INFO">${old_connection_index} = 30</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:22.877178" elapsed="0.001093"/>
</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-04-17T03:26:22.880043" elapsed="0.000375"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:22.881860" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:22.881482" elapsed="0.000915">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:22.880754" elapsed="0.001761"/>
</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-04-17T03:26:22.883485" elapsed="0.000108"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:22.882832" elapsed="0.000859"/>
</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-04-17T03:26:22.878575" elapsed="0.005212"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:22.878349" elapsed="0.005489"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:22.878331" elapsed="0.005534"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:22.885089" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:22.884499" elapsed="0.000635"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:22.885305" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:26:22.885472" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:22.884099" elapsed="0.001399"/>
</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-04-17T03:26:22.885661" elapsed="0.001078"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:22.887170" level="INFO">index=31
host=10.30.170.120
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-04-17T03:26:22.887302" level="INFO">${karaf_connection_object} = index=31
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:22.887046" 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-04-17T03:26:22.887491" elapsed="0.008786"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:22.896978" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:22.898190" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:22.896505" elapsed="0.002147">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:22.904378" elapsed="0.000164"/>
</kw>
<msg time="2026-04-17T03:26:22.904623" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:22.903254" elapsed="0.001532"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:22.905678" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:22.906662" elapsed="0.000076"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:22.899747" elapsed="0.007111"/>
</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-04-17T03:26:22.899019" elapsed="0.007967"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:22.874735" elapsed="0.032346">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:22.907626" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:22.907709" 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="FAIL" start="2026-04-17T03:26:22.852867" elapsed="0.054969">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:22.907991" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:22.908040" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:22.848061" elapsed="0.060004"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:22.908425" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:22.908154" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:22.908132" elapsed="0.000376"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:22.847893" elapsed="0.060640"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:22.847705" elapsed="0.060863"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:22.845222" elapsed="0.063406"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:22.839711" elapsed="0.068975"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:22.839055" elapsed="0.069684"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:22.835669" elapsed="0.073128"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:22.912120" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:23.113738" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:23.517222" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:23.520396" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:22.909258" elapsed="0.616837">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:23.526767" elapsed="0.000156"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:23.527375" elapsed="0.000055"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:23.528067" elapsed="0.000036"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:22.908970" elapsed="0.619253">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:22.835129" elapsed="0.693167">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:22.834265" elapsed="0.694256">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:23.532730" elapsed="0.000242"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:23.532443" elapsed="0.000588"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:23.534122" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:23.533984" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:23.533959" elapsed="0.000242"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:23.539953" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:23.539822" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:23.539802" elapsed="0.000227"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:23.541134" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:23.540691" elapsed="0.000473"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:23.541648" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:23.541330" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:23.541723" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:26:23.541895" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:23.540282" elapsed="0.001639"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:23.548070" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:23.547904" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:23.547879" elapsed="0.000268"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:23.549729" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:23.549525" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:23.549506" elapsed="0.000395"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:23.550519" level="INFO">${karaf_connection_index} = 31</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:23.550082" elapsed="0.000501"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:23.551292" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:23.551006" elapsed="0.000348"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:23.553775" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:23.553312" elapsed="0.001063">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:23.554526" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:23.554624" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:23.551667" elapsed="0.003017"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:23.557207" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:23.556721" elapsed="0.001108">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:23.558064" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:23.558161" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:23.555124" elapsed="0.003097"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:23.559770" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_arb"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:23.558997" elapsed="0.001009">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_arb"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:23.558533" elapsed="0.001586">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_arb"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:23.558498" elapsed="0.001765">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_arb"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:23.560443" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:23.560854" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:23.560645" elapsed="0.000344"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:23.560624" elapsed="0.000426"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:23.561091" elapsed="0.000018"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:23.565344" elapsed="0.000165"/>
</kw>
<msg time="2026-04-17T03:26:23.565578" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:23.564721" elapsed="0.000953"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:23.566034" elapsed="0.000034"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:23.566346" elapsed="0.000032"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:23.563726" 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-04-17T03:26:23.561395" elapsed="0.005343"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:23.549068" elapsed="0.018019">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_arb"</status>
</kw>
<msg time="2026-04-17T03:26:23.567244" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:23.567315" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_arb"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:23.548310" elapsed="0.019044"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:23.567596" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:23.567446" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:23.567422" elapsed="0.000265"/>
</if>
<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-04-17T03:26:23.569021" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:23.568864" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:23.568830" elapsed="0.000299"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:23.569454" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:23.569568" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:23.569314" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:23.570344" level="INFO">{1: 31}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:23.569794" elapsed="0.000598"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:23.570868" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:23.570553" elapsed="0.000405"/>
</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-04-17T03:26:23.571601" elapsed="0.000469"/>
</kw>
<msg time="2026-04-17T03:26:23.572366" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:23.572421" level="INFO">${old_connection_index} = 31</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:23.571148" elapsed="0.001298"/>
</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-04-17T03:26:23.574525" elapsed="0.000467"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:23.576279" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:23.576098" elapsed="0.000698">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:23.575322" elapsed="0.001590"/>
</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-04-17T03:26:23.577880" elapsed="0.000132"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:23.577249" elapsed="0.000857"/>
</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-04-17T03:26:23.572763" elapsed="0.005437"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:23.572528" elapsed="0.005835"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:23.572508" elapsed="0.005885"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:23.579891" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:23.579309" elapsed="0.000646"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:23.580275" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:26:23.580445" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:23.578621" elapsed="0.001850"/>
</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-04-17T03:26:23.580634" elapsed="0.000643"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:23.581569" level="INFO">index=32
host=10.30.170.120
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-04-17T03:26:23.581673" level="INFO">${karaf_connection_object} = index=32
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:23.581453" elapsed="0.000247"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:26:23.581853" elapsed="0.009145"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:23.591649" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:23.592843" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:23.591220" elapsed="0.002097">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:23.598843" elapsed="0.000226"/>
</kw>
<msg time="2026-04-17T03:26:23.599146" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:23.597880" elapsed="0.001412"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:23.600151" elapsed="0.000065"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:23.601179" 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-04-17T03:26:23.594608" elapsed="0.006791"/>
</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-04-17T03:26:23.593637" elapsed="0.007870"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:23.568260" elapsed="0.033336">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:23.602096" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:23.602176" 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="FAIL" start="2026-04-17T03:26:23.547533" elapsed="0.054761">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:23.602412" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:23.602457" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:23.542348" elapsed="0.060133"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:23.602835" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:23.602566" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:23.602546" elapsed="0.000373"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:23.542194" elapsed="0.060791"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:23.542001" elapsed="0.061023"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:23.539435" elapsed="0.063655"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:23.533645" elapsed="0.069561"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:23.533189" elapsed="0.070069"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:23.530005" elapsed="0.073348"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:23.606573" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:23.808495" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:24.211800" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:24.215109" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:23.603836" elapsed="0.617233">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:24.221451" elapsed="0.000042"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:24.221717" elapsed="0.000030"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:24.222162" elapsed="0.000054"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:23.603547" elapsed="0.618835">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:23.529438" elapsed="0.693045">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:23.528885" elapsed="0.693819">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:24.227843" elapsed="0.000248"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:24.227568" 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-04-17T03:26:24.229228" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:24.229093" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:24.229068" 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-04-17T03:26:24.234880" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:24.234759" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:24.234739" elapsed="0.000234"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:24.237012" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:24.236543" elapsed="0.000500"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:24.237633" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:24.237299" elapsed="0.000362"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:24.237709" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:26:24.237885" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:24.235242" elapsed="0.002669"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:24.244868" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:24.244698" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:24.244665" elapsed="0.000334"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:24.246912" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:24.246724" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:24.246706" elapsed="0.000389"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:24.247745" level="INFO">${karaf_connection_index} = 32</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:24.247254" elapsed="0.000556"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:24.248655" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:24.248307" elapsed="0.000417"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:24.251802" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:24.251101" elapsed="0.001307">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:24.252559" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:24.252656" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:24.249145" elapsed="0.003573"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:24.255129" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:24.254662" elapsed="0.001079">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:24.255886" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:24.256023" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:24.253130" elapsed="0.002953"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:24.257538" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_as"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:24.256742" elapsed="0.001003">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_as"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:24.256378" elapsed="0.001478">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_as"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:24.256357" elapsed="0.001595">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_as"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:24.258128" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:24.258535" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:24.258330" elapsed="0.000320"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:24.258311" elapsed="0.000396"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:24.258744" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:24.262641" elapsed="0.000152"/>
</kw>
<msg time="2026-04-17T03:26:24.262843" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:24.261965" elapsed="0.000945"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:24.263283" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:24.263572" elapsed="0.000024"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:24.261191" elapsed="0.002658"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:24.259219" elapsed="0.004778"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:24.246162" elapsed="0.018081">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_as"</status>
</kw>
<msg time="2026-04-17T03:26:24.264358" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:24.264402" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_as"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:24.245216" elapsed="0.019209"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:24.264619" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:24.264507" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:24.264486" elapsed="0.000219"/>
</if>
<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-04-17T03:26:24.265658" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:24.265546" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:24.265528" elapsed="0.000198"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:24.266060" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:24.266214" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:24.265908" elapsed="0.000346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:24.266783" level="INFO">{1: 32}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:24.266423" elapsed="0.000417"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:24.267499" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:24.267144" elapsed="0.000404"/>
</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-04-17T03:26:24.268160" elapsed="0.000410"/>
</kw>
<msg time="2026-04-17T03:26:24.268819" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:24.268866" level="INFO">${old_connection_index} = 32</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:24.267743" elapsed="0.001146"/>
</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-04-17T03:26:24.270771" elapsed="0.000588"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:24.272839" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:24.272448" elapsed="0.000914">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:24.271740" elapsed="0.001779"/>
</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-04-17T03:26:24.274611" elapsed="0.000109"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:24.273902" elapsed="0.000911"/>
</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-04-17T03:26:24.269228" elapsed="0.005678"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:24.268985" elapsed="0.006040"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:24.268965" elapsed="0.006089"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:24.276308" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:24.275697" elapsed="0.000675"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:24.276559" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:26:24.276730" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:24.275277" elapsed="0.001478"/>
</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-04-17T03:26:24.276917" elapsed="0.000692"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:24.277950" level="INFO">index=33
host=10.30.170.120
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-04-17T03:26:24.278069" level="INFO">${karaf_connection_object} = index=33
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:24.277803" elapsed="0.000294"/>
</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-04-17T03:26:24.278306" elapsed="0.009330"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:24.288254" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:24.289535" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:24.287818" elapsed="0.002142">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:24.296017" elapsed="0.000360"/>
</kw>
<msg time="2026-04-17T03:26:24.296465" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:24.294739" elapsed="0.001897"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:24.297518" elapsed="0.000069"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:24.298569" elapsed="0.000072"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:24.291329" elapsed="0.007429"/>
</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-04-17T03:26:24.290456" elapsed="0.008416"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:24.265244" elapsed="0.033766">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:24.299514" elapsed="0.000031"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:24.299598" 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="FAIL" start="2026-04-17T03:26:24.244200" elapsed="0.055548">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:24.299867" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:24.299911" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:24.238363" elapsed="0.061589"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:24.300310" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:24.300043" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:24.300020" elapsed="0.000369"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:24.238195" elapsed="0.062219"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:24.237993" elapsed="0.062457"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:24.234354" elapsed="0.066158"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:24.228761" elapsed="0.071808"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:24.228307" elapsed="0.072309"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:24.224736" elapsed="0.075937"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:24.304356" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:24.505829" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:24.908718" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:24.912168" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:24.301131" elapsed="0.616473">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:24.918152" elapsed="0.000060"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:24.918565" elapsed="0.000046"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:24.919186" elapsed="0.000068"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:24.300828" elapsed="0.618668">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:24.224120" elapsed="0.695526">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:24.223277" elapsed="0.696795">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:24.924698" elapsed="0.000227"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:24.924425" elapsed="0.000577"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:24.926114" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:24.925982" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:24.925953" elapsed="0.000238"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:24.931325" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:24.931216" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:24.931197" elapsed="0.000197"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:24.932497" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:24.932088" elapsed="0.000437"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:24.933009" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:24.932689" elapsed="0.000346"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:24.933080" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:26:24.933240" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:24.931653" elapsed="0.001612"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:24.939052" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:24.938921" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:24.938902" 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-04-17T03:26:24.940596" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:24.940415" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:24.940398" elapsed="0.000360"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:24.941345" level="INFO">${karaf_connection_index} = 33</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:24.940909" elapsed="0.000498"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:24.942038" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:24.941753" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:24.944522" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:24.944050" elapsed="0.001046">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:24.945243" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:24.945337" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:24.942456" elapsed="0.002940"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:24.947890" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:24.947391" elapsed="0.001081">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:24.948616" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:24.948708" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:24.945824" elapsed="0.002941"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:24.950261" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_as"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:24.949502" elapsed="0.000957">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_as"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:24.949146" elapsed="0.001420">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_as"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:24.949124" elapsed="0.001520">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_as"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:24.950813" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:24.951304" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:24.951028" elapsed="0.000406"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:24.951009" elapsed="0.000484"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:24.951532" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:24.955298" elapsed="0.000147"/>
</kw>
<msg time="2026-04-17T03:26:24.955507" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:24.954736" 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-04-17T03:26:24.955847" elapsed="0.000035"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:24.956118" 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-04-17T03:26:24.953985" elapsed="0.002356"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:24.951884" elapsed="0.004543"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:24.939973" elapsed="0.016617">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_as"</status>
</kw>
<msg time="2026-04-17T03:26:24.956698" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:24.956747" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_as"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:24.939277" elapsed="0.017495"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:24.957316" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:24.956848" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:24.956829" elapsed="0.000580"/>
</if>
<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-04-17T03:26:24.958903" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:24.958752" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:24.958720" elapsed="0.000302"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:24.959410" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:24.959559" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:24.959239" elapsed="0.000359"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:24.960439" level="INFO">{1: 33}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:24.959974" elapsed="0.000530"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:24.961114" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:24.960725" elapsed="0.000434"/>
</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-04-17T03:26:24.961690" elapsed="0.000492"/>
</kw>
<msg time="2026-04-17T03:26:24.962428" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:24.962475" level="INFO">${old_connection_index} = 33</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:24.961321" elapsed="0.001177"/>
</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-04-17T03:26:24.964310" elapsed="0.000376"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:24.965822" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:24.965657" elapsed="0.000658">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:24.965009" elapsed="0.001421"/>
</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-04-17T03:26:24.967403" elapsed="0.000104"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:24.966738" elapsed="0.000861"/>
</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-04-17T03:26:24.962796" elapsed="0.004896"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:24.962574" elapsed="0.005168"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:24.962556" elapsed="0.005211"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:24.969146" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:24.968467" elapsed="0.000727"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:24.969362" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:26:24.969521" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:24.968027" elapsed="0.001520"/>
</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-04-17T03:26:24.969708" elapsed="0.000630"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:24.970626" level="INFO">index=34
host=10.30.170.120
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-04-17T03:26:24.970727" level="INFO">${karaf_connection_object} = index=34
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:24.970513" elapsed="0.000239"/>
</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-04-17T03:26:24.970902" elapsed="0.010162"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:24.981652" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:24.982892" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:24.981240" elapsed="0.002062">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:24.988895" elapsed="0.000209"/>
</kw>
<msg time="2026-04-17T03:26:24.989185" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:24.987818" 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-04-17T03:26:24.990294" elapsed="0.000072"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:24.991232" elapsed="0.000066"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:24.984532" elapsed="0.006881"/>
</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-04-17T03:26:24.983603" elapsed="0.007921"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:24.958329" elapsed="0.033285">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:24.992168" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:24.992247" 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="FAIL" start="2026-04-17T03:26:24.938576" elapsed="0.053783">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:24.992468" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:24.992512" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:24.933654" elapsed="0.058882"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:24.992876" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:24.992617" elapsed="0.000410"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:24.992597" elapsed="0.000458"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:24.933500" elapsed="0.059579"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:24.933322" elapsed="0.059789"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:24.930798" elapsed="0.062370"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:24.925646" elapsed="0.067576"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:24.925158" elapsed="0.068108"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:24.921897" elapsed="0.071419"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:24.996345" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:25.197746" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:25.600674" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:25.603410" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:24.993742" elapsed="0.615607">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:25.610095" elapsed="0.000094"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:25.610647" elapsed="0.000057"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:25.611390" elapsed="0.000069"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:24.993464" elapsed="0.618272">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:24.921362" elapsed="0.690561">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:24.920760" elapsed="0.691750">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:25.617279" elapsed="0.000269"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:25.616916" 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-04-17T03:26:25.618798" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:25.618653" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:25.618628" 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-04-17T03:26:25.624259" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:25.624084" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:25.624065" elapsed="0.000289"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:25.625519" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:25.625096" elapsed="0.000454"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:25.626049" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:25.625718" elapsed="0.000372"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:25.626161" elapsed="0.000047"/>
</return>
<msg time="2026-04-17T03:26:25.626366" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:25.624663" elapsed="0.001729"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:25.632334" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:25.632216" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:25.632195" elapsed="0.000209"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:25.634029" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:25.633798" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:25.633773" elapsed="0.000424"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:25.634826" level="INFO">${karaf_connection_index} = 34</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:25.634356" elapsed="0.000558"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:25.635639" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:25.635323" elapsed="0.000378"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:25.638248" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:25.637712" elapsed="0.001356">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:25.639224" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:25.639336" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:25.636042" elapsed="0.003369"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:25.642339" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:25.641830" elapsed="0.001324">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:25.643328" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:25.643432" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:25.639901" elapsed="0.003592"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:25.644999" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_lacp"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:25.644204" elapsed="0.001004">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_lacp"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:25.643795" elapsed="0.001525">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_lacp"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:25.643773" elapsed="0.001678">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_lacp"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:25.645660" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:25.646130" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:25.645881" elapsed="0.000392"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:25.645859" elapsed="0.000483"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:25.646391" elapsed="0.000021"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:25.650727" elapsed="0.000164"/>
</kw>
<msg time="2026-04-17T03:26:25.651073" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:25.650158" elapsed="0.000989"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:25.651371" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:25.651591" 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-04-17T03:26:25.649270" elapsed="0.002551"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:25.646762" elapsed="0.005163"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:25.633291" elapsed="0.018837">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_lacp"</status>
</kw>
<msg time="2026-04-17T03:26:25.652288" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:25.652347" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_lacp"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:25.632581" elapsed="0.019793"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:25.652571" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:25.652456" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:25.652436" elapsed="0.000203"/>
</if>
<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-04-17T03:26:25.653631" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:25.653518" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:25.653497" elapsed="0.000203"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:25.654010" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:25.654120" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:25.653860" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:25.654657" level="INFO">{1: 34}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:25.654308" elapsed="0.000406"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:25.655332" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:25.654878" elapsed="0.000499"/>
</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-04-17T03:26:25.655993" elapsed="0.000454"/>
</kw>
<msg time="2026-04-17T03:26:25.656697" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:25.656747" level="INFO">${old_connection_index} = 34</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:25.655545" elapsed="0.001225"/>
</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-04-17T03:26:25.658699" elapsed="0.000599"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:25.660707" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:25.660537" elapsed="0.000861">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:25.659670" elapsed="0.001843"/>
</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-04-17T03:26:25.662509" elapsed="0.000108"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:25.661834" elapsed="0.000877"/>
</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-04-17T03:26:25.657101" elapsed="0.005704"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:25.656852" elapsed="0.006047"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:25.656832" elapsed="0.006137"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:25.664302" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:25.663608" elapsed="0.000748"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:25.664538" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:26:25.664708" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:25.663189" elapsed="0.001547"/>
</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-04-17T03:26:25.664905" elapsed="0.000827"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:25.666042" level="INFO">index=35
host=10.30.170.120
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-04-17T03:26:25.666151" level="INFO">${karaf_connection_object} = index=35
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:25.665912" elapsed="0.000273"/>
</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-04-17T03:26:25.666374" elapsed="0.008732"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:25.675894" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:25.677074" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:25.675476" elapsed="0.002004">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:25.683441" elapsed="0.000160"/>
</kw>
<msg time="2026-04-17T03:26:25.683677" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:25.682363" elapsed="0.001469"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:25.685009" elapsed="0.000096"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:25.686091" elapsed="0.000081"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:25.678440" elapsed="0.007850"/>
</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-04-17T03:26:25.677794" elapsed="0.008606"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:25.653157" elapsed="0.033333">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:25.686988" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:25.687072" 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="FAIL" start="2026-04-17T03:26:25.631808" elapsed="0.055407">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:25.687345" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:25.687391" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:25.626797" elapsed="0.060618"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:25.687804" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:25.687506" elapsed="0.000356"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:25.687480" elapsed="0.000408"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:25.626644" elapsed="0.061269"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:25.626455" elapsed="0.061514"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:25.623679" elapsed="0.064356"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:25.618287" elapsed="0.069886"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:25.617792" elapsed="0.070674"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:25.614225" elapsed="0.074301"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:25.691827" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:25.893394" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:26.295920" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:26.307231" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:25.689057" elapsed="0.621943">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:26.311419" elapsed="0.000047"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:26.311711" elapsed="0.000032"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:26.312179" elapsed="0.000042"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:25.688687" elapsed="0.623720">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:25.613641" elapsed="0.698917">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:25.613124" elapsed="0.699667">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:26.318890" elapsed="0.000247"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:26.318616" elapsed="0.000583"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:26.320345" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:26.320208" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:26.320183" 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-04-17T03:26:26.325556" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:26.325443" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:26.325425" elapsed="0.000199"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:26.326669" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:26.326262" elapsed="0.000436"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:26.327253" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:26.326942" elapsed="0.000337"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:26.327324" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:26:26.327487" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:26.325862" elapsed="0.001649"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:26.333481" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:26.333370" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:26.333351" 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-04-17T03:26:26.335049" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:26.334838" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:26.334820" elapsed="0.000390"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:26.335787" level="INFO">${karaf_connection_index} = 35</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:26.335365" elapsed="0.000484"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:26.336481" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:26.336215" elapsed="0.000343"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:26.338898" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:26.338426" elapsed="0.001222">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:26.339851" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:26.340029" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:26.336866" elapsed="0.003244"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:26.342912" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:26.342454" elapsed="0.001079">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:26.343679" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:26.343774" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:26.340784" elapsed="0.003048"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:26.345468" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_lacp"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:26.344620" elapsed="0.001053">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_lacp"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:26.344221" elapsed="0.001564">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_lacp"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:26.344198" elapsed="0.001667">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_lacp"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:26.346059" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:26.346464" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:26.346261" elapsed="0.000317"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:26.346242" elapsed="0.000394"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:26.346675" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:26.350747" elapsed="0.000166"/>
</kw>
<msg time="2026-04-17T03:26:26.350987" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:26.350133" 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-04-17T03:26:26.351276" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:26.351496" 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-04-17T03:26:26.349354" elapsed="0.002363"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:26.346996" elapsed="0.004811"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:26.334388" elapsed="0.017831">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_lacp"</status>
</kw>
<msg time="2026-04-17T03:26:26.352334" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:26.352378" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_lacp"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:26.333705" elapsed="0.018697"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:26.352624" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:26.352484" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:26.352464" elapsed="0.000228"/>
</if>
<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-04-17T03:26:26.353836" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:26.353729" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:26.353712" elapsed="0.000191"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:26.354223" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:26.354330" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:26.354085" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:26.354838" level="INFO">{1: 35}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:26.354509" elapsed="0.000374"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:26.355347" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:26.355052" elapsed="0.000339"/>
</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-04-17T03:26:26.356119" elapsed="0.000360"/>
</kw>
<msg time="2026-04-17T03:26:26.356845" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:26.356894" level="INFO">${old_connection_index} = 35</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:26.355552" elapsed="0.001365"/>
</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-04-17T03:26:26.358900" elapsed="0.000396"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:26.360582" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:26.360380" elapsed="0.000722">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:26.359600" elapsed="0.001613"/>
</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-04-17T03:26:26.362144" elapsed="0.000104"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:26.361517" elapsed="0.000820"/>
</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-04-17T03:26:26.357438" elapsed="0.004990"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:26.357014" elapsed="0.005463"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:26.356995" elapsed="0.005506"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:26.363663" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:26.363130" elapsed="0.000574"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:26.363866" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:26:26.364059" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:26.362718" elapsed="0.001366"/>
</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-04-17T03:26:26.364246" elapsed="0.000644"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:26.365203" level="INFO">index=36
host=10.30.170.120
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-04-17T03:26:26.365304" level="INFO">${karaf_connection_object} = index=36
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:26.365089" elapsed="0.000241"/>
</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-04-17T03:26:26.365546" elapsed="0.009116"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:26.375304" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:26.376607" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:26.374859" elapsed="0.002218">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:26.382565" elapsed="0.000173"/>
</kw>
<msg time="2026-04-17T03:26:26.382821" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:26.381580" 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-04-17T03:26:26.383905" elapsed="0.000087"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:26.384877" elapsed="0.000085"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:26.378357" elapsed="0.006722"/>
</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-04-17T03:26:26.377409" elapsed="0.007779"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:26.353420" elapsed="0.031875">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:26.385773" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:26.385864" elapsed="0.000024"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:26:26.333020" elapsed="0.053014">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:26.386159" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:26.386203" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:26.327895" elapsed="0.058332"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:26.386584" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:26.386314" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:26.386292" elapsed="0.000373"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:26.327747" elapsed="0.058944"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:26.327569" elapsed="0.059181"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:26.325068" elapsed="0.061754"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:26.319868" elapsed="0.067014"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:26.319357" elapsed="0.067590"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:26.315482" elapsed="0.071534"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:26.390565" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:26.592343" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:26.995488" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:26.998759" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:26.387485" elapsed="0.616887">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:27.004998" elapsed="0.000084"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:27.005563" elapsed="0.000048"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:27.006377" elapsed="0.000098"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:26.387193" elapsed="0.619586">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:26.314251" elapsed="0.692801">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:26.313215" elapsed="0.694356">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:27.014285" elapsed="0.000288"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:27.013957" elapsed="0.000693"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:27.016277" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:27.016070" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:27.016035" 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-04-17T03:26:27.023167" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:27.023010" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:27.022984" elapsed="0.000283"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:27.024562" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:27.024094" elapsed="0.000497"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:27.025099" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:27.024759" elapsed="0.000366"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:27.025169" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:26:27.025333" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:27.023598" elapsed="0.001759"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:27.031066" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:27.030955" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:27.030920" elapsed="0.000215"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:27.032569" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:27.032389" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:27.032371" elapsed="0.000360"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:27.033340" level="INFO">${karaf_connection_index} = 36</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:27.032885" elapsed="0.000517"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:27.034160" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:27.033813" elapsed="0.000408"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:27.036758" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:27.036317" elapsed="0.001069">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:27.037532" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:27.037649" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:27.034720" elapsed="0.003030"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:27.040315" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:27.039871" elapsed="0.000989">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:27.041119" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:27.041212" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:27.038195" elapsed="0.003075"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:27.042677" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_lacp_extdef"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:27.041918" elapsed="0.000982">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_lacp_extdef"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:27.041564" elapsed="0.001464">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_lacp_extdef"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:27.041543" elapsed="0.001564">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_lacp_extdef"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:27.043303" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:27.043756" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:27.043537" elapsed="0.000331"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:27.043516" elapsed="0.000470"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:27.044027" elapsed="0.000018"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:27.047943" elapsed="0.000175"/>
</kw>
<msg time="2026-04-17T03:26:27.048168" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:27.047353" elapsed="0.000881"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:27.048451" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:27.048684" 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-04-17T03:26:27.046580" 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-04-17T03:26:27.044337" elapsed="0.004720"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:27.031947" elapsed="0.017272">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_lacp_extdef"</status>
</kw>
<msg time="2026-04-17T03:26:27.049336" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:27.049380" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_lacp_extdef"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:27.031291" elapsed="0.018124"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:27.049611" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:27.049502" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:27.049483" elapsed="0.000194"/>
</if>
<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-04-17T03:26:27.050919" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:27.050812" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:27.050794" elapsed="0.000210"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:27.051300" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:27.051450" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:27.051167" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:27.051989" level="INFO">{1: 36}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:27.051632" elapsed="0.000403"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:27.052641" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:27.052211" elapsed="0.000476"/>
</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-04-17T03:26:27.053583" elapsed="0.000657"/>
</kw>
<msg time="2026-04-17T03:26:27.055347" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:27.055396" level="INFO">${old_connection_index} = 36</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:27.052863" elapsed="0.002556"/>
</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-04-17T03:26:27.057573" elapsed="0.000593"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:27.059331" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:27.059131" elapsed="0.000697">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:27.058485" elapsed="0.001473"/>
</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-04-17T03:26:27.061041" elapsed="0.000112"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:27.060314" elapsed="0.000942"/>
</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-04-17T03:26:27.055725" elapsed="0.005623"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:27.055497" elapsed="0.005907"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:27.055478" elapsed="0.005953"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:27.062588" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:27.062060" elapsed="0.000568"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:27.062791" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:26:27.062986" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:27.061648" elapsed="0.001368"/>
</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-04-17T03:26:27.063184" elapsed="0.000609"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:27.064109" level="INFO">index=37
host=10.30.170.120
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-04-17T03:26:27.064212" level="INFO">${karaf_connection_object} = index=37
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:27.063992" elapsed="0.000247"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:26:27.064394" elapsed="0.008752"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:27.073866" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:27.075308" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:27.073365" elapsed="0.002385">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:27.081148" elapsed="0.000159"/>
</kw>
<msg time="2026-04-17T03:26:27.081384" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:27.080288" elapsed="0.001249"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:27.082550" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:27.083496" elapsed="0.000067"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:27.076745" elapsed="0.006941"/>
</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-04-17T03:26:27.076104" elapsed="0.007741"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:27.050509" elapsed="0.033445">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:27.084420" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:27.084499" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:26:27.030595" elapsed="0.054026">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:27.084742" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:27.084788" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:27.025748" elapsed="0.059065"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:27.085237" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:27.084899" elapsed="0.000394"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:27.084878" elapsed="0.000441"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:27.025600" elapsed="0.059745"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:27.025416" elapsed="0.059963"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:27.022476" elapsed="0.062961"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:27.015603" elapsed="0.069891"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:27.014858" elapsed="0.070682"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:27.011111" elapsed="0.074484"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:27.088726" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:27.290300" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:27.693660" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:27.696094" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:27.086077" elapsed="0.613398">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:27.699840" elapsed="0.000042"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:27.700138" elapsed="0.000030"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:27.700522" elapsed="0.000037"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:27.085763" elapsed="0.614947">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:27.010087" elapsed="0.690800">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:27.008536" elapsed="0.692597">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:27.708846" elapsed="0.000273"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:27.708559" 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-04-17T03:26:27.710424" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:27.710265" elapsed="0.000244"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:27.710231" elapsed="0.000309"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:27.716671" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:27.716516" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:27.716489" elapsed="0.000272"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:27.718193" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:27.717641" elapsed="0.000590"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:27.718793" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:27.718445" elapsed="0.000382"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:27.718880" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:26:27.719075" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:27.717106" elapsed="0.001999"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:27.727043" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:27.726864" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:27.726833" elapsed="0.000313"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:27.729370" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:27.729048" elapsed="0.000470"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:27.729020" elapsed="0.000582"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:27.730444" level="INFO">${karaf_connection_index} = 37</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:27.729829" elapsed="0.000704"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:27.731421" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:27.731047" elapsed="0.000458"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:27.734466" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:27.733829" elapsed="0.001358">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:27.735376" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:27.735478" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:27.731964" elapsed="0.003575"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:27.738700" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:27.738130" elapsed="0.001444">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:27.739778" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:27.739911" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:27.736076" elapsed="0.003959"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:27.742369" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_lacp_extdef"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:27.741014" elapsed="0.001723">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_lacp_extdef"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:27.740451" elapsed="0.002440">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_lacp_extdef"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:27.740417" elapsed="0.002607">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_lacp_extdef"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:27.743279" elapsed="0.000034"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:27.743825" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:27.743550" elapsed="0.000443"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:27.743522" elapsed="0.000542"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:27.744111" 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-04-17T03:26:27.749055" elapsed="0.000241"/>
</kw>
<msg time="2026-04-17T03:26:27.749362" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:27.748358" elapsed="0.001093"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:27.749744" elapsed="0.000033"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:27.750222" 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-04-17T03:26:27.747287" elapsed="0.003235"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:27.744539" elapsed="0.006104"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:27.728394" elapsed="0.022478">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_lacp_extdef"</status>
</kw>
<msg time="2026-04-17T03:26:27.751051" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:27.751114" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_lacp_extdef"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:27.727391" elapsed="0.023759"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:27.751444" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:27.751278" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:27.751243" elapsed="0.000300"/>
</if>
<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-04-17T03:26:27.753180" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:27.753025" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:27.752992" elapsed="0.000272"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:27.753663" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:27.753778" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:27.753509" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:27.754533" level="INFO">{1: 37}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:27.754156" elapsed="0.000426"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:27.755086" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:27.754746" elapsed="0.000417"/>
</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-04-17T03:26:27.755783" elapsed="0.000393"/>
</kw>
<msg time="2026-04-17T03:26:27.756430" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:27.756481" level="INFO">${old_connection_index} = 37</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:27.755364" elapsed="0.001142"/>
</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-04-17T03:26:27.758586" elapsed="0.000407"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:27.760208" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:27.760021" elapsed="0.000735">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:27.759363" elapsed="0.001592"/>
</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-04-17T03:26:27.762051" elapsed="0.000145"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:27.761321" elapsed="0.000978"/>
</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-04-17T03:26:27.756823" elapsed="0.005570"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:27.756586" elapsed="0.005860"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:27.756567" elapsed="0.005906"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:27.763875" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:27.763155" elapsed="0.000791"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:27.764173" elapsed="0.000049"/>
</return>
<msg time="2026-04-17T03:26:27.764392" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:27.762706" elapsed="0.001721"/>
</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-04-17T03:26:27.764644" elapsed="0.000850"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:27.765879" level="INFO">index=38
host=10.30.170.120
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-04-17T03:26:27.766147" level="INFO">${karaf_connection_object} = index=38
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:27.765729" elapsed="0.000455"/>
</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-04-17T03:26:27.766395" elapsed="0.009298"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:27.777185" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:27.778550" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:27.776469" elapsed="0.002633">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:27.786588" elapsed="0.000206"/>
</kw>
<msg time="2026-04-17T03:26:27.786904" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:27.785455" elapsed="0.001684"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:27.788302" elapsed="0.000091"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:27.789550" elapsed="0.000083"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:27.780675" elapsed="0.009109"/>
</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-04-17T03:26:27.779570" elapsed="0.010474"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:27.752259" elapsed="0.037932">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:27.790864" elapsed="0.000044"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:27.791001" elapsed="0.000031"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:26:27.726344" elapsed="0.064826">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:27.791328" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:27.791387" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:27.719565" elapsed="0.071855"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:27.791905" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:27.791535" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:27.791508" elapsed="0.000615"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:27.719410" elapsed="0.072749"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:27.719185" elapsed="0.073021"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:27.716010" elapsed="0.076281"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:27.709888" elapsed="0.082485"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:27.709370" elapsed="0.083073"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:27.706163" elapsed="0.086361"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:27.796915" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:27.998596" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:28.401286" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:28.404056" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:27.793187" elapsed="0.615397">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:28.408985" elapsed="0.000044"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:28.409277" elapsed="0.000041"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:28.409752" elapsed="0.000039"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:27.792743" elapsed="0.617239">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:27.702300" elapsed="0.707790">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:27.701597" elapsed="0.708727">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:28.417233" elapsed="0.000248"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:28.416878" 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-04-17T03:26:28.418685" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:28.418546" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:28.418522" elapsed="0.000241"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:28.424081" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:28.423940" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:28.423906" elapsed="0.000265"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:28.425383" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:28.424908" elapsed="0.000506"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:28.425995" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:28.425601" elapsed="0.000422"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:28.426071" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:26:28.426244" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:28.424462" elapsed="0.001807"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:28.432089" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:28.431956" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:28.431909" 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-04-17T03:26:28.433997" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:28.433568" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:28.433549" elapsed="0.000626"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:28.434782" level="INFO">${karaf_connection_index} = 38</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:28.434338" elapsed="0.000510"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:28.435536" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:28.435239" elapsed="0.000362"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:28.438402" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:28.437870" elapsed="0.001617">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:28.439693" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:28.439805" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:28.435920" elapsed="0.003951"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:28.442677" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:28.442207" elapsed="0.001073">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:28.443430" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:28.443529" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:28.440416" elapsed="0.003174"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:28.445291" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_lacp_extesilab"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:28.444316" elapsed="0.001230">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_lacp_extesilab"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:28.443912" elapsed="0.001793">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_lacp_extesilab"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:28.443884" elapsed="0.001927">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_lacp_extesilab"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:28.446268" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:28.446716" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:28.446484" elapsed="0.000351"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:28.446461" elapsed="0.000435"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:28.446964" 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-04-17T03:26:28.451186" elapsed="0.000167"/>
</kw>
<msg time="2026-04-17T03:26:28.451401" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:28.450451" 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-04-17T03:26:28.451757" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:28.451991" 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-04-17T03:26:28.449378" elapsed="0.002832"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:28.447319" elapsed="0.004977"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:28.433099" elapsed="0.019359">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_lacp_extesilab"</status>
</kw>
<msg time="2026-04-17T03:26:28.452570" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:28.452615" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_lacp_extesilab"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:28.432348" elapsed="0.020290"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:28.452824" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:28.452716" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:28.452697" elapsed="0.000193"/>
</if>
<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-04-17T03:26:28.453921" elapsed="0.000169"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:28.453815" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:28.453797" elapsed="0.000348"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:28.454600" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:28.454707" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:28.454467" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:28.455227" level="INFO">{1: 38}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:28.454894" elapsed="0.000379"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:28.455721" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:28.455427" elapsed="0.000338"/>
</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-04-17T03:26:28.456322" elapsed="0.000356"/>
</kw>
<msg time="2026-04-17T03:26:28.456920" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:28.456984" level="INFO">${old_connection_index} = 38</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:28.455951" elapsed="0.001057"/>
</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-04-17T03:26:28.458889" elapsed="0.000535"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:28.460889" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:28.460659" elapsed="0.001554">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:28.459824" elapsed="0.002566"/>
</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-04-17T03:26:28.465278" elapsed="0.000104"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:28.462820" elapsed="0.002654"/>
</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-04-17T03:26:28.457320" elapsed="0.008244"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:28.457084" elapsed="0.008530"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:28.457066" elapsed="0.008573"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:28.466812" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:28.466291" elapsed="0.000562"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:28.467029" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:26:28.467193" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:28.465863" elapsed="0.001355"/>
</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-04-17T03:26:28.467374" elapsed="0.000722"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:28.468426" level="INFO">index=39
host=10.30.170.120
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-04-17T03:26:28.468528" level="INFO">${karaf_connection_object} = index=39
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:28.468316" elapsed="0.000238"/>
</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-04-17T03:26:28.468705" elapsed="0.008311"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:28.477583" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:28.481229" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:28.477185" elapsed="0.004424">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:28.486793" elapsed="0.000164"/>
</kw>
<msg time="2026-04-17T03:26:28.487030" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:28.485850" elapsed="0.001324"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:28.488182" elapsed="0.000070"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:28.489112" elapsed="0.000067"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:28.482568" elapsed="0.006721"/>
</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-04-17T03:26:28.481939" elapsed="0.007457"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:28.453455" elapsed="0.036027">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:28.489943" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:28.490021" 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="FAIL" start="2026-04-17T03:26:28.431551" elapsed="0.058584">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:28.490244" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:28.490304" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:28.426685" elapsed="0.063643"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:28.490672" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:28.490408" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:28.490390" elapsed="0.000361"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:28.426532" elapsed="0.064242"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:28.426328" elapsed="0.064479"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:28.423456" elapsed="0.067409"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:28.418224" elapsed="0.072715"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:28.417731" elapsed="0.073258"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:28.413908" elapsed="0.077150"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:28.494126" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:28.695506" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:29.099021" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:29.103278" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:28.491502" elapsed="0.617418">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:29.109344" elapsed="0.000043"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:29.109647" elapsed="0.000031"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:29.110088" elapsed="0.000044"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:28.491227" elapsed="0.619058">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:28.412621" elapsed="0.697761">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:28.411162" elapsed="0.699473">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:29.117238" elapsed="0.000226"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:29.116961" 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-04-17T03:26:29.118824" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:29.118636" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:29.118611" elapsed="0.000344"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:29.124466" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:29.124345" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:29.124326" elapsed="0.000211"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:29.125698" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:29.125275" elapsed="0.000452"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:29.126459" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:29.125894" elapsed="0.000591"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:29.126531" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:26:29.126697" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:29.124819" elapsed="0.001902"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:29.134516" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:29.134384" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:29.134360" elapsed="0.000239"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:29.136206" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:29.136019" elapsed="0.000381"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:29.136001" elapsed="0.000461"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:29.137071" level="INFO">${karaf_connection_index} = 39</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:29.136619" elapsed="0.000516"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:29.137795" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:29.137489" elapsed="0.000368"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:29.140302" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:29.139811" elapsed="0.001273">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:29.141239" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:29.141337" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:29.138236" elapsed="0.003160"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:29.144211" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:29.143748" elapsed="0.001021">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:29.144915" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:29.145103" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:29.141863" elapsed="0.003301"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:29.146854" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_lacp_extesilab"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:29.145865" elapsed="0.001274">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_lacp_extesilab"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:29.145468" elapsed="0.001785">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_lacp_extesilab"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:29.145445" elapsed="0.001889">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_lacp_extesilab"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:29.147509" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:29.147991" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:29.147710" elapsed="0.000416"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:29.147690" elapsed="0.000496"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:29.148226" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:29.152315" elapsed="0.000171"/>
</kw>
<msg time="2026-04-17T03:26:29.152549" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:29.151593" 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-04-17T03:26:29.152913" elapsed="0.000264"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:29.153487" 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-04-17T03:26:29.150798" 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-04-17T03:26:29.148541" elapsed="0.005276"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:29.135549" elapsed="0.018526">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_lacp_extesilab"</status>
</kw>
<msg time="2026-04-17T03:26:29.154190" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:29.154233" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_lacp_extesilab"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:29.134794" elapsed="0.019463"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:29.154653" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:29.154339" elapsed="0.000377"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:29.154319" elapsed="0.000428"/>
</if>
<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-04-17T03:26:29.156149" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:29.156008" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:29.155988" elapsed="0.000306"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:29.156685" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:29.156838" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:29.156504" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:29.157481" level="INFO">{1: 39}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:29.157103" elapsed="0.000425"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:29.158223" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:29.157698" elapsed="0.000572"/>
</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-04-17T03:26:29.158871" elapsed="0.000489"/>
</kw>
<msg time="2026-04-17T03:26:29.159614" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:29.159663" level="INFO">${old_connection_index} = 39</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:29.158437" elapsed="0.001249"/>
</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-04-17T03:26:29.161686" elapsed="0.000480"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:29.163526" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:29.163201" elapsed="0.000851">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:29.162491" elapsed="0.001698"/>
</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-04-17T03:26:29.165254" elapsed="0.000111"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:29.164519" elapsed="0.000941"/>
</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-04-17T03:26:29.160015" elapsed="0.005540"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:29.159766" elapsed="0.005839"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:29.159747" elapsed="0.005886"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:29.167093" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:29.166316" elapsed="0.000824"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:29.167322" elapsed="0.000191"/>
</return>
<msg time="2026-04-17T03:26:29.167642" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:29.165865" elapsed="0.001802"/>
</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-04-17T03:26:29.167844" elapsed="0.000666"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:29.168831" level="INFO">index=40
host=10.30.170.120
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-04-17T03:26:29.169031" level="INFO">${karaf_connection_object} = index=40
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:29.168699" elapsed="0.000361"/>
</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-04-17T03:26:29.169240" elapsed="0.009666"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:29.179769" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:29.180971" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:29.179220" elapsed="0.002208">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:29.187050" elapsed="0.000162"/>
</kw>
<msg time="2026-04-17T03:26:29.187307" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:29.185960" 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-04-17T03:26:29.188430" elapsed="0.000237"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:29.189566" elapsed="0.000066"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:29.182485" elapsed="0.007259"/>
</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-04-17T03:26:29.181773" elapsed="0.008079"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:29.155670" elapsed="0.034286">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:29.190445" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:29.190525" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:26:29.133875" elapsed="0.056767">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:29.190757" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:29.190801" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:29.127176" elapsed="0.063650"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:29.191215" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:29.190946" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:29.190903" elapsed="0.000392"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:29.127005" elapsed="0.064314"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:29.126781" elapsed="0.064570"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:29.123913" elapsed="0.067497"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:29.118321" elapsed="0.073147"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:29.117704" elapsed="0.073812"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:29.113951" elapsed="0.077621"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:29.194661" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:29.396208" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:29.799258" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:29.802321" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:29.192029" elapsed="0.615622">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:29.808032" elapsed="0.000041"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:29.808350" elapsed="0.000029"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:29.808726" elapsed="0.000106"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:29.191726" elapsed="0.617283">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:29.112850" elapsed="0.696266">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:29.111503" elapsed="0.697849">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:29.815339" elapsed="0.000236"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:29.815043" elapsed="0.000589"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:29.816685" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:29.816556" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:29.816532" 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-04-17T03:26:29.821806" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:29.821697" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:29.821678" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:29.823000" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:29.822562" elapsed="0.000476"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:29.823526" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:29.823213" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:29.823597" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:26:29.823759" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:29.822127" elapsed="0.001657"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:29.829768" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:29.829645" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:29.829623" 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-04-17T03:26:29.831745" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:29.831534" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:29.831514" elapsed="0.000425"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:29.832596" level="INFO">${karaf_connection_index} = 40</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:29.832130" elapsed="0.000538"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:29.833329" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:29.833047" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:29.837662" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:29.835324" elapsed="0.002935">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:29.838462" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:29.838563" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:29.833705" elapsed="0.004917"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:29.841145" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:29.840694" elapsed="0.001008">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:29.841904" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:29.842015" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:29.839042" elapsed="0.003034"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:29.843582" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_lacp_extesr"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:29.842782" elapsed="0.001009">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_lacp_extesr"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:29.842408" elapsed="0.001496">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_lacp_extesr"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:29.842383" elapsed="0.001766">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_lacp_extesr"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:29.844323" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:29.844729" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:29.844524" elapsed="0.000321"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:29.844505" elapsed="0.000400"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:29.844960" elapsed="0.000019"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:29.849408" elapsed="0.000177"/>
</kw>
<msg time="2026-04-17T03:26:29.849640" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:29.848717" elapsed="0.000997"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:29.849981" elapsed="0.000027"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:29.850247" 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-04-17T03:26:29.847712" elapsed="0.002813"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:29.845310" elapsed="0.005312"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:29.831019" elapsed="0.019784">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_lacp_extesr"</status>
</kw>
<msg time="2026-04-17T03:26:29.850950" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:29.851002" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_lacp_extesr"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:29.830053" elapsed="0.020975"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:29.851247" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:29.851117" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:29.851095" elapsed="0.000228"/>
</if>
<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-04-17T03:26:29.852530" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:29.852390" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:29.852360" elapsed="0.000247"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:29.853164" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:29.853296" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:29.852810" elapsed="0.000515"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:29.853812" level="INFO">{1: 40}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:29.853485" elapsed="0.000372"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:29.854420" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:29.854034" elapsed="0.000434"/>
</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-04-17T03:26:29.855040" elapsed="0.000563"/>
</kw>
<msg time="2026-04-17T03:26:29.855850" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:29.855898" level="INFO">${old_connection_index} = 40</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:29.854633" elapsed="0.001288"/>
</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-04-17T03:26:29.857952" elapsed="0.000394"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:29.859735" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:29.859338" elapsed="0.000918">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:29.858689" elapsed="0.001682"/>
</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-04-17T03:26:29.861403" elapsed="0.000108"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:29.860687" elapsed="0.000917"/>
</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-04-17T03:26:29.856300" elapsed="0.005400"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:29.856071" elapsed="0.005680"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:29.856050" elapsed="0.005728"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:29.863108" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:29.862502" elapsed="0.000653"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:29.863323" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:26:29.863491" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:29.862024" elapsed="0.001492"/>
</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-04-17T03:26:29.863690" elapsed="0.000749"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:29.864735" level="INFO">index=41
host=10.30.170.120
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-04-17T03:26:29.864837" level="INFO">${karaf_connection_object} = index=41
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:29.864617" elapsed="0.000245"/>
</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-04-17T03:26:29.865033" elapsed="0.008802"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:29.874481" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:29.875702" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:29.874031" elapsed="0.002316">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:29.881841" elapsed="0.000177"/>
</kw>
<msg time="2026-04-17T03:26:29.882097" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:29.880841" 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-04-17T03:26:29.883171" elapsed="0.000084"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:29.884164" elapsed="0.000067"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:29.877332" elapsed="0.007016"/>
</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-04-17T03:26:29.876678" elapsed="0.007779"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:29.851893" elapsed="0.032655">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:29.885033" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:29.885113" 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="FAIL" start="2026-04-17T03:26:29.829191" elapsed="0.056037">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:29.885341" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:29.885386" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:29.824189" elapsed="0.061278"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:29.885848" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:29.885578" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:29.885554" elapsed="0.000400"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:29.824043" elapsed="0.061938"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:29.823842" elapsed="0.062173"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:29.821332" elapsed="0.064741"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:29.816247" elapsed="0.069883"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:29.815785" elapsed="0.070391"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:29.811408" elapsed="0.074820"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:29.889373" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:30.090853" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:30.493444" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:30.497166" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:29.886747" elapsed="0.615397">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:30.502861" elapsed="0.000097"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:30.503328" elapsed="0.000047"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:30.503965" elapsed="0.000061"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:29.886382" elapsed="0.617932">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:29.810528" elapsed="0.693954">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:29.809795" elapsed="0.695045">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:30.512813" elapsed="0.000318"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:30.512534" elapsed="0.000748"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:30.514751" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:30.514523" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:30.514483" elapsed="0.000375"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:30.521203" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:30.521055" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:30.521027" elapsed="0.000271"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:30.522690" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:30.522148" elapsed="0.000604"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:30.523425" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:30.523000" elapsed="0.000461"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:30.523523" elapsed="0.000056"/>
</return>
<msg time="2026-04-17T03:26:30.523740" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:30.521620" elapsed="0.002149"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:30.530159" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:30.530047" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:30.530027" 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-04-17T03:26:30.531832" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:30.531609" elapsed="0.000378"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:30.531590" elapsed="0.000467"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:30.532733" level="INFO">${karaf_connection_index} = 41</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:30.532249" elapsed="0.000549"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:30.533504" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:30.533193" elapsed="0.000390"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:30.536623" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:30.536007" elapsed="0.001433">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:30.537639" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:30.537771" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:30.533996" elapsed="0.003855"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:30.540984" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:30.540457" elapsed="0.001108">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:30.541711" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:30.541807" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:30.538386" elapsed="0.003485"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:30.543618" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_lacp_extesr"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:30.542627" elapsed="0.001230">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_lacp_extesr"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:30.542202" elapsed="0.001991">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_lacp_extesr"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:30.542171" elapsed="0.002141">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_lacp_extesr"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:30.544508" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:30.545018" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:30.544755" elapsed="0.000400"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:30.544732" elapsed="0.000503"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:30.545371" 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-04-17T03:26:30.550095" elapsed="0.000212"/>
</kw>
<msg time="2026-04-17T03:26:30.550373" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:30.549176" elapsed="0.001286"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:30.550762" elapsed="0.000032"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:30.551076" elapsed="0.000032"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:30.548216" 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-04-17T03:26:30.545722" elapsed="0.005839"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:30.531123" elapsed="0.020687">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_lacp_extesr"</status>
</kw>
<msg time="2026-04-17T03:26:30.551982" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:30.552043" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_lacp_extesr"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:30.530387" elapsed="0.021689"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:30.552360" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:30.552195" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:30.552164" elapsed="0.000292"/>
</if>
<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-04-17T03:26:30.554188" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:30.554013" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:30.553976" elapsed="0.000305"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:30.554695" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:30.554879" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:30.554509" elapsed="0.000408"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:30.555564" level="INFO">{1: 41}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:30.555147" elapsed="0.000464"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:30.556238" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:30.555822" elapsed="0.000476"/>
</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-04-17T03:26:30.556959" elapsed="0.000527"/>
</kw>
<msg time="2026-04-17T03:26:30.557831" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:30.557893" level="INFO">${old_connection_index} = 41</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:30.556468" elapsed="0.001454"/>
</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-04-17T03:26:30.560429" elapsed="0.000529"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:30.562415" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:30.562166" elapsed="0.001085">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:30.561378" elapsed="0.002012"/>
</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-04-17T03:26:30.564621" elapsed="0.000146"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:30.563749" elapsed="0.001139"/>
</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-04-17T03:26:30.558450" elapsed="0.006589"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:30.558147" elapsed="0.006962"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:30.558121" elapsed="0.007029"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:30.566821" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:30.566051" elapsed="0.000837"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:30.567243" elapsed="0.000063"/>
</return>
<msg time="2026-04-17T03:26:30.567492" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:30.565485" elapsed="0.002042"/>
</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-04-17T03:26:30.567744" elapsed="0.000863"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:30.568946" level="INFO">index=42
host=10.30.170.120
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-04-17T03:26:30.569057" level="INFO">${karaf_connection_object} = index=42
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:30.568794" elapsed="0.000298"/>
</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-04-17T03:26:30.569319" elapsed="0.009632"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:30.579594" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:30.581017" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:30.579158" elapsed="0.002326">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:30.587154" elapsed="0.000205"/>
</kw>
<msg time="2026-04-17T03:26:30.587457" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:30.586303" elapsed="0.001362"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:30.588787" elapsed="0.000088"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:30.590162" 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-04-17T03:26:30.582616" elapsed="0.007785"/>
</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-04-17T03:26:30.581846" elapsed="0.008696"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:30.553250" elapsed="0.037411">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:30.591332" elapsed="0.000030"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:30.591432" 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="FAIL" start="2026-04-17T03:26:30.529644" elapsed="0.061929">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:30.591697" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:30.591741" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:30.524206" elapsed="0.067558"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:30.592184" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:30.591854" elapsed="0.000391"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:30.591831" elapsed="0.000442"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:30.524053" elapsed="0.068245"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:30.523838" elapsed="0.068498"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:30.520527" elapsed="0.071877"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:30.514089" elapsed="0.078376"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:30.513461" elapsed="0.079054"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:30.508088" elapsed="0.084485"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:30.596212" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:30.797891" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:31.200880" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:31.203612" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:30.593141" elapsed="0.616257">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:31.210026" elapsed="0.000071"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:31.210498" elapsed="0.000055"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:31.211249" elapsed="0.000065"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:30.592764" elapsed="0.618826">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:30.506673" elapsed="0.705094">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:30.505578" elapsed="0.706577">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:31.216593" elapsed="0.000238"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:31.216304" elapsed="0.000586"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:31.218013" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:31.217863" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:31.217839" elapsed="0.000253"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:31.223193" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:31.223036" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:31.223017" elapsed="0.000257"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:31.224376" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:31.223950" elapsed="0.000454"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:31.224896" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:31.224574" elapsed="0.000349"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:31.224987" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:26:31.225158" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:31.223516" elapsed="0.001672"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:31.230916" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:31.230801" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:31.230778" elapsed="0.000226"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:31.232899" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:31.232698" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:31.232680" elapsed="0.000408"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:31.233679" level="INFO">${karaf_connection_index} = 42</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:31.233250" elapsed="0.000492"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:31.234408" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:31.234126" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:31.237059" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:31.236421" elapsed="0.001202">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:31.237774" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:31.237869" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:31.234791" elapsed="0.003164"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:31.240451" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:31.240010" elapsed="0.001106">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:31.241264" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:31.241360" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:31.238360" elapsed="0.003062"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:31.242986" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_lacp_extl2"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:31.242197" elapsed="0.001027">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_lacp_extl2"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:31.241757" elapsed="0.001579">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_lacp_extl2"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:31.241718" elapsed="0.001699">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_lacp_extl2"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:31.243597" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:31.244107" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:31.243840" elapsed="0.000399"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:31.243817" elapsed="0.000481"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:31.244335" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:31.248228" elapsed="0.000154"/>
</kw>
<msg time="2026-04-17T03:26:31.248432" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:31.247593" 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="NOT RUN" start="2026-04-17T03:26:31.248721" elapsed="0.000025"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:31.249039" elapsed="0.000024"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:31.246760" elapsed="0.002516"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:31.244631" elapsed="0.004733"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:31.232095" elapsed="0.017434">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_lacp_extl2"</status>
</kw>
<msg time="2026-04-17T03:26:31.249638" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:31.249684" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_lacp_extl2"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:31.231231" elapsed="0.018519"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:31.249964" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:31.249830" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:31.249811" elapsed="0.000223"/>
</if>
<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-04-17T03:26:31.250954" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:31.250829" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:31.250811" elapsed="0.000213"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:31.251353" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:31.251462" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:31.251219" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:31.251995" level="INFO">{1: 42}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:31.251653" elapsed="0.000389"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:31.252524" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:31.252214" elapsed="0.000355"/>
</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-04-17T03:26:31.253264" elapsed="0.000376"/>
</kw>
<msg time="2026-04-17T03:26:31.253946" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:31.254002" level="INFO">${old_connection_index} = 42</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:31.252734" elapsed="0.001294"/>
</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-04-17T03:26:31.255996" elapsed="0.000398"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:31.258012" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:31.257670" elapsed="0.000839">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:31.256710" elapsed="0.001917"/>
</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-04-17T03:26:31.259662" elapsed="0.000109"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:31.258964" elapsed="0.000903"/>
</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-04-17T03:26:31.254385" elapsed="0.005595"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:31.254116" elapsed="0.005916"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:31.254095" elapsed="0.005963"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:31.261295" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:31.260689" elapsed="0.000654"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:31.261517" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:26:31.261696" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:31.260273" elapsed="0.001449"/>
</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-04-17T03:26:31.261893" elapsed="0.000666"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:31.262864" level="INFO">index=43
host=10.30.170.120
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-04-17T03:26:31.262984" level="INFO">${karaf_connection_object} = index=43
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:31.262746" elapsed="0.000266"/>
</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-04-17T03:26:31.263216" elapsed="0.008626"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:31.272489" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:31.273771" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:31.272047" elapsed="0.002162">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:31.279823" elapsed="0.000175"/>
</kw>
<msg time="2026-04-17T03:26:31.280075" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:31.278810" elapsed="0.001423"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:31.281125" elapsed="0.000067"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:31.282126" elapsed="0.000065"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:31.275303" elapsed="0.007017"/>
</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-04-17T03:26:31.274611" elapsed="0.007816"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:31.250528" elapsed="0.031987">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:31.282985" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:31.283065" 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="FAIL" start="2026-04-17T03:26:31.230442" elapsed="0.052772">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:31.283328" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:31.283372" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:31.225651" elapsed="0.057749"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:31.283767" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:31.283501" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:31.283480" elapsed="0.000365"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:31.225499" elapsed="0.058370"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:31.225307" elapsed="0.058597"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:31.222631" elapsed="0.061349"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:31.217530" elapsed="0.066522"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:31.217066" elapsed="0.067035"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:31.213674" elapsed="0.070482"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:31.287159" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:31.488673" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:31.891432" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:31.895094" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:31.284587" elapsed="0.616199">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:31.901269" elapsed="0.000043"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:31.901536" elapsed="0.000029"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:31.901915" elapsed="0.000057"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:31.284309" elapsed="0.617823">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:31.213091" elapsed="0.689141">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:31.212532" elapsed="0.689918">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:31.908401" elapsed="0.000342"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:31.907996" elapsed="0.000838"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:31.910424" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:31.910235" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:31.910199" elapsed="0.000342"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:31.916425" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:31.916277" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:31.916256" elapsed="0.000246"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:31.917668" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:31.917198" elapsed="0.000499"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:31.918193" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:31.917866" elapsed="0.000353"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:31.918263" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:26:31.918428" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:31.916775" elapsed="0.001678"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:31.925049" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:31.924904" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:31.924881" 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-04-17T03:26:31.926664" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:31.926484" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:31.926466" elapsed="0.000360"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:31.927428" level="INFO">${karaf_connection_index} = 43</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:31.926998" elapsed="0.000513"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:31.928159" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:31.927866" elapsed="0.000355"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:31.931071" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:31.930490" elapsed="0.001244">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:31.931921" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:31.932044" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:31.928615" elapsed="0.003560"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:31.934647" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:31.934219" elapsed="0.001126">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:31.935509" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:31.935608" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:31.932626" elapsed="0.003042"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:31.937188" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_lacp_extl2"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:31.936401" elapsed="0.000991">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_lacp_extl2"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:31.935991" elapsed="0.001512">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_lacp_extl2"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:31.935966" elapsed="0.001620">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_lacp_extl2"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:31.937756" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:31.938177" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:31.937972" elapsed="0.000320"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:31.937952" elapsed="0.000398"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:31.938390" elapsed="0.000018"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:31.942312" elapsed="0.000182"/>
</kw>
<msg time="2026-04-17T03:26:31.942554" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:31.941679" 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-04-17T03:26:31.942886" elapsed="0.000033"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:31.943449" elapsed="0.000045"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:31.940882" 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-04-17T03:26:31.938704" elapsed="0.005113"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:31.926034" elapsed="0.017972">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_lacp_extl2"</status>
</kw>
<msg time="2026-04-17T03:26:31.944124" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:31.944167" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_lacp_extl2"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:31.925305" elapsed="0.018887"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:31.944398" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:31.944278" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:31.944256" elapsed="0.000213"/>
</if>
<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-04-17T03:26:31.945640" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:31.945533" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:31.945516" elapsed="0.000192"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:31.946016" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:31.946122" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:31.945863" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:31.946640" level="INFO">{1: 43}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:31.946302" elapsed="0.000385"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:31.947167" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:31.946843" elapsed="0.000368"/>
</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-04-17T03:26:31.947908" elapsed="0.000612"/>
</kw>
<msg time="2026-04-17T03:26:31.948766" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:31.948813" level="INFO">${old_connection_index} = 43</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:31.947412" elapsed="0.001425"/>
</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-04-17T03:26:31.950626" elapsed="0.000400"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:31.952229" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:31.952037" elapsed="0.000765">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:31.951333" elapsed="0.001587"/>
</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-04-17T03:26:31.954030" elapsed="0.000112"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:31.953387" elapsed="0.000847"/>
</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-04-17T03:26:31.949159" elapsed="0.005168"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:31.948914" elapsed="0.005464"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:31.948896" elapsed="0.005514"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:31.955699" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:31.955090" elapsed="0.000657"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:31.955950" elapsed="0.000047"/>
</return>
<msg time="2026-04-17T03:26:31.956132" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:31.954652" elapsed="0.001518"/>
</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-04-17T03:26:31.956374" elapsed="0.000667"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:31.957351" level="INFO">index=44
host=10.30.170.120
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-04-17T03:26:31.957453" level="INFO">${karaf_connection_object} = index=44
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:31.957223" elapsed="0.000256"/>
</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-04-17T03:26:31.957628" elapsed="0.011623"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:31.970341" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:31.971922" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:31.969582" elapsed="0.003051">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:31.979122" elapsed="0.000177"/>
</kw>
<msg time="2026-04-17T03:26:31.979619" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:31.978152" elapsed="0.001645"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:31.980700" elapsed="0.000069"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:31.981648" elapsed="0.000067"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:31.974142" elapsed="0.007686"/>
</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-04-17T03:26:31.973147" elapsed="0.008808"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:31.945226" elapsed="0.036854">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:31.982612" elapsed="0.000030"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:31.982753" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:26:31.924423" elapsed="0.058447">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:31.983003" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:31.983049" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:31.918850" elapsed="0.064222"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:31.983431" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:31.983157" elapsed="0.000349"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:31.983137" elapsed="0.000400"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:31.918702" elapsed="0.064864"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:31.918512" elapsed="0.065093"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:31.915824" elapsed="0.067850"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:31.909749" elapsed="0.073990"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:31.909085" elapsed="0.074700"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:31.904757" elapsed="0.079082"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:31.989571" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:32.191321" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:32.594387" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:32.596909" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:31.984866" elapsed="0.617026">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:32.602315" elapsed="0.000044"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:32.602593" elapsed="0.000032"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:32.603017" elapsed="0.000039"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:31.984085" elapsed="0.619184">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:31.903977" elapsed="0.699469">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:31.903039" elapsed="0.700710">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:32.791982" elapsed="0.000352"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:32.791510" elapsed="0.000914"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:32.793688" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:32.793548" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:32.793522" elapsed="0.000243"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:32.799139" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:32.799022" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:32.799001" elapsed="0.000209"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:32.800573" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:32.800027" elapsed="0.000585"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:32.801270" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:32.800838" elapsed="0.000468"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:32.801365" elapsed="0.000048"/>
</return>
<msg time="2026-04-17T03:26:32.801584" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:32.799458" elapsed="0.002161"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:32.808100" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:32.807887" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:32.807860" elapsed="0.000336"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:32.809863" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:32.809650" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:32.809632" elapsed="0.000425"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:32.810734" level="INFO">${karaf_connection_index} = 44</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:32.810232" elapsed="0.000566"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:32.811498" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:32.811183" elapsed="0.000399"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:32.814424" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:32.813798" elapsed="0.001432">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:32.815432" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:32.815564" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:32.811993" elapsed="0.003653"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:32.819566" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:32.818857" elapsed="0.001668">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:32.820731" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:32.820847" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:32.816624" elapsed="0.004299"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:32.823251" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_lacp_extmac"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:32.821848" elapsed="0.001687">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_lacp_extmac"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:32.821329" elapsed="0.002393">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_lacp_extmac"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:32.821292" elapsed="0.002542">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_lacp_extmac"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:32.824078" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:32.824608" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:32.824390" elapsed="0.000333"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:32.824280" elapsed="0.000501"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:32.824824" elapsed="0.000019"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:32.828851" elapsed="0.000182"/>
</kw>
<msg time="2026-04-17T03:26:32.829091" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:32.828158" elapsed="0.001009"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:32.829383" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:32.829601" 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-04-17T03:26:32.827316" elapsed="0.002506"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:32.825183" elapsed="0.004727"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:32.809164" elapsed="0.021073">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_lacp_extmac"</status>
</kw>
<msg time="2026-04-17T03:26:32.830360" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:32.830405" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_lacp_extmac"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:32.808412" elapsed="0.022017"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:32.830887" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:32.830519" elapsed="0.000459"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:32.830496" elapsed="0.000507"/>
</if>
<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-04-17T03:26:32.832376" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:32.831924" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:32.831904" elapsed="0.000541"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:32.832776" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:32.832908" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:32.832621" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:32.833487" level="INFO">{1: 44}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:32.833124" elapsed="0.000410"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:32.834006" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:32.833690" elapsed="0.000361"/>
</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-04-17T03:26:32.834631" elapsed="0.000375"/>
</kw>
<msg time="2026-04-17T03:26:32.835256" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:32.835303" level="INFO">${old_connection_index} = 44</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:32.834218" elapsed="0.001108"/>
</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-04-17T03:26:32.837224" elapsed="0.000386"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:32.838751" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:32.838559" elapsed="0.000804">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:32.837919" elapsed="0.001563"/>
</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-04-17T03:26:32.840563" elapsed="0.000108"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:32.839830" elapsed="0.001008"/>
</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-04-17T03:26:32.835648" elapsed="0.005300"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:32.835407" elapsed="0.005596"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:32.835387" elapsed="0.005712"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:32.842557" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:32.841797" elapsed="0.000805"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:32.842774" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:26:32.842969" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:32.841347" elapsed="0.001652"/>
</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-04-17T03:26:32.843178" elapsed="0.000669"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:32.844244" level="INFO">index=45
host=10.30.170.120
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-04-17T03:26:32.844348" level="INFO">${karaf_connection_object} = index=45
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:32.844111" elapsed="0.000264"/>
</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-04-17T03:26:32.844529" elapsed="0.009048"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:32.854414" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:32.855816" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:32.853789" elapsed="0.002577">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:32.862510" elapsed="0.000177"/>
</kw>
<msg time="2026-04-17T03:26:32.862780" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:32.861339" elapsed="0.001631"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:32.863878" elapsed="0.000131"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:32.864908" elapsed="0.000089"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:32.857480" elapsed="0.007636"/>
</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-04-17T03:26:32.856750" elapsed="0.008479"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:32.831550" elapsed="0.033775">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:32.865826" elapsed="0.000036"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:32.865967" 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="FAIL" start="2026-04-17T03:26:32.807439" elapsed="0.058657">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:32.866212" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:32.866255" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:32.802145" elapsed="0.064134"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:32.866634" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:32.866365" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:32.866344" elapsed="0.000370"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:32.801947" elapsed="0.064792"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:32.801693" elapsed="0.065082"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:32.798612" elapsed="0.068222"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:32.793195" elapsed="0.073696"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:32.792644" elapsed="0.074309"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:32.606263" elapsed="0.260824"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:32.870280" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:33.071757" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:33.474345" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:33.476844" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:32.867550" elapsed="0.614519">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:33.482524" elapsed="0.000047"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:33.482857" elapsed="0.000037"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:33.483277" elapsed="0.000042"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:32.867252" elapsed="0.616226">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:32.605340" elapsed="0.878239">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:32.604478" elapsed="0.879331">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:33.489951" elapsed="0.000247"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:33.489649" elapsed="0.000615"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:33.491400" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:33.491261" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:33.491236" elapsed="0.000243"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:33.496966" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:33.496825" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:33.496804" elapsed="0.000236"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:33.498125" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:33.497689" elapsed="0.000466"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:33.498658" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:33.498319" elapsed="0.000371"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:33.498737" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:26:33.499002" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:33.497295" elapsed="0.001733"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:33.504873" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:33.504760" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:33.504741" elapsed="0.000220"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:33.506464" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:33.506278" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:33.506260" elapsed="0.000369"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:33.507229" level="INFO">${karaf_connection_index} = 45</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:33.506787" elapsed="0.000504"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:33.507920" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:33.507645" elapsed="0.000355"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:33.510484" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:33.509995" elapsed="0.001197">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:33.511350" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:33.511445" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:33.508349" elapsed="0.003155"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:33.514167" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:33.513655" elapsed="0.001149">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:33.515047" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:33.515146" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:33.511962" elapsed="0.003244"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:33.516817" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_lacp_extmac"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:33.515990" elapsed="0.001066">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_lacp_extmac"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:33.515548" elapsed="0.001624">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_lacp_extmac"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:33.515515" elapsed="0.001742">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_lacp_extmac"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:33.517445" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:33.517903" elapsed="0.000079"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:33.517652" elapsed="0.000416"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:33.517631" elapsed="0.000505"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:33.518188" 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-04-17T03:26:33.522321" elapsed="0.000153"/>
</kw>
<msg time="2026-04-17T03:26:33.522523" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:33.521809" elapsed="0.000780"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:33.522805" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:33.523269" 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-04-17T03:26:33.521003" elapsed="0.002500"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:33.518596" elapsed="0.005008"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:33.505799" elapsed="0.017976">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_lacp_extmac"</status>
</kw>
<msg time="2026-04-17T03:26:33.523968" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:33.524015" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_lacp_extmac"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:33.505122" elapsed="0.018918"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:33.524233" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:33.524121" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:33.524102" elapsed="0.000243"/>
</if>
<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-04-17T03:26:33.525472" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:33.525364" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:33.525346" elapsed="0.000194"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:33.525827" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:33.525954" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:33.525696" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:33.526470" level="INFO">{1: 45}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:33.526142" elapsed="0.000375"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:33.527107" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:33.526677" elapsed="0.000475"/>
</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-04-17T03:26:33.527698" elapsed="0.000381"/>
</kw>
<msg time="2026-04-17T03:26:33.528387" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:33.528447" level="INFO">${old_connection_index} = 45</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:33.527317" elapsed="0.001154"/>
</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-04-17T03:26:33.530374" elapsed="0.000384"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:33.531901" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:33.531734" elapsed="0.000797">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:33.531109" elapsed="0.001537"/>
</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-04-17T03:26:33.533680" elapsed="0.000104"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:33.533062" elapsed="0.000813"/>
</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-04-17T03:26:33.528778" elapsed="0.005205"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:33.528552" elapsed="0.005482"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:33.528533" elapsed="0.005526"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:33.535328" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:33.534651" elapsed="0.000733"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:33.535573" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:26:33.535739" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:33.534267" elapsed="0.001496"/>
</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-04-17T03:26:33.535923" elapsed="0.000797"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:33.537022" level="INFO">index=46
host=10.30.170.120
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-04-17T03:26:33.537125" level="INFO">${karaf_connection_object} = index=46
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:33.536895" elapsed="0.000256"/>
</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-04-17T03:26:33.537328" elapsed="0.009574"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:33.547601" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:33.548947" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:33.547175" elapsed="0.002303">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:33.554858" elapsed="0.000215"/>
</kw>
<msg time="2026-04-17T03:26:33.555170" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:33.553957" 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-04-17T03:26:33.556411" elapsed="0.000069"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:33.557344" elapsed="0.000066"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:33.550473" elapsed="0.007050"/>
</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-04-17T03:26:33.549833" elapsed="0.007811"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:33.525062" elapsed="0.032674">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:33.558253" elapsed="0.000034"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:33.558352" 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="FAIL" start="2026-04-17T03:26:33.504407" elapsed="0.054076">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:33.558608" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:33.558653" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:33.499422" elapsed="0.059259"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:33.559060" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:33.558776" elapsed="0.000353"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:33.558755" elapsed="0.000400"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:33.499273" elapsed="0.059906"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:33.499089" elapsed="0.060125"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:33.496416" elapsed="0.062860"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:33.490903" elapsed="0.068434"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:33.490424" elapsed="0.068962"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:33.486262" elapsed="0.073182"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:33.563027" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:33.765261" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:34.168131" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:34.171608" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:33.559905" elapsed="0.617999">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:34.178421" elapsed="0.000052"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:34.178754" elapsed="0.000037"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:34.179240" elapsed="0.000044"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:33.559606" elapsed="0.619864">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:33.485101" elapsed="0.694480">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:33.484434" elapsed="0.695422">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:34.187545" elapsed="0.000378"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:34.186906" 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-04-17T03:26:34.189800" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:34.189609" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:34.189574" elapsed="0.000335"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:34.195539" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:34.195416" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:34.195396" elapsed="0.000217"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:34.196826" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:34.196298" elapsed="0.000560"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:34.197361" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:34.197045" elapsed="0.000342"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:34.197433" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:26:34.197611" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:34.195877" elapsed="0.001759"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:34.208260" elapsed="0.000052"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:34.207845" elapsed="0.000584"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:34.207773" elapsed="0.000721"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:34.211570" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:34.211293" elapsed="0.000431"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:34.211261" elapsed="0.000548"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:34.212857" level="INFO">${karaf_connection_index} = 46</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:34.212088" elapsed="0.000894"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:34.213964" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:34.213527" elapsed="0.000531"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:34.217858" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:34.217134" elapsed="0.001680">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:34.219071" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:34.219213" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:34.214663" elapsed="0.004640"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:34.222446" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:34.221985" elapsed="0.001122">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:34.223258" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:34.223354" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:34.219904" elapsed="0.003511"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:34.225109" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_lan"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:34.224283" elapsed="0.001035">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_lan"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:34.223731" elapsed="0.001707">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_lan"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:34.223700" elapsed="0.001824">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_lan"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:34.225705" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:34.226131" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:34.225905" elapsed="0.000339"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:34.225884" elapsed="0.000421"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:34.226350" elapsed="0.000019"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:34.230243" elapsed="0.000156"/>
</kw>
<msg time="2026-04-17T03:26:34.230453" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:34.229719" elapsed="0.000807"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:34.230750" elapsed="0.000031"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:34.231151" 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-04-17T03:26:34.228891" 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-04-17T03:26:34.226709" elapsed="0.004782"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:34.210591" elapsed="0.021078">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_lan"</status>
</kw>
<msg time="2026-04-17T03:26:34.231792" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:34.231839" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_lan"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:34.209172" elapsed="0.022693"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:34.232261" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:34.232120" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:34.232092" elapsed="0.000256"/>
</if>
<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-04-17T03:26:34.233752" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:34.233639" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:34.233619" elapsed="0.000203"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:34.234184" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:34.234321" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:34.234010" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:34.234991" level="INFO">{1: 46}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:34.234594" elapsed="0.000445"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:34.235529" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:34.235201" elapsed="0.000381"/>
</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-04-17T03:26:34.236377" elapsed="0.000408"/>
</kw>
<msg time="2026-04-17T03:26:34.237054" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:34.237102" level="INFO">${old_connection_index} = 46</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:34.235775" elapsed="0.001350"/>
</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-04-17T03:26:34.239012" elapsed="0.000383"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:34.240714" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:34.240458" elapsed="0.000865">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:34.239705" elapsed="0.001735"/>
</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-04-17T03:26:34.242432" elapsed="0.000139"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:34.241752" elapsed="0.000941"/>
</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-04-17T03:26:34.237441" elapsed="0.005379"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:34.237205" elapsed="0.005689"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:34.237185" elapsed="0.005765"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:34.244314" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:34.243671" elapsed="0.000696"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:34.244576" elapsed="0.000057"/>
</return>
<msg time="2026-04-17T03:26:34.244801" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:34.243239" elapsed="0.001590"/>
</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-04-17T03:26:34.245070" elapsed="0.000708"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:34.246108" level="INFO">index=47
host=10.30.170.120
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-04-17T03:26:34.246214" level="INFO">${karaf_connection_object} = index=47
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:34.245981" elapsed="0.000260"/>
</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-04-17T03:26:34.246396" elapsed="0.009374"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:34.256743" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:34.258081" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:34.256186" elapsed="0.002385">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:34.264261" elapsed="0.000166"/>
</kw>
<msg time="2026-04-17T03:26:34.264507" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:34.263235" 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-04-17T03:26:34.265579" elapsed="0.000069"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:34.266499" elapsed="0.000065"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:34.259763" elapsed="0.006958"/>
</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-04-17T03:26:34.258987" elapsed="0.007898"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:34.233257" elapsed="0.033794">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:34.267835" elapsed="0.000038"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:34.267968" elapsed="0.000039"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:26:34.206368" elapsed="0.061783">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:34.268327" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:34.268389" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:34.198096" elapsed="0.070325"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:34.268856" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:34.268525" elapsed="0.000388"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:34.268499" elapsed="0.000562"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:34.197923" elapsed="0.071173"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:34.197702" elapsed="0.071439"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:34.195019" elapsed="0.074195"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:34.189250" elapsed="0.080051"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:34.188329" elapsed="0.081049"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:34.183096" elapsed="0.086373"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:34.273072" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:34.503586" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:34.906625" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:34.909224" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:34.269992" elapsed="0.641811">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:34.912107" elapsed="0.000032"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:34.912307" elapsed="0.000022"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:34.912622" elapsed="0.000029"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:34.269651" elapsed="0.643133">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:34.181458" elapsed="0.731406">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:34.180475" elapsed="0.732679">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:34.919690" elapsed="0.000253"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:34.919417" 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-04-17T03:26:34.921123" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:34.920949" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:34.920909" elapsed="0.000290"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:34.926803" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:34.926680" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:34.926658" elapsed="0.000223"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:34.928079" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:34.927609" elapsed="0.000501"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:34.928644" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:34.928301" elapsed="0.000372"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:34.928725" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:26:34.928907" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:34.927170" elapsed="0.001782"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:34.935213" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:34.935093" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:34.935073" elapsed="0.000211"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:34.936827" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:34.936625" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:34.936593" elapsed="0.000422"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:34.937640" level="INFO">${karaf_connection_index} = 47</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:34.937203" elapsed="0.000501"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:34.938361" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:34.938079" elapsed="0.000345"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:34.940755" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:34.940317" elapsed="0.001053">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:34.941522" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:34.941617" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:34.938742" elapsed="0.002941"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:34.944058" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:34.943624" elapsed="0.000982">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:34.944751" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:34.944851" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:34.942110" elapsed="0.002799"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:34.946464" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_lan"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:34.945698" elapsed="0.000966">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_lan"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:34.945340" elapsed="0.001431">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_lan"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:34.945319" elapsed="0.001590">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_lan"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:34.947103" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:34.947513" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:34.947305" elapsed="0.000321"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:34.947286" elapsed="0.000398"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:34.947721" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:34.951424" elapsed="0.000318"/>
</kw>
<msg time="2026-04-17T03:26:34.951790" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:34.950832" elapsed="0.001022"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:34.952092" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:34.952319" 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-04-17T03:26:34.950088" elapsed="0.002448"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:34.948022" elapsed="0.004600"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:34.936143" elapsed="0.016674">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_lan"</status>
</kw>
<msg time="2026-04-17T03:26:34.953101" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:34.953162" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_lan"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:34.935445" elapsed="0.017747"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:34.953404" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:34.953289" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:34.953267" elapsed="0.000208"/>
</if>
<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-04-17T03:26:34.954716" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:34.954599" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:34.954578" elapsed="0.000208"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:34.955095" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:34.955204" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:34.954963" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:34.955720" level="INFO">{1: 47}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:34.955392" elapsed="0.000376"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:34.956255" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:34.955943" elapsed="0.000359"/>
</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-04-17T03:26:34.956849" elapsed="0.000540"/>
</kw>
<msg time="2026-04-17T03:26:34.957642" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:34.957692" level="INFO">${old_connection_index} = 47</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:34.956469" elapsed="0.001247"/>
</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-04-17T03:26:34.959541" elapsed="0.000396"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:34.961161" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:34.960887" elapsed="0.000731">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:34.960253" elapsed="0.001478"/>
</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-04-17T03:26:34.962722" elapsed="0.000108"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:34.962091" elapsed="0.000910"/>
</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-04-17T03:26:34.958045" elapsed="0.005056"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:34.957797" elapsed="0.005396"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:34.957777" elapsed="0.005444"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:34.964400" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:34.963835" elapsed="0.000608"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:34.964609" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:26:34.964774" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:34.963436" elapsed="0.001364"/>
</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-04-17T03:26:34.964995" elapsed="0.000657"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:34.965963" level="INFO">index=48
host=10.30.170.120
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-04-17T03:26:34.966068" level="INFO">${karaf_connection_object} = index=48
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:34.965834" elapsed="0.000261"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:26:34.966253" elapsed="0.008572"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:34.975494" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:34.976917" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:34.975057" elapsed="0.002531">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:34.983478" elapsed="0.000161"/>
</kw>
<msg time="2026-04-17T03:26:34.983716" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:34.982518" elapsed="0.001353"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:34.984823" elapsed="0.000070"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:34.985851" elapsed="0.000070"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:34.978656" elapsed="0.007427"/>
</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-04-17T03:26:34.977943" elapsed="0.008282"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:34.953970" elapsed="0.032349">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:34.986769" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:34.986847" 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="FAIL" start="2026-04-17T03:26:34.934690" elapsed="0.052288">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:34.987127" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:34.987197" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:34.929433" elapsed="0.057794"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:34.987591" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:34.987321" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:34.987296" elapsed="0.000377"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:34.929259" elapsed="0.058439"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:34.929017" elapsed="0.058715"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:34.926270" elapsed="0.061525"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:34.920617" elapsed="0.067287"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:34.920164" elapsed="0.067815"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:34.916514" elapsed="0.071547"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:34.991429" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:35.193040" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:35.595546" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:35.598204" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:34.988538" elapsed="0.613005">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:35.601926" elapsed="0.000064"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:35.602214" elapsed="0.000029"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:35.602590" elapsed="0.000036"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:34.988247" elapsed="0.614536">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:34.914031" elapsed="0.688852">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:34.913488" elapsed="0.689672">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:35.608799" elapsed="0.000248"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:35.608521" elapsed="0.000589"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:35.610321" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:35.610182" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:35.610157" elapsed="0.000243"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:35.615521" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:35.615411" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:35.615392" elapsed="0.000198"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:35.616633" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:35.616232" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:35.617368" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:35.616949" elapsed="0.000501"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:35.617510" elapsed="0.000047"/>
</return>
<msg time="2026-04-17T03:26:35.617730" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:35.615827" elapsed="0.001937"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:35.624696" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:35.624586" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:35.624567" elapsed="0.000216"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:35.626769" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:35.626525" elapsed="0.000383"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:35.626500" elapsed="0.000510"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:35.627774" level="INFO">${karaf_connection_index} = 48</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:35.627228" elapsed="0.000629"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:35.628534" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:35.628251" elapsed="0.000345"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:35.631849" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:35.631308" elapsed="0.001350">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:35.632810" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:35.632908" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:35.628910" elapsed="0.004075"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:35.636022" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:35.635559" elapsed="0.001130">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:35.636839" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:35.636976" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:35.633483" elapsed="0.003570"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:35.639209" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_mac"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:35.637991" elapsed="0.001483">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_mac"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:35.637493" elapsed="0.002129">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_mac"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:35.637465" elapsed="0.002264">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_mac"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:35.639959" elapsed="0.000032"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:35.640444" elapsed="0.000058"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:35.640198" elapsed="0.000385"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:35.640178" elapsed="0.000467"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:35.640687" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:35.644769" elapsed="0.000238"/>
</kw>
<msg time="2026-04-17T03:26:35.645078" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:35.644263" elapsed="0.000909"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:35.645678" elapsed="0.000035"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:35.646019" 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-04-17T03:26:35.643388" 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-04-17T03:26:35.641024" elapsed="0.005424"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:35.625916" elapsed="0.020874">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_mac"</status>
</kw>
<msg time="2026-04-17T03:26:35.647156" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:35.647224" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_mac"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:35.625021" elapsed="0.022237"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:35.647542" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:35.647377" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:35.647347" elapsed="0.000296"/>
</if>
<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-04-17T03:26:35.648999" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:35.648829" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:35.648804" elapsed="0.000292"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:35.649586" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:35.649738" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:35.649326" elapsed="0.000451"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:35.650743" level="INFO">{1: 48}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:35.650257" elapsed="0.000547"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:35.651454" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:35.651037" elapsed="0.000476"/>
</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-04-17T03:26:35.652321" elapsed="0.000497"/>
</kw>
<msg time="2026-04-17T03:26:35.653162" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:35.653227" level="INFO">${old_connection_index} = 48</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:35.651740" elapsed="0.001521"/>
</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-04-17T03:26:35.656248" elapsed="0.000548"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:35.658895" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:35.658254" elapsed="0.001420">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:35.657260" elapsed="0.002575"/>
</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-04-17T03:26:35.661339" elapsed="0.000178"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:35.660308" elapsed="0.001335"/>
</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-04-17T03:26:35.654071" elapsed="0.007693"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:35.653374" elapsed="0.008459"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:35.653343" elapsed="0.008533"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:35.663729" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:35.663013" elapsed="0.000774"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:35.664028" elapsed="0.000057"/>
</return>
<msg time="2026-04-17T03:26:35.664265" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:35.662231" elapsed="0.002067"/>
</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-04-17T03:26:35.664533" elapsed="0.000965"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:35.665917" level="INFO">index=49
host=10.30.170.120
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-04-17T03:26:35.666234" level="INFO">${karaf_connection_object} = index=49
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:35.665754" elapsed="0.000516"/>
</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-04-17T03:26:35.666572" elapsed="0.011737"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:35.679306" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:35.680681" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:35.678657" elapsed="0.002693">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:35.689612" elapsed="0.000234"/>
</kw>
<msg time="2026-04-17T03:26:35.690004" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:35.688026" elapsed="0.002194"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:35.691396" elapsed="0.000274"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:35.692831" 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-04-17T03:26:35.683264" elapsed="0.009862"/>
</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-04-17T03:26:35.681908" elapsed="0.011377"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:35.648374" elapsed="0.045114">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:35.694351" elapsed="0.000042"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:35.694467" 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="FAIL" start="2026-04-17T03:26:35.624238" elapsed="0.070406">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:35.694823" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:35.694888" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:35.618294" elapsed="0.076628"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:35.695487" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:35.695069" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:35.695037" elapsed="0.000564"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:35.618091" elapsed="0.077547"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:35.617839" elapsed="0.077848"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:35.615036" elapsed="0.080739"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:35.609813" elapsed="0.086048"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:35.609276" elapsed="0.086675"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:35.605595" elapsed="0.090443"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:35.708837" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:35.910796" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:36.313506" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:36.317258" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:35.696717" elapsed="0.625864">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:36.322949" elapsed="0.000043"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:36.323306" elapsed="0.000046"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:36.323725" elapsed="0.000037"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:35.696271" elapsed="0.627647">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:35.604644" elapsed="0.719398">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:35.603761" elapsed="0.720498">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:36.330308" elapsed="0.000236"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:36.329898" elapsed="0.000703"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:36.331713" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:36.331581" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:36.331558" 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-04-17T03:26:36.337215" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:36.337103" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:36.337084" elapsed="0.000200"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:36.338354" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:36.337951" elapsed="0.000431"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:36.338849" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:36.338546" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:36.338918" elapsed="0.000050"/>
</return>
<msg time="2026-04-17T03:26:36.339097" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:36.337529" elapsed="0.001593"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:36.345333" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:36.345218" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:36.345197" elapsed="0.000208"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:36.347012" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:36.346744" elapsed="0.000375"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:36.346726" elapsed="0.000449"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:36.347750" level="INFO">${karaf_connection_index} = 49</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:36.347330" elapsed="0.000482"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:36.348485" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:36.348185" elapsed="0.000393"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:36.351776" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:36.351183" elapsed="0.001412">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:36.352793" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:36.352938" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:36.349099" elapsed="0.003924"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:36.356207" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:36.355592" elapsed="0.001273">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:36.357066" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:36.357179" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:36.353553" elapsed="0.003686"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:36.358864" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_mac"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:36.358003" elapsed="0.001115">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_mac"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:36.357546" elapsed="0.001690">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_mac"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:36.357521" elapsed="0.001798">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_mac"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:36.359496" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:36.359906" elapsed="0.000245"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:36.359698" elapsed="0.000551"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:36.359677" elapsed="0.000638"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:36.360370" 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-04-17T03:26:36.364475" elapsed="0.000159"/>
</kw>
<msg time="2026-04-17T03:26:36.364684" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:36.363709" 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-04-17T03:26:36.364996" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:36.365229" elapsed="0.000024"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:36.362906" elapsed="0.002552"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:36.360730" elapsed="0.004816"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:36.346289" elapsed="0.019426">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_mac"</status>
</kw>
<msg time="2026-04-17T03:26:36.365888" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:36.365951" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_mac"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:36.345565" elapsed="0.020413"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:36.366180" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:36.366064" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:36.366043" elapsed="0.000218"/>
</if>
<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-04-17T03:26:36.367433" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:36.367324" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:36.367306" elapsed="0.000195"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:36.367799" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:36.367907" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:36.367663" elapsed="0.000415"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:36.368655" level="INFO">{1: 49}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:36.368312" elapsed="0.000391"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:36.369190" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:36.368862" elapsed="0.000375"/>
</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-04-17T03:26:36.369824" elapsed="0.000386"/>
</kw>
<msg time="2026-04-17T03:26:36.370469" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:36.370516" level="INFO">${old_connection_index} = 49</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:36.369412" elapsed="0.001127"/>
</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-04-17T03:26:36.372517" elapsed="0.000385"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:36.374093" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:36.373902" elapsed="0.000715">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:36.373231" elapsed="0.001503"/>
</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-04-17T03:26:36.375803" elapsed="0.000216"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:36.375068" elapsed="0.001076"/>
</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-04-17T03:26:36.370846" elapsed="0.005426"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:36.370617" elapsed="0.005725"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:36.370598" elapsed="0.005780"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:36.377738" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:36.377197" elapsed="0.000584"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:36.377987" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:26:36.378153" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:36.376675" elapsed="0.001503"/>
</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-04-17T03:26:36.378340" elapsed="0.000634"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:36.379267" level="INFO">index=50
host=10.30.170.120
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-04-17T03:26:36.379369" level="INFO">${karaf_connection_object} = index=50
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:36.379154" elapsed="0.000241"/>
</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-04-17T03:26:36.379548" elapsed="0.009192"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:36.389353" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:36.390571" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:36.388919" elapsed="0.002096">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:36.397159" elapsed="0.000212"/>
</kw>
<msg time="2026-04-17T03:26:36.397480" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:36.395689" elapsed="0.001992"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:36.398888" elapsed="0.000108"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:36.400109" 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-04-17T03:26:36.392269" elapsed="0.008081"/>
</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-04-17T03:26:36.391341" elapsed="0.009158"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:36.367002" elapsed="0.033622">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:36.401424" elapsed="0.000035"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:36.401529" 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="FAIL" start="2026-04-17T03:26:36.344773" elapsed="0.056908">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:36.401884" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:36.401967" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:36.339506" elapsed="0.062494"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:36.402416" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:36.402102" elapsed="0.000372"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:36.402079" elapsed="0.000422"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:36.339358" elapsed="0.063168"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:36.339178" elapsed="0.063385"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:36.336673" elapsed="0.065975"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:36.331265" elapsed="0.071453"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:36.330760" elapsed="0.072008"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:36.326568" elapsed="0.076281"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:36.406243" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:36.608162" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:37.011489" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:37.015031" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:36.403342" elapsed="0.616697">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:37.020508" elapsed="0.000049"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:37.020791" elapsed="0.000047"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:37.021294" elapsed="0.000041"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:36.403047" elapsed="0.618475">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:36.325626" elapsed="0.696058">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:36.324878" elapsed="0.697318">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:37.028567" elapsed="0.000283"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:37.028287" elapsed="0.000658"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:37.030156" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:37.029969" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:37.029923" elapsed="0.000324"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:37.038784" elapsed="0.000054"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:37.038469" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:37.038403" elapsed="0.000631"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:37.041914" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:37.040793" elapsed="0.001219"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:37.043514" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:37.042541" elapsed="0.001038"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:37.043707" elapsed="0.000146"/>
</return>
<msg time="2026-04-17T03:26:37.044276" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:37.039750" elapsed="0.004585"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:37.055012" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:37.054846" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:37.054816" elapsed="0.000289"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:37.056858" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:37.056671" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:37.056653" elapsed="0.000398"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:37.057672" level="INFO">${karaf_connection_index} = 50</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:37.057215" elapsed="0.000521"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:37.058479" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:37.058116" elapsed="0.000453"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:37.062106" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:37.061369" elapsed="0.001669">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:37.063283" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:37.063423" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:37.059063" elapsed="0.004448"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:37.066909" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:37.066477" elapsed="0.001087">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:37.067708" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:37.067803" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:37.064128" elapsed="0.003733"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:37.069367" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_rou"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:37.068579" elapsed="0.000991">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_rou"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:37.068201" elapsed="0.001486">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_rou"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:37.068174" elapsed="0.001676">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_rou"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:37.070186" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:37.070603" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:37.070395" elapsed="0.000321"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:37.070371" elapsed="0.000402"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:37.070814" elapsed="0.000018"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:37.074580" elapsed="0.000157"/>
</kw>
<msg time="2026-04-17T03:26:37.074789" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:37.073890" elapsed="0.000971"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:37.075112" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:37.075335" 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-04-17T03:26:37.073113" 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-04-17T03:26:37.071172" 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="FAIL" start="2026-04-17T03:26:37.056207" elapsed="0.019609">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_rou"</status>
</kw>
<msg time="2026-04-17T03:26:37.076061" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:37.076117" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_eth_rou"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:37.055324" elapsed="0.020818"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:37.076345" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:37.076231" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:37.076209" elapsed="0.000208"/>
</if>
<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-04-17T03:26:37.077620" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:37.077506" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:37.077485" elapsed="0.000204"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:37.078099" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:37.078245" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:37.077855" elapsed="0.000419"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:37.078764" level="INFO">{1: 50}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:37.078436" elapsed="0.000375"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:37.079289" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:37.078987" elapsed="0.000347"/>
</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-04-17T03:26:37.079884" elapsed="0.000384"/>
</kw>
<msg time="2026-04-17T03:26:37.080512" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:37.080559" level="INFO">${old_connection_index} = 50</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:37.079500" elapsed="0.001082"/>
</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-04-17T03:26:37.082618" elapsed="0.000415"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:37.084186" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:37.084007" elapsed="0.000696">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:37.083348" elapsed="0.001470"/>
</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-04-17T03:26:37.085776" elapsed="0.000109"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:37.085152" elapsed="0.000882"/>
</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-04-17T03:26:37.080889" elapsed="0.005241"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:37.080660" elapsed="0.005613"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:37.080641" elapsed="0.005662"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:37.087500" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:37.086960" elapsed="0.000581"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:37.087705" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:26:37.087868" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:37.086542" elapsed="0.001351"/>
</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-04-17T03:26:37.088070" elapsed="0.000623"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:37.088999" level="INFO">index=51
host=10.30.170.120
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-04-17T03:26:37.089102" level="INFO">${karaf_connection_object} = index=51
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:37.088870" elapsed="0.000259"/>
</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-04-17T03:26:37.089283" elapsed="0.008633"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:37.098692" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:37.099945" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:37.098245" elapsed="0.002134">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:37.106470" elapsed="0.000171"/>
</kw>
<msg time="2026-04-17T03:26:37.106726" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:37.105319" elapsed="0.001568"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:37.107764" elapsed="0.000068"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:37.108738" elapsed="0.000072"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:37.101457" elapsed="0.007514"/>
</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-04-17T03:26:37.100746" elapsed="0.008342"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:37.076920" elapsed="0.032267">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:37.109706" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:37.109791" elapsed="0.000029"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:26:37.054330" elapsed="0.055612">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:37.110077" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:37.110124" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:37.045355" elapsed="0.064793"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:37.110570" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:37.110283" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:37.110257" elapsed="0.000397"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:37.044992" elapsed="0.065690"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:37.044475" elapsed="0.066252"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:37.036980" elapsed="0.073819"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:37.029609" elapsed="0.081356"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:37.029113" elapsed="0.081907"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:37.025069" elapsed="0.086010"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:37.114448" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:37.315871" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:37.718915" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:37.721896" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:37.111541" elapsed="0.616080">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:37.728206" elapsed="0.000065"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:37.728656" elapsed="0.000050"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:37.729309" elapsed="0.000060"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:37.111246" elapsed="0.618379">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:37.023529" elapsed="0.706265">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:37.022738" elapsed="0.707430">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:37.735283" elapsed="0.000236"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:37.735006" elapsed="0.000575"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:37.736814" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:37.736531" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:37.736506" elapsed="0.000384"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:37.742036" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:37.741899" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:37.741881" elapsed="0.000225"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:37.743221" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:37.742793" elapsed="0.000456"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:37.743799" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:37.743488" elapsed="0.000337"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:37.743871" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:26:37.744054" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:37.742347" elapsed="0.001732"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:37.749814" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:37.749679" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:37.749656" elapsed="0.000240"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:37.751570" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:37.751377" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:37.751357" elapsed="0.000375"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:37.752357" level="INFO">${karaf_connection_index} = 51</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:37.751897" elapsed="0.000525"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:37.753185" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:37.752791" elapsed="0.000475"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:37.756020" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:37.755429" elapsed="0.001609">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:37.757202" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:37.757302" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:37.753631" elapsed="0.003731"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:37.760246" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:37.759545" elapsed="0.001406">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:37.761124" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:37.761222" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:37.757789" elapsed="0.003493"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:37.763160" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_rou"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:37.762061" elapsed="0.001309">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_rou"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:37.761641" elapsed="0.001845">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_rou"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:37.761610" elapsed="0.001960">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_rou"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:37.763753" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:37.764434" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:37.764210" elapsed="0.000343"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:37.764179" elapsed="0.000434"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:37.764656" elapsed="0.000020"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:37.769336" elapsed="0.000190"/>
</kw>
<msg time="2026-04-17T03:26:37.769587" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:37.768614" elapsed="0.001056"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:37.769893" elapsed="0.000025"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:37.770135" elapsed="0.000024"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:37.767313" elapsed="0.003090"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:37.765031" elapsed="0.005512"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:37.750873" elapsed="0.019975">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_rou"</status>
</kw>
<msg time="2026-04-17T03:26:37.770994" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:37.771041" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_eth_rou"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:37.750106" elapsed="0.020959"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:37.771332" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:37.771176" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:37.771143" elapsed="0.000267"/>
</if>
<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-04-17T03:26:37.773150" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:37.772814" elapsed="0.000390"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:37.772796" elapsed="0.000430"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:37.773560" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:37.773674" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:37.773403" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:37.774264" level="INFO">{1: 51}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:37.773865" elapsed="0.000448"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:37.774836" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:37.774474" elapsed="0.000407"/>
</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-04-17T03:26:37.775510" elapsed="0.000376"/>
</kw>
<msg time="2026-04-17T03:26:37.776158" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:37.776207" level="INFO">${old_connection_index} = 51</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:37.775067" elapsed="0.001164"/>
</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-04-17T03:26:37.778377" elapsed="0.000605"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:37.780368" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:37.780151" elapsed="0.001121">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:37.779316" elapsed="0.002111"/>
</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-04-17T03:26:37.782463" elapsed="0.000197"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:37.781772" elapsed="0.000991"/>
</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-04-17T03:26:37.776609" elapsed="0.006251"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:37.776315" elapsed="0.006639"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:37.776293" elapsed="0.006714"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:37.784405" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:37.783765" elapsed="0.000686"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:37.784626" elapsed="0.000049"/>
</return>
<msg time="2026-04-17T03:26:37.784813" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:37.783311" elapsed="0.001527"/>
</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-04-17T03:26:37.785144" elapsed="0.000707"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:37.786218" level="INFO">index=52
host=10.30.170.120
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-04-17T03:26:37.786328" level="INFO">${karaf_connection_object} = index=52
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:37.786080" elapsed="0.000277"/>
</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-04-17T03:26:37.786670" elapsed="0.010744"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:37.798180" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:37.799360" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:37.797690" elapsed="0.002181">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:37.805829" elapsed="0.000220"/>
</kw>
<msg time="2026-04-17T03:26:37.806165" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:37.804751" elapsed="0.001618"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:37.807286" elapsed="0.000071"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:37.808361" elapsed="0.000086"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:37.801337" elapsed="0.007263"/>
</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-04-17T03:26:37.800292" elapsed="0.008427"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:37.772322" elapsed="0.036499">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:37.809356" elapsed="0.000031"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:37.809439" elapsed="0.000023"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:26:37.749260" elapsed="0.060303">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:37.809685" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:37.809730" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:37.744468" elapsed="0.065287"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:37.810232" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:37.809847" elapsed="0.000450"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:37.809823" elapsed="0.000500"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:37.744319" elapsed="0.066029"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:37.744136" elapsed="0.066249"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:37.741526" elapsed="0.068924"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:37.736214" elapsed="0.074301"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:37.735739" elapsed="0.074853"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:37.732291" elapsed="0.078362"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:37.814059" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:38.015735" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:38.418810" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:38.422416" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:37.811254" elapsed="0.616602">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:38.428492" elapsed="0.000071"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:38.429059" elapsed="0.000088"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:38.429919" elapsed="0.000141"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:37.810817" elapsed="0.619588">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:37.731721" elapsed="0.698909">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:37.730992" elapsed="0.700529">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:38.436241" elapsed="0.000248"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:38.435946" 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-04-17T03:26:38.437688" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:38.437548" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:38.437521" elapsed="0.000248"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:38.443761" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:38.443441" elapsed="0.000375"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:38.443419" elapsed="0.000422"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:38.445106" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:38.444634" elapsed="0.000503"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:38.445774" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:38.445317" elapsed="0.000485"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:38.445853" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:26:38.446052" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:38.444168" elapsed="0.001910"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:38.452743" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:38.452610" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:38.452586" elapsed="0.000238"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:38.454487" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:38.454300" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:38.454282" elapsed="0.000384"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:38.455335" level="INFO">${karaf_connection_index} = 52</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:38.454827" elapsed="0.000573"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:38.456063" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:38.455765" elapsed="0.000361"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:38.458557" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:38.458092" elapsed="0.001186">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:38.459430" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:38.459524" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:38.456526" elapsed="0.003059"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:38.461983" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:38.461535" elapsed="0.001032">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:38.462715" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:38.462812" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:38.460002" elapsed="0.002868"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:38.465057" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_inc_arb"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:38.463878" elapsed="0.001476">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_inc_arb"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:38.463341" elapsed="0.002180">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_inc_arb"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:38.463315" elapsed="0.002324">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_inc_arb"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:38.465894" elapsed="0.000055"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:38.466512" elapsed="0.000066"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:38.466209" elapsed="0.000469"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:38.466181" elapsed="0.000582"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:38.466821" 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-04-17T03:26:38.472218" elapsed="0.000157"/>
</kw>
<msg time="2026-04-17T03:26:38.472426" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:38.471593" elapsed="0.000902"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:38.472713" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:38.472946" 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-04-17T03:26:38.470302" elapsed="0.002866"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:38.467585" elapsed="0.005671"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:38.453813" elapsed="0.019612">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_inc_arb"</status>
</kw>
<msg time="2026-04-17T03:26:38.473540" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:38.473584" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_inc_arb"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:38.453064" elapsed="0.020545"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:38.473805" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:38.473692" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:38.473670" elapsed="0.000203"/>
</if>
<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-04-17T03:26:38.475189" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:38.475079" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:38.475059" elapsed="0.000198"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:38.475550" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:38.475658" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:38.475418" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:38.476240" level="INFO">{1: 52}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:38.475898" elapsed="0.000388"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:38.476782" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:38.476463" elapsed="0.000364"/>
</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-04-17T03:26:38.477389" elapsed="0.000359"/>
</kw>
<msg time="2026-04-17T03:26:38.478008" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:38.478056" level="INFO">${old_connection_index} = 52</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:38.477007" elapsed="0.001072"/>
</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-04-17T03:26:38.480091" elapsed="0.000380"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:38.481653" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:38.481478" elapsed="0.000712">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:38.480778" elapsed="0.001526"/>
</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-04-17T03:26:38.483321" elapsed="0.000108"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:38.482650" elapsed="0.000871"/>
</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-04-17T03:26:38.478381" elapsed="0.005235"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:38.478156" elapsed="0.005511"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:38.478138" elapsed="0.005558"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:38.484890" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:38.484345" elapsed="0.000659"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:38.485173" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:26:38.485345" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:38.483922" elapsed="0.001449"/>
</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-04-17T03:26:38.485536" elapsed="0.000666"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:38.486499" level="INFO">index=53
host=10.30.170.120
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-04-17T03:26:38.486601" level="INFO">${karaf_connection_object} = index=53
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:38.486380" elapsed="0.000247"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:26:38.486781" elapsed="0.009312"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:38.496735" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:38.498091" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:38.496294" elapsed="0.002244">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:38.504030" elapsed="0.000168"/>
</kw>
<msg time="2026-04-17T03:26:38.504280" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:38.503046" elapsed="0.001387"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:38.505412" elapsed="0.000067"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:38.506338" elapsed="0.000066"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:38.499587" elapsed="0.006930"/>
</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-04-17T03:26:38.498882" elapsed="0.007758"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:38.474635" elapsed="0.032101">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:38.507357" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:38.507438" elapsed="0.000023"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:26:38.452186" elapsed="0.055373">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:38.507677" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:38.507721" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:38.446557" elapsed="0.061187"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:38.508121" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:38.507833" elapsed="0.000345"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:38.507810" elapsed="0.000394"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:38.446344" elapsed="0.061884"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:38.446141" elapsed="0.062123"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:38.443020" elapsed="0.065308"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:38.437218" elapsed="0.071172"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:38.436715" elapsed="0.071724"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:38.433252" elapsed="0.075245"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:38.511828" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:38.713555" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:39.116538" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:39.119768" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:38.508966" elapsed="0.616184">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:39.125516" elapsed="0.000043"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:39.125789" elapsed="0.000032"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:39.126202" elapsed="0.000038"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:38.508652" elapsed="0.617746">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:38.432492" elapsed="0.694010">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:38.431997" elapsed="0.694819">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:39.133508" elapsed="0.000317"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:39.133107" elapsed="0.000817"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:39.135675" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:39.135483" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:39.135439" elapsed="0.000342"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:39.141754" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:39.141629" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:39.141604" elapsed="0.000222"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:39.142946" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:39.142483" elapsed="0.000493"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:39.143554" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:39.143165" elapsed="0.000416"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:39.143629" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:26:39.143795" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:39.142086" elapsed="0.001733"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:39.149847" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:39.149732" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:39.149713" elapsed="0.000239"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:39.151744" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:39.151507" elapsed="0.000355"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:39.151483" elapsed="0.000456"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:39.152551" level="INFO">${karaf_connection_index} = 53</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:39.152102" elapsed="0.000511"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:39.153320" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:39.152999" elapsed="0.000401"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:39.156211" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:39.155527" elapsed="0.001311">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:39.157014" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:39.157132" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:39.153799" elapsed="0.003419"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:39.160139" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:39.159615" elapsed="0.001170">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:39.160958" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:39.161061" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:39.157736" elapsed="0.003385"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:39.162623" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_inc_arb"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:39.161847" elapsed="0.001020">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_inc_arb"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:39.161475" elapsed="0.001544">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_inc_arb"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:39.161451" elapsed="0.001718">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_inc_arb"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:39.163370" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:39.163789" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:39.163575" elapsed="0.000345"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:39.163555" elapsed="0.000614"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:39.164222" elapsed="0.000023"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:39.168571" elapsed="0.000202"/>
</kw>
<msg time="2026-04-17T03:26:39.168838" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:39.167665" elapsed="0.001286"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:39.169181" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:39.169403" 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-04-17T03:26:39.166667" 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-04-17T03:26:39.164580" elapsed="0.005148"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:39.150916" elapsed="0.019004">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_inc_arb"</status>
</kw>
<msg time="2026-04-17T03:26:39.170065" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:39.170114" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_inc_arb"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:39.150156" elapsed="0.019985"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:39.170360" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:39.170234" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:39.170211" elapsed="0.000222"/>
</if>
<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-04-17T03:26:39.171610" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:39.171495" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:39.171476" elapsed="0.000206"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:39.172028" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:39.172143" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:39.171864" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:39.172752" level="INFO">{1: 53}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:39.172347" elapsed="0.000467"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:39.173417" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:39.173039" elapsed="0.000435"/>
</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-04-17T03:26:39.174225" elapsed="0.000475"/>
</kw>
<msg time="2026-04-17T03:26:39.175094" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:39.175162" level="INFO">${old_connection_index} = 53</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:39.173690" elapsed="0.001502"/>
</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-04-17T03:26:39.177912" elapsed="0.000534"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:39.182917" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:39.182716" elapsed="0.000926">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:39.178879" elapsed="0.004894"/>
</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-04-17T03:26:39.184891" elapsed="0.000162"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:39.184108" elapsed="0.001070"/>
</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-04-17T03:26:39.175707" elapsed="0.009593"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:39.175379" elapsed="0.010072"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:39.175349" elapsed="0.010147"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:39.186843" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:39.186254" elapsed="0.000634"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:39.187207" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:26:39.187426" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:39.185784" elapsed="0.001669"/>
</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-04-17T03:26:39.187636" elapsed="0.000722"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:39.188755" level="INFO">index=54
host=10.30.170.120
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-04-17T03:26:39.188895" level="INFO">${karaf_connection_object} = index=54
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:39.188595" elapsed="0.000357"/>
</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-04-17T03:26:39.189172" elapsed="0.008979"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:39.198792" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:39.200429" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:39.198355" elapsed="0.002529">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:39.206529" elapsed="0.000188"/>
</kw>
<msg time="2026-04-17T03:26:39.206820" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:39.205589" elapsed="0.001567"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:39.208088" elapsed="0.000071"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:39.209109" elapsed="0.000071"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:39.201906" elapsed="0.007389"/>
</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-04-17T03:26:39.201246" elapsed="0.008163"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:39.171135" elapsed="0.038376">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:39.210038" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:39.210121" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:26:39.149369" elapsed="0.060872">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:39.210359" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:39.210411" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:39.144233" elapsed="0.066202"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:39.210811" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:39.210530" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:39.210505" elapsed="0.000389"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:39.144081" elapsed="0.066840"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:39.143877" elapsed="0.067098"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:39.141135" elapsed="0.069910"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:39.134879" elapsed="0.076292"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:39.134183" elapsed="0.077039"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:39.128893" elapsed="0.082470"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:39.214875" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:39.416447" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:39.820467" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:39.822440" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:39.211839" elapsed="0.613069">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:39.825240" elapsed="0.000034"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:39.825438" elapsed="0.000048"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:39.826086" elapsed="0.000070"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:39.211542" elapsed="0.614900">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:39.128063" elapsed="0.698546">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:39.127335" elapsed="0.699631">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:39.833826" elapsed="0.000381"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:39.833393" elapsed="0.000909"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:39.836071" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:39.835845" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:39.835801" elapsed="0.000383"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:39.843217" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:39.843060" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:39.843037" elapsed="0.000295"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:39.844619" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:39.844141" elapsed="0.000508"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:39.845254" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:39.844902" elapsed="0.000380"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:39.845330" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:26:39.845504" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:39.843693" elapsed="0.001837"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:39.868864" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:39.868713" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:39.868674" elapsed="0.000302"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:39.870856" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:39.870614" elapsed="0.000383"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:39.870587" elapsed="0.000473"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:39.871700" level="INFO">${karaf_connection_index} = 54</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:39.871226" elapsed="0.000544"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:39.872420" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:39.872145" elapsed="0.000336"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:39.874805" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:39.874345" elapsed="0.001141">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:39.875674" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:39.875771" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:39.872792" elapsed="0.003039"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:39.878453" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:39.878006" elapsed="0.001185">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:39.879344" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:39.879440" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:39.876268" elapsed="0.003235"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:39.881252" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_inc_as"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:39.880282" elapsed="0.001174">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_inc_as"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:39.879883" elapsed="0.001831">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_inc_as"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:39.879855" elapsed="0.001945">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_inc_as"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:39.881994" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:39.882400" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:39.882197" elapsed="0.000317"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:39.882176" elapsed="0.000395"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:39.882610" elapsed="0.000018"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:39.886593" elapsed="0.000155"/>
</kw>
<msg time="2026-04-17T03:26:39.886818" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:39.885989" 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="NOT RUN" start="2026-04-17T03:26:39.887287" elapsed="0.000027"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:39.887515" 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-04-17T03:26:39.885203" elapsed="0.002587"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:39.883138" elapsed="0.004742"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:39.870104" elapsed="0.018038">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_inc_as"</status>
</kw>
<msg time="2026-04-17T03:26:39.888262" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:39.888307" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_inc_as"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:39.869250" elapsed="0.019081"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:39.888529" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:39.888413" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:39.888392" elapsed="0.000206"/>
</if>
<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-04-17T03:26:39.889785" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:39.889671" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:39.889650" elapsed="0.000205"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:39.890179" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:39.890299" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:39.890035" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:39.890824" level="INFO">{1: 54}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:39.890491" elapsed="0.000380"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:39.891567" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:39.891242" elapsed="0.000372"/>
</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-04-17T03:26:39.892258" elapsed="0.000372"/>
</kw>
<msg time="2026-04-17T03:26:39.892878" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:39.892941" level="INFO">${old_connection_index} = 54</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:39.891822" elapsed="0.001146"/>
</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-04-17T03:26:39.910082" elapsed="0.000428"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:39.911785" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:39.911550" elapsed="0.000777">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:39.910861" elapsed="0.001581"/>
</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-04-17T03:26:39.913605" elapsed="0.000132"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:39.912752" elapsed="0.001082"/>
</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-04-17T03:26:39.893297" elapsed="0.020751"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:39.893047" elapsed="0.021060"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:39.893027" elapsed="0.021113"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:39.915480" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:39.914858" elapsed="0.000664"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:39.915718" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:26:39.915894" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:39.914383" elapsed="0.001536"/>
</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-04-17T03:26:39.916104" elapsed="0.000660"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:39.917093" level="INFO">index=55
host=10.30.170.120
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-04-17T03:26:39.917196" level="INFO">${karaf_connection_object} = index=55
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:39.916964" elapsed="0.000260"/>
</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-04-17T03:26:39.917494" elapsed="0.009573"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:39.927876" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:39.929452" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:39.927317" elapsed="0.002602">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:39.944047" elapsed="0.000183"/>
</kw>
<msg time="2026-04-17T03:26:39.944325" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:39.942877" elapsed="0.001617"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:39.945431" elapsed="0.000069"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:39.946394" elapsed="0.000068"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:39.931034" elapsed="0.015551"/>
</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-04-17T03:26:39.930322" elapsed="0.016421"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:39.889101" elapsed="0.057793">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:39.947451" elapsed="0.000038"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:39.947550" 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="FAIL" start="2026-04-17T03:26:39.851496" elapsed="0.096220">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:39.947849" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:39.947909" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:39.845948" elapsed="0.102013"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:39.948393" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:39.948080" elapsed="0.000384"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:39.948051" elapsed="0.000440"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:39.845780" elapsed="0.102737"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:39.845588" elapsed="0.102965"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:39.842602" elapsed="0.106014"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:39.835273" elapsed="0.113406"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:39.834552" elapsed="0.114175"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:39.829555" elapsed="0.119228"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:39.953294" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:40.155236" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:40.564797" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:40.567489" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:39.949285" elapsed="0.621853">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:40.571517" elapsed="0.000044"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:40.571799" elapsed="0.000032"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:40.572300" elapsed="0.000043"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:39.948966" elapsed="0.623554">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:39.828709" elapsed="0.743928">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:39.827442" elapsed="0.745425">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:40.579543" elapsed="0.000267"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:40.579173" elapsed="0.000712"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:40.581256" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:40.581079" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:40.581051" elapsed="0.000287"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:40.586816" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:40.586683" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:40.586664" elapsed="0.000225"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:40.588196" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:40.587655" elapsed="0.000581"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:40.588811" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:40.588457" elapsed="0.000381"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:40.588885" elapsed="0.000056"/>
</return>
<msg time="2026-04-17T03:26:40.589113" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:40.587225" elapsed="0.001918"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:40.595088" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:40.594971" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:40.594951" elapsed="0.000207"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:40.597107" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:40.596693" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:40.596674" elapsed="0.000613"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:40.597963" level="INFO">${karaf_connection_index} = 55</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:40.597459" elapsed="0.000583"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:40.598909" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:40.598422" elapsed="0.000578"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:40.601691" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:40.601152" elapsed="0.001535">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:40.602870" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:40.603002" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:40.599421" elapsed="0.003644"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:40.606038" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:40.605433" elapsed="0.001372">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:40.606999" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:40.607103" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:40.603491" elapsed="0.003671"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:40.608867" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_inc_as"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:40.607903" elapsed="0.001471">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_inc_as"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:40.607505" elapsed="0.001998">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_inc_as"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:40.607475" elapsed="0.002113">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_inc_as"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:40.609771" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:40.610402" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:40.610155" elapsed="0.000369"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:40.610133" elapsed="0.000452"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:40.610627" elapsed="0.000020"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:40.614901" elapsed="0.000283"/>
</kw>
<msg time="2026-04-17T03:26:40.615254" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:40.614376" 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-04-17T03:26:40.615587" elapsed="0.000025"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:40.615812" 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-04-17T03:26:40.613314" 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-04-17T03:26:40.610991" elapsed="0.005220"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:40.596137" elapsed="0.020270">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_inc_as"</status>
</kw>
<msg time="2026-04-17T03:26:40.616556" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:40.616615" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_inc_as"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:40.595320" elapsed="0.021336"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:40.616891" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:40.616755" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:40.616730" elapsed="0.000259"/>
</if>
<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-04-17T03:26:40.618074" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:40.617958" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:40.617923" elapsed="0.000223"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:40.618476" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:40.618589" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:40.618335" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:40.619245" level="INFO">{1: 55}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:40.618855" elapsed="0.000440"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:40.619777" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:40.619458" elapsed="0.000367"/>
</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-04-17T03:26:40.620707" elapsed="0.000395"/>
</kw>
<msg time="2026-04-17T03:26:40.621361" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:40.621412" level="INFO">${old_connection_index} = 55</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:40.620267" elapsed="0.001170"/>
</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-04-17T03:26:40.623314" elapsed="0.000421"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:40.625908" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:40.625491" elapsed="0.000966">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:40.624821" elapsed="0.001763"/>
</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-04-17T03:26:40.627581" elapsed="0.000112"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:40.626903" elapsed="0.001001"/>
</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-04-17T03:26:40.621753" elapsed="0.006342"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:40.621518" elapsed="0.006640"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:40.621498" elapsed="0.006691"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:40.629571" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:40.628916" elapsed="0.000699"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:40.629804" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:26:40.630015" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:40.628471" elapsed="0.001571"/>
</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-04-17T03:26:40.630227" elapsed="0.000682"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:40.631250" level="INFO">index=56
host=10.30.170.120
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-04-17T03:26:40.631359" level="INFO">${karaf_connection_object} = index=56
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:40.631119" elapsed="0.000268"/>
</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-04-17T03:26:40.631543" elapsed="0.009470"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:40.641708" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:40.643128" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:40.641230" elapsed="0.002361">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:40.649638" elapsed="0.000169"/>
</kw>
<msg time="2026-04-17T03:26:40.649891" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:40.648765" 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-04-17T03:26:40.651143" elapsed="0.000088"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:40.652192" elapsed="0.000068"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:40.645056" elapsed="0.007326"/>
</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-04-17T03:26:40.644338" elapsed="0.008160"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:40.617579" elapsed="0.035022">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:40.653273" elapsed="0.000035"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:40.653364" elapsed="0.000023"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:26:40.594597" elapsed="0.058898">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:40.653624" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:40.653672" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:40.589566" elapsed="0.064130"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:40.654089" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:40.653788" elapsed="0.000361"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:40.653766" elapsed="0.000411"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:40.589404" elapsed="0.064800"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:40.589204" elapsed="0.065037"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:40.586252" elapsed="0.068054"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:40.580708" elapsed="0.073664"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:40.580114" elapsed="0.074310"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:40.575590" elapsed="0.078897"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:40.657849" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:40.859502" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:41.262642" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:41.264859" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:40.654981" elapsed="0.613656">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:41.269101" elapsed="0.000066"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:41.269445" elapsed="0.000035"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:41.269967" elapsed="0.000053"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:40.654651" elapsed="0.615562">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:40.574272" elapsed="0.696057">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:40.573461" elapsed="0.697187">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:41.276749" elapsed="0.000510"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:41.276268" elapsed="0.001116"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:41.278980" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:41.278774" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:41.278741" 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-04-17T03:26:41.285897" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:41.285770" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:41.285748" elapsed="0.000240"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:41.287185" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:41.286678" elapsed="0.000552"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:41.287737" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:41.287419" elapsed="0.000365"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:41.287851" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:26:41.288053" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:41.286247" elapsed="0.001831"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:41.294983" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:41.294822" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:41.294789" elapsed="0.000274"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:41.296810" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:41.296610" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:41.296590" elapsed="0.000416"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:41.297621" level="INFO">${karaf_connection_index} = 56</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:41.297172" elapsed="0.000513"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:41.298331" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:41.298056" elapsed="0.000338"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:41.300780" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:41.300291" elapsed="0.001091">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:41.301542" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:41.301652" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:41.298711" elapsed="0.003000"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:41.304219" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:41.303735" elapsed="0.001169">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:41.305159" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:41.305258" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:41.302129" elapsed="0.003191"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:41.306913" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_inc_lacp"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:41.306106" elapsed="0.001037">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_inc_lacp"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:41.305676" elapsed="0.001583">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_inc_lacp"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:41.305648" elapsed="0.001766">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_inc_lacp"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:41.307619" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:41.308071" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:41.307843" elapsed="0.000343"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:41.307822" elapsed="0.000426"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:41.308289" elapsed="0.000019"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:41.312830" elapsed="0.000195"/>
</kw>
<msg time="2026-04-17T03:26:41.313086" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:41.311781" 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-04-17T03:26:41.313414" elapsed="0.000026"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:41.313696" 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-04-17T03:26:41.310876" elapsed="0.003224"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:41.308640" elapsed="0.005561"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:41.296024" elapsed="0.018360">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_inc_lacp"</status>
</kw>
<msg time="2026-04-17T03:26:41.314512" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:41.314560" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_inc_lacp"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:41.295246" elapsed="0.019341"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:41.314821" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:41.314686" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:41.314660" elapsed="0.000239"/>
</if>
<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-04-17T03:26:41.316234" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:41.316114" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:41.316093" elapsed="0.000217"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:41.316679" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:41.316798" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:41.316524" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:41.317618" level="INFO">{1: 56}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:41.317236" elapsed="0.000432"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:41.318182" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:41.317845" elapsed="0.000386"/>
</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-04-17T03:26:41.318870" elapsed="0.000415"/>
</kw>
<msg time="2026-04-17T03:26:41.319550" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:41.319601" level="INFO">${old_connection_index} = 56</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:41.318416" elapsed="0.001210"/>
</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-04-17T03:26:41.321607" elapsed="0.000423"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:41.323480" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:41.323277" elapsed="0.000951">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:41.322366" elapsed="0.001979"/>
</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-04-17T03:26:41.325570" elapsed="0.000110"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:41.324725" elapsed="0.001049"/>
</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-04-17T03:26:41.319991" elapsed="0.005876"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:41.319713" elapsed="0.006301"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:41.319692" elapsed="0.006354"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:41.327292" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:41.326709" elapsed="0.000624"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:41.327498" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:26:41.327672" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:41.326285" elapsed="0.001412"/>
</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-04-17T03:26:41.327859" elapsed="0.000691"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:41.328853" level="INFO">index=57
host=10.30.170.120
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-04-17T03:26:41.329021" level="INFO">${karaf_connection_object} = index=57
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:41.328729" elapsed="0.000320"/>
</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-04-17T03:26:41.329205" elapsed="0.008878"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:41.338753" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:41.339938" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:41.338305" elapsed="0.002122">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:41.346128" elapsed="0.000184"/>
</kw>
<msg time="2026-04-17T03:26:41.346399" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:41.344846" elapsed="0.001722"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:41.347504" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:41.348551" elapsed="0.000084"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:41.341471" elapsed="0.007322"/>
</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-04-17T03:26:41.340779" elapsed="0.008130"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:41.315743" elapsed="0.033329">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:41.349612" elapsed="0.000036"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:41.349703" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:26:41.294388" elapsed="0.055438">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:41.349987" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:41.350046" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:41.288505" elapsed="0.061567"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:41.350445" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:41.350163" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:41.350141" elapsed="0.000385"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:41.288319" elapsed="0.062232"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:41.288136" elapsed="0.062450"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:41.285282" elapsed="0.065365"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:41.278345" elapsed="0.072430"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:41.277664" elapsed="0.073160"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:41.273040" elapsed="0.077841"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:41.354296" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:41.555601" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:41.958054" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:41.960819" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:41.351441" elapsed="0.614537">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:41.966495" elapsed="0.000059"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:41.966902" elapsed="0.000073"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:41.967508" elapsed="0.000055"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:41.351136" elapsed="0.616760">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:41.272106" elapsed="0.696007">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:41.271293" elapsed="0.697185">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:41.975722" elapsed="0.000261"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:41.975443" 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-04-17T03:26:41.977198" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:41.977060" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:41.977035" elapsed="0.000241"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:41.982489" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:41.982380" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:41.982361" elapsed="0.000197"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:41.983592" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:41.983193" elapsed="0.000427"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:41.984175" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:41.983852" elapsed="0.000349"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:41.984246" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:26:41.984409" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:41.982792" elapsed="0.001641"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:41.990283" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:41.990172" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:41.990153" 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-04-17T03:26:41.991805" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:41.991619" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:41.991601" elapsed="0.000396"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:41.992572" level="INFO">${karaf_connection_index} = 57</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:41.992155" elapsed="0.000481"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:41.993349" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:41.993043" elapsed="0.000366"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:41.995730" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:41.995283" elapsed="0.001031">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:41.996460" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:41.996562" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:41.993725" elapsed="0.002895"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:41.999256" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:41.998801" elapsed="0.001020">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:41.999986" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:42.000083" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:41.997127" elapsed="0.003016"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:42.001721" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_inc_lacp"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:42.000847" elapsed="0.001090">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_inc_lacp"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:42.000448" elapsed="0.001603">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_inc_lacp"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:42.000425" elapsed="0.001708">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_inc_lacp"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:42.002310" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:42.002719" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:42.002511" elapsed="0.000325"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:42.002491" elapsed="0.000403"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:42.002947" elapsed="0.000018"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:42.007086" elapsed="0.000153"/>
</kw>
<msg time="2026-04-17T03:26:42.007289" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:42.006484" elapsed="0.000871"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:42.007577" elapsed="0.000025"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:42.007803" 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-04-17T03:26:42.005630" 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-04-17T03:26:42.003264" elapsed="0.004867"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:41.991175" elapsed="0.017172">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_inc_lacp"</status>
</kw>
<msg time="2026-04-17T03:26:42.008468" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:42.008530" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_inc_lacp"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:41.990512" elapsed="0.018056"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:42.008816" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:42.008666" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:42.008647" elapsed="0.000239"/>
</if>
<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-04-17T03:26:42.010342" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:42.010218" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:42.010188" elapsed="0.000224"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:42.010705" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:42.010813" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:42.010574" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:42.011356" level="INFO">{1: 57}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:42.011018" elapsed="0.000385"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:42.011873" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:42.011565" elapsed="0.000353"/>
</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-04-17T03:26:42.012487" elapsed="0.000431"/>
</kw>
<msg time="2026-04-17T03:26:42.013204" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:42.013256" level="INFO">${old_connection_index} = 57</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:42.012102" elapsed="0.001178"/>
</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-04-17T03:26:42.015156" elapsed="0.000380"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:42.016667" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:42.016500" elapsed="0.000693">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:42.015846" elapsed="0.001461"/>
</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-04-17T03:26:42.018260" elapsed="0.000105"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:42.017619" elapsed="0.000838"/>
</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-04-17T03:26:42.013589" elapsed="0.004965"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:42.013361" elapsed="0.005244"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:42.013342" elapsed="0.005289"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:42.019854" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:42.019301" elapsed="0.000595"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:42.020096" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:26:42.020264" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:42.018840" elapsed="0.001450"/>
</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-04-17T03:26:42.020453" elapsed="0.000690"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:42.021435" level="INFO">index=58
host=10.30.170.120
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-04-17T03:26:42.021544" level="INFO">${karaf_connection_object} = index=58
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:42.021321" elapsed="0.000252"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:26:42.021780" elapsed="0.008753"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:42.031173" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:42.032337" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:42.030716" elapsed="0.002020">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:42.038621" elapsed="0.000168"/>
</kw>
<msg time="2026-04-17T03:26:42.038873" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:42.037621" elapsed="0.001427"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:42.039912" elapsed="0.000106"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:42.040918" elapsed="0.000086"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:42.033759" elapsed="0.007362"/>
</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-04-17T03:26:42.033129" elapsed="0.008109"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:42.009612" elapsed="0.031720">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:42.041806" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:42.041886" 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="FAIL" start="2026-04-17T03:26:41.989809" elapsed="0.052214">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:42.042138" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:42.042185" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:41.984843" elapsed="0.057366"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:42.042562" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:42.042294" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:42.042274" elapsed="0.000369"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:41.984666" elapsed="0.058002"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:41.984489" elapsed="0.058213"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:41.982011" elapsed="0.060749"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:41.976683" elapsed="0.066137"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:41.976210" elapsed="0.066658"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:41.973138" elapsed="0.069801"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:42.045846" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:42.248904" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:42.651287" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:42.653745" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:42.043381" elapsed="0.617096">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:42.661306" elapsed="0.000091"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:42.661705" elapsed="0.000028"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:42.662105" elapsed="0.000037"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:42.043097" elapsed="0.619202">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:41.970030" elapsed="0.692369">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:41.969306" elapsed="0.693313">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:42.667049" elapsed="0.000232"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:42.666739" elapsed="0.000601"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:42.668421" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:42.668288" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:42.668263" 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-04-17T03:26:42.673679" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:42.673543" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:42.673522" elapsed="0.000230"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:42.674806" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:42.674400" elapsed="0.000434"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:42.675316" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:42.675014" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:42.675386" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:26:42.675550" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:42.674009" elapsed="0.001573"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:42.681616" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:42.681484" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:42.681462" elapsed="0.000238"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:42.683291" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:42.683109" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:42.683091" elapsed="0.000360"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:42.684163" level="INFO">${karaf_connection_index} = 58</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:42.683612" elapsed="0.000616"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:42.685040" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:42.684699" elapsed="0.000479"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:42.687749" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:42.687172" elapsed="0.001659">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:42.689053" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:42.689208" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:42.685559" elapsed="0.003716"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:42.691766" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:42.691334" elapsed="0.001155">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:42.692637" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:42.692765" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:42.689756" elapsed="0.003092"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:42.695082" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_inc_lan"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:42.694034" elapsed="0.001322">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_inc_lan"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:42.693320" elapsed="0.002186">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_inc_lan"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:42.693287" elapsed="0.002338">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_inc_lan"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:42.695875" elapsed="0.000031"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:42.696663" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:42.696369" elapsed="0.000453"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:42.696338" elapsed="0.000568"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:42.696978" elapsed="0.000021"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:42.701796" elapsed="0.000229"/>
</kw>
<msg time="2026-04-17T03:26:42.702090" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:42.701052" elapsed="0.001129"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:42.702478" elapsed="0.000034"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:42.702795" elapsed="0.000032"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:42.699791" elapsed="0.003445"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:42.697323" elapsed="0.006037"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:42.682634" elapsed="0.020947">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_inc_lan"</status>
</kw>
<msg time="2026-04-17T03:26:42.703731" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:42.703789" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_inc_lan"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:42.681894" elapsed="0.021930"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:42.704105" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:42.703956" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:42.703904" elapsed="0.000294"/>
</if>
<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-04-17T03:26:42.705439" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:42.705298" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:42.705270" elapsed="0.000261"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:42.705908" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:42.706134" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:42.705746" elapsed="0.000422"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:42.706730" level="INFO">{1: 58}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:42.706362" elapsed="0.000416"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:42.707330" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:42.706984" elapsed="0.000393"/>
</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-04-17T03:26:42.707978" elapsed="0.000418"/>
</kw>
<msg time="2026-04-17T03:26:42.708685" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:42.708734" level="INFO">${old_connection_index} = 58</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:42.707543" elapsed="0.001214"/>
</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-04-17T03:26:42.710821" elapsed="0.000489"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:42.712565" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:42.712339" elapsed="0.001013">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:42.711634" elapsed="0.001835"/>
</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-04-17T03:26:42.714541" elapsed="0.000146"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:42.713787" elapsed="0.001010"/>
</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-04-17T03:26:42.709208" elapsed="0.005771"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:42.708836" elapsed="0.006215"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:42.708818" elapsed="0.006267"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:42.716565" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:42.715891" elapsed="0.000735"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:42.716826" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:26:42.717018" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:42.715374" elapsed="0.001671"/>
</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-04-17T03:26:42.717254" elapsed="0.000641"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:42.718215" level="INFO">index=59
host=10.30.170.120
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-04-17T03:26:42.718317" level="INFO">${karaf_connection_object} = index=59
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:42.718093" elapsed="0.000250"/>
</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-04-17T03:26:42.718496" elapsed="0.009462"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:42.728647" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:42.730110" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:42.728163" elapsed="0.002439">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:42.736677" elapsed="0.000198"/>
</kw>
<msg time="2026-04-17T03:26:42.737002" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:42.735669" elapsed="0.001537"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:42.738183" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:42.739190" elapsed="0.000071"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:42.731961" elapsed="0.007418"/>
</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-04-17T03:26:42.731277" elapsed="0.008297"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:42.704834" elapsed="0.034840">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:42.740334" elapsed="0.000037"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:42.740438" elapsed="0.000029"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:26:42.681035" elapsed="0.059571">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:42.740742" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:42.740788" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:42.675989" elapsed="0.064824"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:42.741288" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:42.740902" elapsed="0.000452"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:42.740880" elapsed="0.000504"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:42.675823" elapsed="0.065588"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:42.675642" elapsed="0.065805"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:42.673169" elapsed="0.068356"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:42.667971" elapsed="0.073652"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:42.667498" elapsed="0.074180"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:42.663991" elapsed="0.077783"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:42.745526" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:42.947145" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:43.349917" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:43.353522" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:42.742279" elapsed="0.616490">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:43.359145" elapsed="0.000047"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:43.359412" elapsed="0.000029"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:43.359792" elapsed="0.000037"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:42.741960" elapsed="0.618043">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:42.663390" elapsed="0.696790">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:42.662879" elapsed="0.697525">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:43.365881" elapsed="0.000330"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:43.365490" 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-04-17T03:26:43.367757" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:43.367584" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:43.367553" elapsed="0.000305"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:43.373764" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:43.373641" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:43.373622" elapsed="0.000221"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:43.374966" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:43.374542" elapsed="0.000453"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:43.375460" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:43.375161" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:43.375530" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:26:43.375689" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:43.374121" elapsed="0.001592"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:43.381677" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:43.381567" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:43.381548" 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-04-17T03:26:43.383204" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:43.383023" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:43.383005" elapsed="0.000358"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:43.383951" level="INFO">${karaf_connection_index} = 59</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:43.383517" elapsed="0.000499"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:43.384629" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:43.384363" elapsed="0.000326"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:43.387449" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:43.386895" elapsed="0.001224">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:43.388289" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:43.388394" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:43.385013" elapsed="0.003444"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:43.391242" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:43.390725" elapsed="0.001185">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:43.392126" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:43.392226" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:43.388909" elapsed="0.003380"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:43.394008" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_inc_lan"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:43.393107" elapsed="0.001171">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_inc_lan"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:43.392653" elapsed="0.001735">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_inc_lan"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:43.392627" elapsed="0.001843">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_inc_lan"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:43.394645" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:43.395076" elapsed="0.000071"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:43.394842" elapsed="0.000390"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:43.394823" elapsed="0.000488"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:43.395360" elapsed="0.000019"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:43.399319" elapsed="0.000189"/>
</kw>
<msg time="2026-04-17T03:26:43.399568" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:43.398814" elapsed="0.000831"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:43.399923" elapsed="0.000044"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:43.400170" 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-04-17T03:26:43.397729" elapsed="0.002663"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:43.395676" elapsed="0.004804"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:43.382559" elapsed="0.018090">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_inc_lan"</status>
</kw>
<msg time="2026-04-17T03:26:43.400759" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:43.400804" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_inc_lan"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:43.381902" elapsed="0.018926"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:43.401038" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:43.400908" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:43.400889" elapsed="0.000218"/>
</if>
<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-04-17T03:26:43.402609" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:43.402501" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:43.402483" elapsed="0.000200"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:43.403026" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:43.403136" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:43.402866" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:43.403647" level="INFO">{1: 59}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:43.403321" elapsed="0.000371"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:43.404167" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:43.403850" elapsed="0.000362"/>
</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-04-17T03:26:43.404964" elapsed="0.000362"/>
</kw>
<msg time="2026-04-17T03:26:43.405609" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:43.405657" level="INFO">${old_connection_index} = 59</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:43.404377" elapsed="0.001304"/>
</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-04-17T03:26:43.407696" elapsed="0.000393"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:43.409205" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:43.409035" elapsed="0.000743">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:43.408394" elapsed="0.001630"/>
</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-04-17T03:26:43.410969" elapsed="0.000108"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:43.410336" elapsed="0.000832"/>
</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-04-17T03:26:43.406150" elapsed="0.005109"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:43.405758" elapsed="0.005552"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:43.405739" elapsed="0.005598"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:43.412647" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:43.412093" elapsed="0.000595"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:43.412850" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:26:43.413032" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:43.411547" elapsed="0.001510"/>
</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-04-17T03:26:43.413217" elapsed="0.000736"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:43.414247" level="INFO">index=60
host=10.30.170.120
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-04-17T03:26:43.414356" level="INFO">${karaf_connection_object} = index=60
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:43.414132" elapsed="0.000261"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:26:43.414559" elapsed="0.008697"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:43.423899" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:43.425190" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:43.423430" elapsed="0.002255">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:43.431755" elapsed="0.000412"/>
</kw>
<msg time="2026-04-17T03:26:43.432259" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:43.430914" 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-04-17T03:26:43.433300" elapsed="0.000069"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:43.434313" elapsed="0.000095"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:43.426821" elapsed="0.007720"/>
</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-04-17T03:26:43.426037" elapsed="0.008622"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:43.401903" elapsed="0.032859">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:43.435299" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:43.435382" elapsed="0.000023"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:26:43.381177" elapsed="0.054331">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:43.435635" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:43.435681" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:43.376112" elapsed="0.059593"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:43.436145" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:43.435796" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:43.435772" elapsed="0.000566"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:43.375963" elapsed="0.060405"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:43.375770" elapsed="0.060636"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:43.373240" elapsed="0.063229"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:43.367152" elapsed="0.069378"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:43.366506" elapsed="0.070075"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:43.362252" elapsed="0.074385"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:43.453051" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:43.655719" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:44.058519" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:44.061269" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:43.437182" elapsed="0.629486">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:44.066979" elapsed="0.000032"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:44.067176" elapsed="0.000021"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:44.067461" elapsed="0.000027"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:43.436801" elapsed="0.630805">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:43.361499" elapsed="0.706184">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:43.360763" elapsed="0.707093">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:44.072463" elapsed="0.000230"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:44.072186" elapsed="0.000584"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:44.073979" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:44.073755" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:44.073730" elapsed="0.000329"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:44.079209" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:44.079036" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:44.079018" elapsed="0.000264"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:44.080329" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:44.079908" elapsed="0.000449"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:44.080829" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:44.080522" elapsed="0.000333"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:44.080900" elapsed="0.000049"/>
</return>
<msg time="2026-04-17T03:26:44.081082" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:44.079521" elapsed="0.001586"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:44.088306" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:44.088145" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:44.088118" elapsed="0.000287"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:44.090500" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:44.090245" elapsed="0.000391"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:44.090221" elapsed="0.000472"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:44.091286" level="INFO">${karaf_connection_index} = 60</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:44.090847" elapsed="0.000502"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:44.091985" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:44.091698" elapsed="0.000350"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:44.096611" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:44.096136" elapsed="0.001075">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:44.097368" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:44.097464" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:44.092354" elapsed="0.005169"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:44.100050" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:44.099576" elapsed="0.001032">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:44.100750" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:44.100842" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:44.097997" elapsed="0.002902"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:44.102581" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_inc_mac"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:44.101602" elapsed="0.001181">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_inc_mac"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:44.101233" elapsed="0.001658">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_inc_mac"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:44.101206" elapsed="0.001926">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_inc_mac"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:44.103308" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:44.103707" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:44.103505" elapsed="0.000313"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:44.103486" elapsed="0.000389"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:44.103915" 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-04-17T03:26:44.108191" elapsed="0.000153"/>
</kw>
<msg time="2026-04-17T03:26:44.108394" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:44.107406" elapsed="0.001055"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:44.108741" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:44.109145" 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-04-17T03:26:44.106503" 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-04-17T03:26:44.104244" elapsed="0.005205"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:44.089541" elapsed="0.020071">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_inc_mac"</status>
</kw>
<msg time="2026-04-17T03:26:44.109719" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:44.109763" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_inc_mac"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:44.088629" elapsed="0.021157"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:44.110046" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:44.109907" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:44.109883" elapsed="0.000234"/>
</if>
<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-04-17T03:26:44.111148" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:44.111028" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:44.110902" elapsed="0.000314"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:44.111507" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:44.111622" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:44.111376" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:44.112161" level="INFO">{1: 60}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:44.111806" elapsed="0.000403"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:44.112675" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:44.112368" elapsed="0.000354"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:44.113296" elapsed="0.000395"/>
</kw>
<msg time="2026-04-17T03:26:44.114041" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:44.114092" level="INFO">${old_connection_index} = 60</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:44.112888" elapsed="0.001229"/>
</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-04-17T03:26:44.116077" elapsed="0.000381"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:44.117786" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:44.117412" elapsed="0.000919">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:44.116765" elapsed="0.001682"/>
</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-04-17T03:26:44.119448" elapsed="0.000108"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:44.118760" elapsed="0.000889"/>
</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-04-17T03:26:44.114434" elapsed="0.005311"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:44.114200" elapsed="0.005598"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:44.114179" elapsed="0.005644"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:44.120994" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:44.120445" elapsed="0.000593"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:44.121202" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:26:44.121365" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:44.120055" elapsed="0.001336"/>
</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-04-17T03:26:44.121557" elapsed="0.000683"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:44.122580" level="INFO">index=61
host=10.30.170.120
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-04-17T03:26:44.122684" level="INFO">${karaf_connection_object} = index=61
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:44.122466" elapsed="0.000245"/>
</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-04-17T03:26:44.122867" elapsed="0.008502"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:44.131976" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:44.133221" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:44.131549" elapsed="0.002081">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:44.138917" elapsed="0.000466"/>
</kw>
<msg time="2026-04-17T03:26:44.139465" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:44.138109" 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-04-17T03:26:44.140501" elapsed="0.000070"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:44.141429" elapsed="0.000068"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:44.134594" elapsed="0.007016"/>
</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-04-17T03:26:44.133983" elapsed="0.007739"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:44.110611" elapsed="0.031206">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:44.142371" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:44.142452" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:26:44.087628" elapsed="0.054939">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:44.142680" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:44.142725" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:44.081491" elapsed="0.061258"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:44.143117" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:44.142834" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:44.142814" elapsed="0.000384"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:44.081344" elapsed="0.061878"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:44.081163" elapsed="0.062092"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:44.078647" elapsed="0.064666"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:44.073435" elapsed="0.069934"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:44.072969" elapsed="0.070447"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:44.069387" elapsed="0.074083"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:44.146205" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:44.347534" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:44.749843" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:44.752543" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:44.143907" elapsed="0.611755">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:44.756043" elapsed="0.000041"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:44.756311" elapsed="0.000030"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:44.756692" elapsed="0.000038"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:44.143624" elapsed="0.613257">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:44.068742" elapsed="0.688257">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:44.068179" elapsed="0.689031">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:44.764598" elapsed="0.000509"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:44.764014" elapsed="0.001219"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:44.767232" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:44.767050" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:44.767017" elapsed="0.000318"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:44.774370" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:44.774142" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:44.774112" elapsed="0.000366"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:44.776065" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:44.775451" elapsed="0.000655"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:44.776783" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:44.776340" elapsed="0.000479"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:44.776880" elapsed="0.000071"/>
</return>
<msg time="2026-04-17T03:26:44.777140" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:44.774882" elapsed="0.002294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:44.784193" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:44.784064" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:44.784042" 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-04-17T03:26:44.786002" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:44.785755" elapsed="0.000483"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:44.785736" elapsed="0.000573"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:44.787080" level="INFO">${karaf_connection_index} = 61</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:44.786522" elapsed="0.000623"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:44.787944" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:44.787555" elapsed="0.000470"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:44.791267" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:44.790578" elapsed="0.001478">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:44.792263" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:44.792390" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:44.788452" elapsed="0.004017"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:44.795801" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:44.795227" elapsed="0.001364">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:44.796787" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:44.796912" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:44.793036" elapsed="0.003973"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:44.799347" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_inc_mac"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:44.797985" elapsed="0.001635">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_inc_mac"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:44.797433" elapsed="0.002340">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_inc_mac"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:44.797393" elapsed="0.002477">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_inc_mac"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:44.800080" elapsed="0.000031"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:44.800608" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:44.800350" elapsed="0.000384"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:44.800319" elapsed="0.000475"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:44.800838" elapsed="0.000020"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:44.805966" elapsed="0.000216"/>
</kw>
<msg time="2026-04-17T03:26:44.806289" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:44.805172" elapsed="0.001229"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:44.806714" elapsed="0.000035"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:44.807184" 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-04-17T03:26:44.803908" elapsed="0.003526"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:44.801191" elapsed="0.006363"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:44.785230" elapsed="0.022551">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_inc_mac"</status>
</kw>
<msg time="2026-04-17T03:26:44.807962" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:44.808025" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_inc_mac"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:44.784512" elapsed="0.023548"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:44.808341" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:44.808181" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:44.808151" elapsed="0.000284"/>
</if>
<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-04-17T03:26:44.810664" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:44.810497" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:44.810458" elapsed="0.000593"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:44.811476" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:44.811631" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:44.811281" elapsed="0.000391"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:44.812391" level="INFO">{1: 61}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:44.811898" elapsed="0.000554"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:44.813100" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:44.812667" elapsed="0.000497"/>
</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-04-17T03:26:44.814026" elapsed="0.000546"/>
</kw>
<msg time="2026-04-17T03:26:44.814905" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:44.814998" level="INFO">${old_connection_index} = 61</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:44.813401" elapsed="0.001632"/>
</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-04-17T03:26:44.817414" elapsed="0.000549"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:44.819425" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:44.819220" elapsed="0.000801">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:44.818431" elapsed="0.001708"/>
</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-04-17T03:26:44.821107" elapsed="0.000114"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:44.820452" elapsed="0.000878"/>
</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-04-17T03:26:44.815477" elapsed="0.005984"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:44.815150" elapsed="0.006383"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:44.815120" elapsed="0.006454"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:44.823270" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:44.822520" elapsed="0.000805"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:44.823540" elapsed="0.000055"/>
</return>
<msg time="2026-04-17T03:26:44.823770" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:44.821841" elapsed="0.001962"/>
</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-04-17T03:26:44.824047" elapsed="0.000915"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:44.825382" level="INFO">index=62
host=10.30.170.120
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-04-17T03:26:44.825521" level="INFO">${karaf_connection_object} = index=62
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:44.825209" elapsed="0.000343"/>
</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-04-17T03:26:44.825770" elapsed="0.011647"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:44.838454" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:44.839565" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:44.837655" elapsed="0.002475">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:44.848003" elapsed="0.000231"/>
</kw>
<msg time="2026-04-17T03:26:44.848332" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:44.846696" elapsed="0.001801"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:44.849394" elapsed="0.000069"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:44.850463" elapsed="0.000067"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:44.841542" elapsed="0.009112"/>
</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-04-17T03:26:44.840600" elapsed="0.010169"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:44.809535" elapsed="0.041343">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:44.851412" elapsed="0.000030"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:44.851496" elapsed="0.000024"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:26:44.783637" elapsed="0.067984">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:44.851745" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:44.851790" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:44.777685" elapsed="0.074128"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:44.852243" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:44.851902" elapsed="0.000396"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:44.851880" elapsed="0.000444"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:44.777500" elapsed="0.074849"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:44.777257" elapsed="0.075128"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:44.773547" elapsed="0.078900"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:44.766595" elapsed="0.085914"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:44.765561" elapsed="0.086997"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:44.759161" elapsed="0.093454"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:44.855778" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:45.057312" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:45.460157" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:45.462322" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:44.853096" elapsed="0.612870">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:45.466394" elapsed="0.000045"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:45.466753" elapsed="0.000034"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:45.467279" elapsed="0.000048"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:44.852772" elapsed="0.614827">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:44.758130" elapsed="0.709577">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:44.757517" elapsed="0.710481">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:45.475476" elapsed="0.000370"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:45.475025" elapsed="0.000894"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:45.477075" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:45.476916" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:45.476890" elapsed="0.000265"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:45.482642" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:45.482490" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:45.482471" elapsed="0.000245"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:45.483823" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:45.483372" elapsed="0.000479"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:45.484340" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:45.484033" elapsed="0.000333"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:45.484411" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:26:45.484577" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:45.482981" elapsed="0.001621"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:45.490142" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:45.490032" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:45.490013" 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-04-17T03:26:45.491912" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:45.491732" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:45.491715" elapsed="0.000406"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:45.492710" level="INFO">${karaf_connection_index} = 62</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:45.492281" elapsed="0.000493"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:45.493422" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:45.493149" elapsed="0.000334"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:45.496080" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:45.495385" elapsed="0.001283">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:45.496821" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:45.496921" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:45.493800" elapsed="0.003222"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:45.499444" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:45.499017" elapsed="0.001063">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:45.500226" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:45.500389" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:45.497422" elapsed="0.003028"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:45.502122" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_inc_rou"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:45.501229" elapsed="0.001099">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_inc_rou"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:45.500755" elapsed="0.001684">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_inc_rou"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:45.500731" elapsed="0.001819">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_inc_rou"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:45.502751" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:45.503235" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:45.503012" elapsed="0.000341"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:45.502983" elapsed="0.000431"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:45.503466" 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-04-17T03:26:45.507499" elapsed="0.000168"/>
</kw>
<msg time="2026-04-17T03:26:45.507719" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:45.506807" elapsed="0.000980"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:45.508185" elapsed="0.000026"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:45.508412" 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-04-17T03:26:45.505940" elapsed="0.002697"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:45.503791" elapsed="0.004934"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:45.491289" elapsed="0.017625">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_inc_rou"</status>
</kw>
<msg time="2026-04-17T03:26:45.509076" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:45.509127" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_inc_rou"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:45.490369" elapsed="0.018783"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:45.509348" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:45.509236" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:45.509215" elapsed="0.000201"/>
</if>
<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-04-17T03:26:45.510349" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:45.510240" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:45.510221" elapsed="0.000198"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:45.510749" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:45.510860" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:45.510617" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:45.511387" level="INFO">{1: 62}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:45.511063" elapsed="0.000371"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:45.511904" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:45.511593" elapsed="0.000373"/>
</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-04-17T03:26:45.512518" elapsed="0.000368"/>
</kw>
<msg time="2026-04-17T03:26:45.513174" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:45.513225" level="INFO">${old_connection_index} = 62</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:45.512133" elapsed="0.001117"/>
</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-04-17T03:26:45.515257" elapsed="0.000454"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:45.517571" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:45.517110" elapsed="0.001159">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:45.516176" elapsed="0.002254"/>
</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-04-17T03:26:45.519805" elapsed="0.000172"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:45.518895" elapsed="0.001215"/>
</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-04-17T03:26:45.513556" elapsed="0.006689"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:45.513327" elapsed="0.006992"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:45.513309" elapsed="0.007046"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:45.522135" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:45.521255" elapsed="0.000940"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:45.522473" elapsed="0.000063"/>
</return>
<msg time="2026-04-17T03:26:45.522816" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:45.520654" elapsed="0.002200"/>
</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-04-17T03:26:45.523162" elapsed="0.000786"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:45.524238" level="INFO">index=63
host=10.30.170.120
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-04-17T03:26:45.524341" level="INFO">${karaf_connection_object} = index=63
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:45.524127" elapsed="0.000241"/>
</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-04-17T03:26:45.524522" elapsed="0.008989"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:45.534495" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:45.535751" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:45.533752" elapsed="0.002579">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:45.543822" elapsed="0.000180"/>
</kw>
<msg time="2026-04-17T03:26:45.544080" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:45.542552" elapsed="0.001680"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:45.545167" elapsed="0.000069"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:45.546109" elapsed="0.000067"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:45.537639" elapsed="0.008653"/>
</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-04-17T03:26:45.536755" elapsed="0.009648"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:45.509890" elapsed="0.036602">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:45.547005" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:45.547087" 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="FAIL" start="2026-04-17T03:26:45.489664" elapsed="0.057537">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:45.547315" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:45.547359" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:45.484999" elapsed="0.062385"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:45.547836" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:45.547525" elapsed="0.000366"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:45.547504" elapsed="0.000413"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:45.484836" elapsed="0.063123"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:45.484657" elapsed="0.063338"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:45.482105" elapsed="0.065951"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:45.476579" elapsed="0.071540"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:45.476099" elapsed="0.072070"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:45.470345" elapsed="0.077883"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:45.551248" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:45.752742" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:46.155542" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:46.158692" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:45.548669" elapsed="0.614509">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:46.163573" elapsed="0.000043"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:46.163855" elapsed="0.000030"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:46.164281" elapsed="0.000040"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:45.548384" elapsed="0.616103">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:45.469376" elapsed="0.695216">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:45.468559" elapsed="0.696259">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:46.171011" elapsed="0.000318"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:46.170583" elapsed="0.000830"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:46.173018" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:46.172815" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:46.172782" 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-04-17T03:26:46.179096" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:46.178952" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:46.178890" elapsed="0.000286"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:46.180357" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:46.179867" elapsed="0.000519"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:46.180869" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:46.180556" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:46.180963" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:26:46.181138" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:46.179456" elapsed="0.001706"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:46.187339" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:46.187219" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:46.187196" elapsed="0.000217"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:46.189005" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:46.188771" elapsed="0.000376"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:46.188752" elapsed="0.000458"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:46.189811" level="INFO">${karaf_connection_index} = 63</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:46.189376" elapsed="0.000501"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:46.190554" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:46.190272" elapsed="0.000345"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:46.193203" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:46.192601" elapsed="0.001400">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:46.194198" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:46.194325" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:46.190991" elapsed="0.003413"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:46.197682" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:46.197107" elapsed="0.001477">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:46.198776" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:46.198907" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:46.194981" elapsed="0.004045"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:46.201060" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_inc_rou"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:46.199986" elapsed="0.001356">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_inc_rou"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:46.199425" elapsed="0.002071">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_inc_rou"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:46.199392" elapsed="0.002216">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_inc_rou"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:46.201852" elapsed="0.000033"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:46.202658" elapsed="0.000066"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:46.202363" elapsed="0.000456"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:46.202332" elapsed="0.000569"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:46.203051" 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-04-17T03:26:46.208541" elapsed="0.000214"/>
</kw>
<msg time="2026-04-17T03:26:46.208824" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:46.207524" elapsed="0.001395"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:46.209234" elapsed="0.000033"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:46.209544" elapsed="0.000033"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:46.206420" elapsed="0.003427"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:46.203573" elapsed="0.006473"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:46.188310" elapsed="0.021966">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_inc_rou"</status>
</kw>
<msg time="2026-04-17T03:26:46.210431" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:46.210492" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_inc_rou"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:46.187584" elapsed="0.022943"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:46.210803" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:46.210645" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:46.210613" elapsed="0.000288"/>
</if>
<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-04-17T03:26:46.212485" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:46.212374" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:46.212356" elapsed="0.000198"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:46.212857" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:46.212982" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:46.212716" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:46.213603" level="INFO">{1: 63}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:46.213168" elapsed="0.000482"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:46.214232" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:46.213851" elapsed="0.000431"/>
</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-04-17T03:26:46.215041" elapsed="0.000503"/>
</kw>
<msg time="2026-04-17T03:26:46.215858" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:46.215922" level="INFO">${old_connection_index} = 63</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:46.214481" elapsed="0.001484"/>
</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-04-17T03:26:46.217883" elapsed="0.000409"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:46.219684" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:46.219452" elapsed="0.000980">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:46.218603" elapsed="0.001975"/>
</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-04-17T03:26:46.221906" elapsed="0.000160"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:46.221056" elapsed="0.001133"/>
</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-04-17T03:26:46.216277" elapsed="0.006036"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:46.216046" elapsed="0.006337"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:46.216026" elapsed="0.006392"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:46.224128" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:46.223305" elapsed="0.000882"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:46.224483" elapsed="0.000050"/>
</return>
<msg time="2026-04-17T03:26:46.224712" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:46.222715" elapsed="0.002033"/>
</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-04-17T03:26:46.224993" elapsed="0.000875"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:46.226352" level="INFO">index=64
host=10.30.170.120
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-04-17T03:26:46.226519" level="INFO">${karaf_connection_object} = index=64
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:46.226162" elapsed="0.000398"/>
</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-04-17T03:26:46.226815" elapsed="0.012847"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:46.240834" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:46.242153" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:46.240272" elapsed="0.002460">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:46.249001" elapsed="0.000176"/>
</kw>
<msg time="2026-04-17T03:26:46.249261" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:46.247884" 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-04-17T03:26:46.250375" elapsed="0.000091"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:46.251654" 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-04-17T03:26:46.244217" elapsed="0.007679"/>
</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-04-17T03:26:46.243269" elapsed="0.008820"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:46.212055" elapsed="0.040161">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:46.252851" elapsed="0.000035"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:46.252976" 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="FAIL" start="2026-04-17T03:26:46.186759" elapsed="0.066387">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:46.253304" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:46.253366" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:46.181565" elapsed="0.071832"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:46.253879" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:46.253516" elapsed="0.000455"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:46.253486" elapsed="0.000523"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:46.181412" elapsed="0.072631"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:46.181221" elapsed="0.072870"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:46.178443" elapsed="0.075733"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:46.172387" elapsed="0.081870"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:46.171726" elapsed="0.082599"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:46.167342" elapsed="0.087061"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:46.258585" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:46.460612" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:46.863320" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:46.865353" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:46.255067" elapsed="0.613420">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:46.868845" elapsed="0.000038"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:46.869115" elapsed="0.000028"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:46.869477" elapsed="0.000032"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:46.254610" elapsed="0.615047">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:46.166216" elapsed="0.703534">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:46.165346" elapsed="0.704641">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:46.875087" elapsed="0.000304"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:46.874752" 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-04-17T03:26:46.876887" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:46.876716" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:46.876682" 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-04-17T03:26:46.883851" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:46.883720" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:46.883696" elapsed="0.000229"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:46.885284" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:46.884721" elapsed="0.000595"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:46.885800" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:46.885486" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:46.885872" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:26:46.886106" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:46.884211" 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-04-17T03:26:46.893894" elapsed="0.000049"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:46.893725" elapsed="0.000399"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:46.893694" elapsed="0.000482"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:46.896439" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:46.896203" elapsed="0.000371"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:46.896177" elapsed="0.000468"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:46.897451" level="INFO">${karaf_connection_index} = 64</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:46.896894" elapsed="0.000634"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:46.898370" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:46.897998" elapsed="0.000454"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:46.901679" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:46.901103" elapsed="0.001983">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:46.903384" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:46.903534" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:46.898898" elapsed="0.004718"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:46.906788" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:46.906192" elapsed="0.001498">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:46.907909" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:46.908066" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:46.904197" elapsed="0.003957"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:46.910646" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_mac_arb"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:46.909398" elapsed="0.001591">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_mac_arb"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:46.908576" elapsed="0.002588">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_mac_arb"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:46.908535" elapsed="0.002753">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_mac_arb"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:46.911609" elapsed="0.000035"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:46.912236" elapsed="0.000082"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:46.911903" elapsed="0.000527"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:46.911872" elapsed="0.000666"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:46.912608" 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-04-17T03:26:46.917852" elapsed="0.000190"/>
</kw>
<msg time="2026-04-17T03:26:46.918094" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:46.917132" elapsed="0.001035"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:46.918392" elapsed="0.000025"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:46.918648" 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-04-17T03:26:46.916001" 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-04-17T03:26:46.913219" elapsed="0.005796"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:46.895600" elapsed="0.023620">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_mac_arb"</status>
</kw>
<msg time="2026-04-17T03:26:46.919398" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:46.919447" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_mac_arb"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:46.894455" elapsed="0.025017"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:46.919675" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:46.919559" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:46.919536" elapsed="0.000273"/>
</if>
<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-04-17T03:26:46.920908" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:46.920793" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:46.920773" elapsed="0.000347"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:46.921524" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:46.921670" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:46.921350" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:46.922273" level="INFO">{1: 64}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:46.921873" elapsed="0.000465"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:46.922984" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:46.922560" elapsed="0.000482"/>
</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-04-17T03:26:46.923855" elapsed="0.000458"/>
</kw>
<msg time="2026-04-17T03:26:46.924565" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:46.924615" level="INFO">${old_connection_index} = 64</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:46.923263" elapsed="0.001376"/>
</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-04-17T03:26:46.926611" elapsed="0.000408"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:46.928367" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:46.928167" elapsed="0.001017">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:46.927420" elapsed="0.001884"/>
</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-04-17T03:26:46.930393" elapsed="0.000110"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:46.929671" elapsed="0.000928"/>
</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-04-17T03:26:46.925124" elapsed="0.005571"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:46.924718" elapsed="0.006029"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:46.924699" elapsed="0.006077"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:46.932229" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:46.931545" elapsed="0.000727"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:46.932446" elapsed="0.000049"/>
</return>
<msg time="2026-04-17T03:26:46.932668" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:46.931032" elapsed="0.001668"/>
</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-04-17T03:26:46.932907" elapsed="0.000778"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:46.934176" level="INFO">index=65
host=10.30.170.120
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-04-17T03:26:46.934305" level="INFO">${karaf_connection_object} = index=65
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:46.933914" elapsed="0.000420"/>
</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-04-17T03:26:46.934492" elapsed="0.011175"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:46.946467" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:46.947786" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:46.945925" elapsed="0.002703">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:46.955022" elapsed="0.000199"/>
</kw>
<msg time="2026-04-17T03:26:46.955412" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:46.954059" 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-04-17T03:26:46.956529" elapsed="0.000072"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:46.957481" elapsed="0.000067"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:46.950071" elapsed="0.007592"/>
</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-04-17T03:26:46.949113" elapsed="0.008660"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:46.920445" elapsed="0.037422">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:46.958359" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:46.958441" 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="FAIL" start="2026-04-17T03:26:46.893170" elapsed="0.065388">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:46.958674" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:46.958724" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:46.886681" elapsed="0.072067"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:46.959228" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:46.958867" elapsed="0.000434"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:46.958839" elapsed="0.000561"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:46.886469" elapsed="0.072969"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:46.886216" elapsed="0.073268"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:46.883204" elapsed="0.076364"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:46.876303" elapsed="0.083345"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:46.875652" elapsed="0.084061"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:46.871764" elapsed="0.088026"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:46.963628" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:47.165210" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:47.567315" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:47.570634" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:46.960316" elapsed="0.614135">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:47.574849" elapsed="0.000044"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:47.575259" elapsed="0.000032"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:47.575691" elapsed="0.000039"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:46.959968" elapsed="0.615931">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:46.870864" elapsed="0.705165">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:46.870304" elapsed="0.705960">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:47.582701" elapsed="0.000262"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:47.582416" elapsed="0.000615"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:47.584171" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:47.584032" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:47.584006" elapsed="0.000242"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:47.589428" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:47.589298" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:47.589277" elapsed="0.000227"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:47.590701" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:47.590188" elapsed="0.000555"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:47.591476" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:47.591015" elapsed="0.000500"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:47.591585" elapsed="0.000053"/>
</return>
<msg time="2026-04-17T03:26:47.591850" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:47.589766" elapsed="0.002120"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:47.599580" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:47.599446" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:47.599423" 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-04-17T03:26:47.601357" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:47.601168" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:47.601150" elapsed="0.000372"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:47.602160" level="INFO">${karaf_connection_index} = 65</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:47.601699" elapsed="0.000527"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:47.602853" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:47.602580" elapsed="0.000337"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:47.605531" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:47.604899" elapsed="0.001302">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:47.606351" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:47.606447" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:47.603251" elapsed="0.003255"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:47.609072" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:47.608615" elapsed="0.001047">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:47.609813" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:47.609909" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:47.607003" elapsed="0.003072"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:47.611585" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_mac_arb"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:47.610782" elapsed="0.001055">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_mac_arb"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:47.610388" elapsed="0.001574">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_mac_arb"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:47.610360" elapsed="0.001686">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_mac_arb"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:47.612225" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:47.612635" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:47.612425" elapsed="0.000323"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:47.612404" elapsed="0.000402"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:47.612847" elapsed="0.000019"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:47.618616" elapsed="0.000275"/>
</kw>
<msg time="2026-04-17T03:26:47.618999" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:47.617497" 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-04-17T03:26:47.619448" elapsed="0.000036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:47.619798" elapsed="0.000032"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:47.616285" elapsed="0.003860"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:47.613215" elapsed="0.007060"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:47.600685" elapsed="0.019846">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_mac_arb"</status>
</kw>
<msg time="2026-04-17T03:26:47.620719" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:47.620801" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_mac_arb"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:47.599868" elapsed="0.020983"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:47.621268" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:47.621064" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:47.621020" elapsed="0.000388"/>
</if>
<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-04-17T03:26:47.623885" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:47.623644" elapsed="0.000352"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:47.623613" elapsed="0.000432"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:47.624619" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:47.624789" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:47.624393" elapsed="0.000426"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:47.625356" level="INFO">{1: 65}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:47.624998" elapsed="0.000404"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:47.625859" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:47.625560" elapsed="0.000344"/>
</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-04-17T03:26:47.626767" elapsed="0.000399"/>
</kw>
<msg time="2026-04-17T03:26:47.627434" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:47.627555" level="INFO">${old_connection_index} = 65</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:47.626300" elapsed="0.001281"/>
</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-04-17T03:26:47.629467" elapsed="0.000400"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:47.631211" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:47.630956" elapsed="0.000882">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:47.630257" elapsed="0.001736"/>
</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-04-17T03:26:47.633128" elapsed="0.000131"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:47.632317" elapsed="0.001048"/>
</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-04-17T03:26:47.627963" elapsed="0.005502"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:47.627669" elapsed="0.005852"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:47.627647" elapsed="0.005907"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:47.635066" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:47.634375" elapsed="0.000738"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:47.635284" elapsed="0.000047"/>
</return>
<msg time="2026-04-17T03:26:47.635466" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:47.633837" elapsed="0.001654"/>
</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-04-17T03:26:47.635655" elapsed="0.000681"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:47.636694" level="INFO">index=66
host=10.30.170.120
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-04-17T03:26:47.636813" level="INFO">${karaf_connection_object} = index=66
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:47.636546" elapsed="0.000294"/>
</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-04-17T03:26:47.637039" elapsed="0.009675"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:47.647453" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:47.648719" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:47.646992" elapsed="0.002229">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:47.655951" elapsed="0.000200"/>
</kw>
<msg time="2026-04-17T03:26:47.656248" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:47.654737" elapsed="0.001677"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:47.657311" elapsed="0.000070"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:47.658323" elapsed="0.000069"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:47.650912" elapsed="0.007607"/>
</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-04-17T03:26:47.649624" elapsed="0.009010"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:47.623066" elapsed="0.035702">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:47.659323" elapsed="0.000031"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:47.659409" elapsed="0.000023"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:26:47.599033" elapsed="0.060499">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:47.659751" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:47.659798" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:47.592488" elapsed="0.067335"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:47.660228" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:47.659913" elapsed="0.000388"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:47.659891" elapsed="0.000444"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:47.592266" elapsed="0.068104"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:47.591990" elapsed="0.068425"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:47.588858" elapsed="0.071629"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:47.583687" elapsed="0.076871"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:47.583191" elapsed="0.077425"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:47.579087" elapsed="0.081595"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:47.664104" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:47.865833" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:48.268348" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:48.270670" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:47.661228" elapsed="0.613373">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:48.275036" elapsed="0.000045"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:48.275319" elapsed="0.000030"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:48.275720" elapsed="0.000038"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:47.660861" elapsed="0.615062">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:47.577807" elapsed="0.698319">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:47.576807" elapsed="0.699584">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:48.282572" elapsed="0.000250"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:48.282249" elapsed="0.000640"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:48.284084" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:48.283897" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:48.283871" elapsed="0.000292"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:48.289548" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:48.289423" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:48.289403" elapsed="0.000238"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:48.290856" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:48.290415" elapsed="0.000471"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:48.291511" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:48.291104" elapsed="0.000436"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:48.291589" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:26:48.291789" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:48.289991" elapsed="0.001825"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:48.298158" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:48.298003" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:48.297977" elapsed="0.000278"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:48.299963" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:48.299737" elapsed="0.000384"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:48.299714" elapsed="0.000467"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:48.300800" level="INFO">${karaf_connection_index} = 66</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:48.300346" elapsed="0.000518"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:48.301517" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:48.301240" elapsed="0.000339"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:48.303950" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:48.303478" elapsed="0.001165">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:48.304795" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:48.304893" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:48.301897" elapsed="0.003098"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:48.307445" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:48.307007" elapsed="0.001071">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:48.308228" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:48.308321" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:48.305396" elapsed="0.002983"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:48.309955" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_mac_as"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:48.309160" elapsed="0.001005">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_mac_as"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:48.308689" elapsed="0.001584">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_mac_as"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:48.308665" elapsed="0.001690">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_mac_as"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:48.310543" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:48.311040" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:48.310750" elapsed="0.000407"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:48.310730" elapsed="0.000486"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:48.311255" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:48.315279" elapsed="0.000172"/>
</kw>
<msg time="2026-04-17T03:26:48.315507" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:48.314595" elapsed="0.000984"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:48.315800" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:48.316112" elapsed="0.000032"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:48.313793" elapsed="0.002565"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:48.311562" elapsed="0.004902"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:48.299239" elapsed="0.017411">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_mac_as"</status>
</kw>
<msg time="2026-04-17T03:26:48.316801" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:48.316865" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_mac_as"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:48.298445" elapsed="0.018448"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:48.317183" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:48.317045" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:48.317021" elapsed="0.000235"/>
</if>
<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-04-17T03:26:48.318558" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:48.318449" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:48.318430" elapsed="0.000195"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:48.318925" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:48.319058" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:48.318788" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:48.319576" level="INFO">{1: 66}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:48.319241" elapsed="0.000384"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:48.320217" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:48.319789" elapsed="0.000491"/>
</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-04-17T03:26:48.321321" elapsed="0.000379"/>
</kw>
<msg time="2026-04-17T03:26:48.321969" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:48.322017" level="INFO">${old_connection_index} = 66</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:48.320522" elapsed="0.001518"/>
</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-04-17T03:26:48.323988" elapsed="0.000573"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:48.326240" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:48.326031" elapsed="0.000730">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:48.325332" elapsed="0.001549"/>
</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-04-17T03:26:48.327966" elapsed="0.000187"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:48.327280" elapsed="0.001016"/>
</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-04-17T03:26:48.322358" elapsed="0.006071"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:48.322120" elapsed="0.006367"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:48.322101" elapsed="0.006419"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:48.329872" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:48.329312" elapsed="0.000603"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:48.330128" elapsed="0.000055"/>
</return>
<msg time="2026-04-17T03:26:48.330335" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:48.328853" elapsed="0.001521"/>
</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-04-17T03:26:48.330590" elapsed="0.000682"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:48.331598" level="INFO">index=67
host=10.30.170.120
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-04-17T03:26:48.331759" level="INFO">${karaf_connection_object} = index=67
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:48.331463" elapsed="0.000333"/>
</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-04-17T03:26:48.332038" elapsed="0.010065"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:48.342856" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:48.344257" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:48.342365" elapsed="0.002366">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:48.350734" elapsed="0.000504"/>
</kw>
<msg time="2026-04-17T03:26:48.351334" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:48.349757" elapsed="0.001776"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:48.352457" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:48.353394" elapsed="0.000066"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:48.346182" elapsed="0.007396"/>
</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-04-17T03:26:48.345444" elapsed="0.008245"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:48.318130" elapsed="0.035655">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:48.354290" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:48.354371" elapsed="0.000023"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:26:48.297548" elapsed="0.056942">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:48.354607" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:48.354654" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:48.292412" elapsed="0.062267"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:48.355090" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:48.354766" elapsed="0.000379"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:48.354744" elapsed="0.000426"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:48.292204" elapsed="0.062990"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:48.291886" elapsed="0.063350"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:48.288971" elapsed="0.066345"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:48.283556" elapsed="0.071824"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:48.283066" elapsed="0.072363"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:48.279245" elapsed="0.076305"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:48.358973" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:48.560539" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:48.962909" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:48.964857" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:48.356034" elapsed="0.611316">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:48.967645" elapsed="0.000041"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:48.967875" elapsed="0.000024"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:48.968227" elapsed="0.000032"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:48.355713" elapsed="0.612753">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:48.277624" elapsed="0.690941">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:48.276876" elapsed="0.691896">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:48.978359" elapsed="0.000355"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:48.977948" elapsed="0.000871"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:48.980358" elapsed="0.000080"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:48.980180" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:48.980148" 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-04-17T03:26:48.987791" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:48.987601" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:48.987565" elapsed="0.000344"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:48.989615" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:48.988987" elapsed="0.000668"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:48.990353" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:48.989894" elapsed="0.000494"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:48.990450" elapsed="0.000052"/>
</return>
<msg time="2026-04-17T03:26:48.990772" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:48.988342" elapsed="0.002465"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:48.999178" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:48.998990" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:48.998954" elapsed="0.000341"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:49.001759" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:49.001482" elapsed="0.000439"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:49.001453" elapsed="0.000571"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:49.002902" level="INFO">${karaf_connection_index} = 67</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:49.002282" elapsed="0.000736"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:49.003923" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:49.003521" elapsed="0.000516"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:49.007454" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:49.006740" elapsed="0.001747">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:49.008751" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:49.008887" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:49.004552" elapsed="0.004451"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:49.012974" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:49.012195" elapsed="0.001700">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:49.014149" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:49.014288" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:49.009641" elapsed="0.004728"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:49.016610" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_mac_as"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:49.015378" elapsed="0.001520">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_mac_as"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:49.014800" elapsed="0.002282">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_mac_as"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:49.014758" elapsed="0.002437">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_mac_as"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:49.017475" elapsed="0.000035"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:49.018064" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:49.017752" elapsed="0.000468"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:49.017724" elapsed="0.000571"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:49.018353" 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-04-17T03:26:49.023358" elapsed="0.000228"/>
</kw>
<msg time="2026-04-17T03:26:49.023658" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:49.022567" elapsed="0.001201"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:49.024246" elapsed="0.000037"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:49.024625" elapsed="0.000033"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:49.021456" elapsed="0.003553"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:49.018734" elapsed="0.006450"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:49.000762" elapsed="0.024728">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_mac_as"</status>
</kw>
<msg time="2026-04-17T03:26:49.025805" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:49.025900" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_mac_as"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:48.999586" elapsed="0.026543"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:49.026537" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:49.026304" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:49.026261" elapsed="0.000423"/>
</if>
<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-04-17T03:26:49.028996" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:49.028806" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:49.028757" elapsed="0.000342"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:49.029519" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:49.029676" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:49.029326" elapsed="0.000391"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:49.030606" level="INFO">{1: 67}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:49.030117" elapsed="0.000557"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:49.031365" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:49.030908" elapsed="0.000520"/>
</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-04-17T03:26:49.032254" elapsed="0.000527"/>
</kw>
<msg time="2026-04-17T03:26:49.033142" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:49.033211" level="INFO">${old_connection_index} = 67</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:49.031662" elapsed="0.001586"/>
</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-04-17T03:26:49.035753" elapsed="0.000565"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:49.038014" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:49.037728" elapsed="0.001017">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:49.036830" elapsed="0.002063"/>
</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-04-17T03:26:49.040210" elapsed="0.000150"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:49.039344" elapsed="0.001165"/>
</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-04-17T03:26:49.033696" elapsed="0.006942"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:49.033368" elapsed="0.007339"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:49.033338" elapsed="0.007414"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:49.042513" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:49.041657" elapsed="0.000914"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:49.042799" elapsed="0.000054"/>
</return>
<msg time="2026-04-17T03:26:49.043055" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:49.041095" elapsed="0.001994"/>
</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-04-17T03:26:49.043314" elapsed="0.000834"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:49.044602" level="INFO">index=68
host=10.30.170.120
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-04-17T03:26:49.044746" level="INFO">${karaf_connection_object} = index=68
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:49.044396" elapsed="0.000388"/>
</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-04-17T03:26:49.045010" elapsed="0.011662"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:49.057749" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:49.059434" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:49.057029" elapsed="0.003015">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:49.067728" elapsed="0.000264"/>
</kw>
<msg time="2026-04-17T03:26:49.068116" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:49.066421" elapsed="0.001912"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:49.069512" elapsed="0.000093"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:49.070739" 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-04-17T03:26:49.061578" elapsed="0.009445"/>
</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-04-17T03:26:49.060611" elapsed="0.010569"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:49.027696" elapsed="0.043628">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:49.072219" elapsed="0.000038"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:49.072329" elapsed="0.000036"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:26:48.998311" elapsed="0.074235">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:49.072720" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:49.072783" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:48.991370" elapsed="0.081447"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:49.073359" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:49.072958" elapsed="0.000475"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:49.072907" elapsed="0.000562"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:48.991157" elapsed="0.082349"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:48.990884" elapsed="0.082666"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:48.986911" elapsed="0.086720"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:48.979725" elapsed="0.093991"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:48.979070" elapsed="0.094716"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:48.974711" elapsed="0.099159"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:49.078373" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:49.280073" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:49.683007" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:49.685475" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:49.074644" elapsed="0.615009">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:49.690146" elapsed="0.000070"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:49.690521" elapsed="0.000034"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:49.691048" elapsed="0.000042"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:49.074239" elapsed="0.617051">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:48.970301" elapsed="0.721144">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:48.969461" elapsed="0.722287">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:49.697487" elapsed="0.000319"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:49.697190" elapsed="0.000717"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:49.699190" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:49.699048" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:49.699010" elapsed="0.000282"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:49.705582" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:49.705448" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:49.705426" elapsed="0.000236"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:49.706889" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:49.706416" elapsed="0.000503"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:49.707445" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:49.707121" elapsed="0.000350"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:49.707518" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:26:49.707691" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:49.705957" elapsed="0.001760"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:49.714115" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:49.713984" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:49.713963" elapsed="0.000238"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:49.716228" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:49.715967" elapsed="0.000408"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:49.715912" elapsed="0.000550"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:49.717464" level="INFO">${karaf_connection_index} = 68</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:49.716687" elapsed="0.000843"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:49.718547" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:49.718019" elapsed="0.000595"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:49.721580" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:49.721043" elapsed="0.001601">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:49.722872" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:49.723092" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:49.719026" elapsed="0.004155"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:49.725912" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:49.725414" elapsed="0.001117">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:49.726680" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:49.726779" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:49.723642" elapsed="0.003198"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:49.728365" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_mac_lacp"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:49.727561" elapsed="0.001015">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_mac_lacp"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:49.727179" elapsed="0.001512">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_mac_lacp"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:49.727153" elapsed="0.001666">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_mac_lacp"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:49.729176" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:49.729598" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:49.729385" elapsed="0.000331"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:49.729364" elapsed="0.000412"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:49.729818" elapsed="0.000019"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:49.733731" elapsed="0.000261"/>
</kw>
<msg time="2026-04-17T03:26:49.734066" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:49.733090" elapsed="0.001079"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:49.734482" elapsed="0.000034"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:49.734794" elapsed="0.000032"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:49.732151" elapsed="0.003045"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:49.730153" elapsed="0.005182"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:49.715322" elapsed="0.020258">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_mac_lacp"</status>
</kw>
<msg time="2026-04-17T03:26:49.735749" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:49.735820" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_mac_lacp"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:49.714363" elapsed="0.021492"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:49.736198" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:49.736018" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:49.735977" elapsed="0.000325"/>
</if>
<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-04-17T03:26:49.737919" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:49.737787" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:49.737760" elapsed="0.000246"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:49.738338" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:49.738484" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:49.738182" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:49.739157" level="INFO">{1: 68}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:49.738760" elapsed="0.000446"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:49.739679" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:49.739367" elapsed="0.000358"/>
</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-04-17T03:26:49.740367" elapsed="0.000376"/>
</kw>
<msg time="2026-04-17T03:26:49.741119" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:49.741183" level="INFO">${old_connection_index} = 68</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:49.739898" elapsed="0.001311"/>
</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-04-17T03:26:49.743362" elapsed="0.000408"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:49.745108" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:49.744854" elapsed="0.001051">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:49.744160" elapsed="0.001881"/>
</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-04-17T03:26:49.747023" elapsed="0.000114"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:49.746362" elapsed="0.000874"/>
</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-04-17T03:26:49.741539" elapsed="0.005796"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:49.741294" elapsed="0.006093"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:49.741273" elapsed="0.006144"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:49.748699" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:49.748125" elapsed="0.000620"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:49.749060" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:26:49.749248" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:49.747662" elapsed="0.001614"/>
</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-04-17T03:26:49.749443" elapsed="0.000684"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:49.750451" level="INFO">index=69
host=10.30.170.120
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-04-17T03:26:49.750558" level="INFO">${karaf_connection_object} = index=69
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:49.750319" elapsed="0.000267"/>
</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-04-17T03:26:49.750741" elapsed="0.008719"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:49.760207" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:49.761525" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:49.759675" elapsed="0.002340">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:49.767375" elapsed="0.000170"/>
</kw>
<msg time="2026-04-17T03:26:49.767625" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:49.766567" elapsed="0.001208"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:49.768713" elapsed="0.000120"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:49.769832" elapsed="0.000069"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:49.763059" elapsed="0.007024"/>
</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-04-17T03:26:49.762373" elapsed="0.007828"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:49.737321" elapsed="0.032976">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:49.770846" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:49.770941" elapsed="0.000024"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:26:49.713581" elapsed="0.057483">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:49.771181" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:49.771227" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:49.708148" elapsed="0.063103"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:49.771611" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:49.771339" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:49.771318" elapsed="0.000373"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:49.707992" elapsed="0.063723"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:49.707777" elapsed="0.063972"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:49.705004" elapsed="0.066808"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:49.698673" elapsed="0.073202"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:49.698149" elapsed="0.073791"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:49.694253" elapsed="0.077788"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:49.775475" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:49.977091" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:50.379448" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:50.382176" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:49.772522" elapsed="0.614321">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:50.387224" elapsed="0.000041"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:50.387492" elapsed="0.000032"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:50.387883" elapsed="0.000038"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:49.772208" elapsed="0.615894">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:49.693430" elapsed="0.694778">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:49.692404" elapsed="0.696103">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:50.394427" elapsed="0.000251"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:50.394127" elapsed="0.000614"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:50.396051" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:50.395863" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:50.395831" elapsed="0.000317"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:50.401578" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:50.401435" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:50.401413" elapsed="0.000254"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:50.402885" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:50.402431" elapsed="0.000511"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:50.403478" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:50.403145" elapsed="0.000360"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:50.403554" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:26:50.403764" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:50.401991" elapsed="0.001806"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:50.410101" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:50.409974" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:50.409951" elapsed="0.000227"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:50.411750" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:50.411557" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:50.411538" elapsed="0.000377"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:50.412647" level="INFO">${karaf_connection_index} = 69</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:50.412129" elapsed="0.000587"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:50.413443" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:50.413099" elapsed="0.000424"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:50.416006" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:50.415520" elapsed="0.001081">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:50.416754" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:50.416853" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:50.413905" elapsed="0.003014"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:50.419489" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:50.419064" elapsed="0.001069">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:50.420285" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:50.420379" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:50.417453" elapsed="0.002984"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:50.421912" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_mac_lacp"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:50.421130" elapsed="0.001004">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_mac_lacp"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:50.420733" elapsed="0.001509">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_mac_lacp"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:50.420711" elapsed="0.001678">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_mac_lacp"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:50.422587" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:50.423037" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:50.422804" elapsed="0.000349"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:50.422784" elapsed="0.000428"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:50.423251" 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-04-17T03:26:50.427709" elapsed="0.000449"/>
</kw>
<msg time="2026-04-17T03:26:50.428229" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:50.427024" 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-04-17T03:26:50.428639" elapsed="0.000038"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:50.428970" 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-04-17T03:26:50.425949" elapsed="0.003364"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:50.423598" elapsed="0.005855"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:50.411040" elapsed="0.018674">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_mac_lacp"</status>
</kw>
<msg time="2026-04-17T03:26:50.429883" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:50.429987" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_mac_lacp"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:50.410344" elapsed="0.019681"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:50.430484" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:50.430298" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:50.430263" elapsed="0.000319"/>
</if>
<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-04-17T03:26:50.432459" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:50.432239" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:50.432213" elapsed="0.000368"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:50.433314" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:50.433491" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:50.432965" elapsed="0.000567"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:50.434256" level="INFO">{1: 69}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:50.433818" elapsed="0.000511"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:50.434863" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:50.434525" elapsed="0.000386"/>
</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-04-17T03:26:50.435697" elapsed="0.000392"/>
</kw>
<msg time="2026-04-17T03:26:50.436408" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:50.436462" level="INFO">${old_connection_index} = 69</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:50.435261" elapsed="0.001225"/>
</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-04-17T03:26:50.438558" elapsed="0.000470"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:50.440264" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:50.440048" elapsed="0.000851">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:50.439389" elapsed="0.001647"/>
</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-04-17T03:26:50.442104" elapsed="0.000119"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:50.441425" elapsed="0.000923"/>
</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-04-17T03:26:50.436799" elapsed="0.005684"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:50.436568" elapsed="0.006042"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:50.436548" elapsed="0.006093"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:50.444174" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:50.443448" elapsed="0.000771"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:50.444407" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:26:50.444587" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:50.442900" elapsed="0.001729"/>
</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-04-17T03:26:50.444833" elapsed="0.000803"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:50.446022" level="INFO">index=70
host=10.30.170.120
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-04-17T03:26:50.446149" level="INFO">${karaf_connection_object} = index=70
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:50.445858" elapsed="0.000319"/>
</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-04-17T03:26:50.446354" elapsed="0.010443"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:50.457513" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:50.458829" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:50.457020" elapsed="0.002566">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:50.468385" elapsed="0.000329"/>
</kw>
<msg time="2026-04-17T03:26:50.468879" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:50.466540" elapsed="0.002871"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:50.470684" elapsed="0.000086"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:50.471812" elapsed="0.000089"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:50.460728" elapsed="0.011348"/>
</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-04-17T03:26:50.460037" elapsed="0.012165"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:50.431774" elapsed="0.040539">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:50.472836" elapsed="0.000031"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:50.472922" elapsed="0.000093"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:26:50.409578" elapsed="0.063568">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:50.473336" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:50.473395" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:50.404374" elapsed="0.069050"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:50.473901" elapsed="0.000083"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:50.473535" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:50.473507" elapsed="0.000557"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:50.404166" elapsed="0.069924"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:50.403883" elapsed="0.070244"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:50.400977" elapsed="0.073216"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:50.395487" elapsed="0.078866"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:50.394901" elapsed="0.079506"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:50.390387" elapsed="0.084081"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:50.477960" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:50.679536" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:51.082228" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:51.084521" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:50.475042" elapsed="0.614360">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:51.089960" elapsed="0.000049"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:51.090243" elapsed="0.000031"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:51.090662" elapsed="0.000039"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:50.474639" elapsed="0.616228">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:50.389514" elapsed="0.701452">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:50.388828" elapsed="0.702311">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:51.095712" elapsed="0.000259"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:51.095424" 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-04-17T03:26:51.097152" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:51.097015" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:51.096990" elapsed="0.000242"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:51.102562" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:51.102430" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:51.102408" elapsed="0.000235"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:51.103857" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:51.103399" elapsed="0.000490"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:51.104544" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:51.104176" elapsed="0.000399"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:51.104626" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:26:51.104807" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:51.102948" elapsed="0.001885"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:51.110730" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:51.110604" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:51.110583" elapsed="0.000223"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:51.112472" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:51.112280" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:51.112260" elapsed="0.000379"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:51.113266" level="INFO">${karaf_connection_index} = 70</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:51.112803" elapsed="0.000554"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:51.114118" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:51.113778" elapsed="0.000414"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:51.119139" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:51.116189" elapsed="0.003603">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:51.120063" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:51.120181" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:51.114567" elapsed="0.005681"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:51.122862" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:51.122418" elapsed="0.001079">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:51.123640" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:51.123751" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:51.120681" elapsed="0.003138"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:51.125465" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_mac_lan"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:51.124690" elapsed="0.001013">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_mac_lan"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:51.124311" elapsed="0.001502">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_mac_lan"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:51.124285" elapsed="0.001621">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_mac_lan"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:51.126103" elapsed="0.000034"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:51.126551" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:51.126322" elapsed="0.000342"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:51.126302" elapsed="0.000420"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:51.126761" elapsed="0.000019"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:51.130766" elapsed="0.000284"/>
</kw>
<msg time="2026-04-17T03:26:51.131191" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:51.130011" elapsed="0.001319"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:51.131740" elapsed="0.000038"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:51.132294" elapsed="0.000041"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:51.129104" elapsed="0.003665"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:51.127096" elapsed="0.005882"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:51.111722" elapsed="0.021696">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_mac_lan"</status>
</kw>
<msg time="2026-04-17T03:26:51.133672" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:51.133752" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_mac_lan"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:51.111010" elapsed="0.022779"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:51.134037" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:51.133899" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:51.133878" elapsed="0.000231"/>
</if>
<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-04-17T03:26:51.135048" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:51.134918" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:51.134899" elapsed="0.000222"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:51.135424" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:51.135541" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:51.135286" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:51.136365" level="INFO">{1: 70}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:51.135739" elapsed="0.000682"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:51.136972" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:51.136607" elapsed="0.000417"/>
</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-04-17T03:26:51.137654" elapsed="0.000404"/>
</kw>
<msg time="2026-04-17T03:26:51.138316" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:51.138369" level="INFO">${old_connection_index} = 70</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:51.137205" elapsed="0.001189"/>
</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-04-17T03:26:51.140655" elapsed="0.000491"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:51.142635" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:51.142188" elapsed="0.001162">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:51.141482" elapsed="0.002057"/>
</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-04-17T03:26:51.145125" elapsed="0.000157"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:51.144097" elapsed="0.001322"/>
</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-04-17T03:26:51.138712" elapsed="0.006876"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:51.138477" elapsed="0.007201"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:51.138455" elapsed="0.007275"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:51.147581" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:51.146764" elapsed="0.000882"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:51.147897" elapsed="0.000211"/>
</return>
<msg time="2026-04-17T03:26:51.148324" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:51.146159" elapsed="0.002203"/>
</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-04-17T03:26:51.148604" elapsed="0.000975"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:51.149996" level="INFO">index=71
host=10.30.170.120
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-04-17T03:26:51.150109" level="INFO">${karaf_connection_object} = index=71
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:51.149838" elapsed="0.000300"/>
</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-04-17T03:26:51.150370" elapsed="0.008692"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:51.159681" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:51.160768" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:51.159245" elapsed="0.001980">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:51.167135" elapsed="0.000201"/>
</kw>
<msg time="2026-04-17T03:26:51.167422" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:51.166140" 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-04-17T03:26:51.168655" elapsed="0.000071"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:51.169696" elapsed="0.000073"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:51.162360" elapsed="0.007540"/>
</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-04-17T03:26:51.161622" elapsed="0.008415"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:51.134603" elapsed="0.035533">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:51.170648" elapsed="0.000030"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:51.170734" elapsed="0.000023"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:26:51.110201" elapsed="0.060657">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:51.170998" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:51.171047" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:51.105315" elapsed="0.065758"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:51.171458" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:51.171164" elapsed="0.000354"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:51.171142" elapsed="0.000403"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:51.105125" elapsed="0.066446"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:51.104896" elapsed="0.066711"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:51.101983" elapsed="0.069686"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:51.096678" elapsed="0.075054"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:51.096195" elapsed="0.075585"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:51.092543" elapsed="0.079297"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:51.175358" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:51.376832" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:51.779693" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:51.783510" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:51.172395" elapsed="0.616354">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:51.789171" elapsed="0.000059"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:51.789560" elapsed="0.000045"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:51.790165" elapsed="0.000053"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:51.172027" elapsed="0.618410">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:51.091871" elapsed="0.698706">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:51.091400" elapsed="0.699466">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:51.797633" elapsed="0.000521"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:51.797229" elapsed="0.001046"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:51.799949" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:51.799752" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:51.799719" elapsed="0.000334"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:51.806979" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:51.806776" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:51.806748" elapsed="0.000336"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:51.808616" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:51.808025" elapsed="0.000630"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:51.809314" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:51.808880" elapsed="0.000472"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:51.809418" elapsed="0.000050"/>
</return>
<msg time="2026-04-17T03:26:51.809649" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:51.807453" elapsed="0.002231"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:51.817664" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:51.817495" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:51.817464" elapsed="0.000299"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:51.819867" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:51.819616" elapsed="0.000410"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:51.819590" elapsed="0.000506"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:51.820880" level="INFO">${karaf_connection_index} = 71</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:51.820313" elapsed="0.000673"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:51.821800" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:51.821453" elapsed="0.000439"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:51.824681" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:51.824071" elapsed="0.001457">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:51.825728" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:51.825858" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:51.822331" elapsed="0.003659"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:51.829132" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:51.828506" elapsed="0.001508">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:51.830207" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:51.830343" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:51.826430" elapsed="0.003994"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:51.832706" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_mac_lan"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:51.831406" elapsed="0.001583">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_mac_lan"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:51.830849" elapsed="0.002289">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_mac_lan"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:51.830813" elapsed="0.002435">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_mac_lan"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:51.833506" elapsed="0.000033"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:51.834138" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:51.833772" elapsed="0.000523"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:51.833743" elapsed="0.000635"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:51.834439" 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-04-17T03:26:51.839461" elapsed="0.000223"/>
</kw>
<msg time="2026-04-17T03:26:51.839757" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:51.838585" elapsed="0.001277"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:51.840301" elapsed="0.000036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:51.840623" elapsed="0.000029"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:51.837478" elapsed="0.003416"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:51.834877" elapsed="0.006164"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:51.819034" elapsed="0.022236">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_mac_lan"</status>
</kw>
<msg time="2026-04-17T03:26:51.841428" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:51.841494" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_mac_lan"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:51.818072" elapsed="0.023457"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:51.841821" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:51.841656" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:51.841620" elapsed="0.000378"/>
</if>
<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-04-17T03:26:51.843788" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:51.843624" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:51.843588" elapsed="0.000306"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:51.844300" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:51.844467" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:51.844137" elapsed="0.000369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:51.845206" level="INFO">{1: 71}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:51.844755" elapsed="0.000500"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:51.845736" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:51.845421" elapsed="0.000361"/>
</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-04-17T03:26:51.846449" elapsed="0.000392"/>
</kw>
<msg time="2026-04-17T03:26:51.847317" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:51.847368" level="INFO">${old_connection_index} = 71</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:51.845997" elapsed="0.001397"/>
</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-04-17T03:26:51.849304" elapsed="0.000433"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:51.851330" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:51.851134" elapsed="0.000729">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:51.850334" elapsed="0.001666"/>
</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-04-17T03:26:51.853281" elapsed="0.000144"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:51.852424" elapsed="0.001109"/>
</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-04-17T03:26:51.847719" elapsed="0.005916"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:51.847478" elapsed="0.006215"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:51.847457" elapsed="0.006268"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:51.855183" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:51.854490" elapsed="0.000739"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:51.855408" elapsed="0.000058"/>
</return>
<msg time="2026-04-17T03:26:51.855612" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:51.854030" elapsed="0.001610"/>
</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-04-17T03:26:51.855807" elapsed="0.000695"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:51.856822" level="INFO">index=72
host=10.30.170.120
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-04-17T03:26:51.856978" level="INFO">${karaf_connection_object} = index=72
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:51.856687" elapsed="0.000324"/>
</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-04-17T03:26:51.857170" elapsed="0.009554"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:51.867566" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:51.868963" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:51.867109" elapsed="0.003008">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:51.880535" elapsed="0.000317"/>
</kw>
<msg time="2026-04-17T03:26:51.881044" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:51.878697" elapsed="0.002666"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:51.883117" elapsed="0.000097"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:51.884355" elapsed="0.000089"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:51.872589" elapsed="0.012029"/>
</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-04-17T03:26:51.870869" elapsed="0.013891"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:51.842619" elapsed="0.042280">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:51.885717" elapsed="0.000039"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:51.885829" elapsed="0.000031"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:26:51.816991" elapsed="0.069050">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:51.886219" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:51.886283" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:51.810291" elapsed="0.076024"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:51.886835" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:51.886436" elapsed="0.000679"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:51.886407" elapsed="0.000757"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:51.810092" elapsed="0.077110"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:51.809761" elapsed="0.077493"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:51.806240" elapsed="0.081106"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:51.799338" elapsed="0.088095"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:51.798590" elapsed="0.088909"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:51.793131" elapsed="0.094450"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:51.891546" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:52.093093" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:52.495234" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:52.497406" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:51.888275" elapsed="0.612351">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:52.501003" elapsed="0.000040"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:52.501269" elapsed="0.000029"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:52.501641" elapsed="0.000036"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:51.887809" elapsed="0.614020">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:51.792359" elapsed="0.709588">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:51.791565" elapsed="0.710689">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:52.508173" elapsed="0.000221"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:52.507884" elapsed="0.000566"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:52.509509" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:52.509381" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:52.509358" elapsed="0.000226"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:52.514708" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:52.514599" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:52.514581" elapsed="0.000197"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:52.515846" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:52.515422" elapsed="0.000452"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:52.516357" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:52.516057" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:52.516428" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:26:52.516605" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:52.515034" elapsed="0.001601"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:52.522321" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:52.522183" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:52.522165" elapsed="0.000224"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:52.523818" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:52.523636" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:52.523618" elapsed="0.000393"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:52.524625" level="INFO">${karaf_connection_index} = 72</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:52.524165" elapsed="0.000535"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:52.525365" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:52.525088" elapsed="0.000337"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:52.527898" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:52.527321" elapsed="0.001118">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:52.528589" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:52.528690" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:52.525735" elapsed="0.003015"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:52.531224" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:52.530774" elapsed="0.001012">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:52.531951" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:52.532051" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:52.529198" elapsed="0.002915"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:52.533617" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_mac_mac"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:52.532776" elapsed="0.001042">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_mac_mac"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:52.532411" elapsed="0.001529">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_mac_mac"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:52.532390" elapsed="0.001670">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_mac_mac"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:52.534236" elapsed="0.000063"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:52.534698" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:52.534488" elapsed="0.000327"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:52.534468" elapsed="0.000406"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:52.534911" 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-04-17T03:26:52.538627" elapsed="0.000148"/>
</kw>
<msg time="2026-04-17T03:26:52.538822" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:52.538073" elapsed="0.000811"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:52.539115" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:52.539333" 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-04-17T03:26:52.537297" elapsed="0.002252"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:52.535210" elapsed="0.004424"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:52.523196" elapsed="0.016597">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_mac_mac"</status>
</kw>
<msg time="2026-04-17T03:26:52.539899" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:52.539960" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_mac_mac"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:52.522544" elapsed="0.017441"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:52.540173" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:52.540061" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:52.540043" elapsed="0.000195"/>
</if>
<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-04-17T03:26:52.541133" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:52.541026" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:52.541008" elapsed="0.000190"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:52.541486" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:52.541617" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:52.541358" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:52.542232" level="INFO">{1: 72}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:52.541827" elapsed="0.000468"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:52.542781" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:52.542475" elapsed="0.000351"/>
</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-04-17T03:26:52.543446" elapsed="0.000358"/>
</kw>
<msg time="2026-04-17T03:26:52.544242" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:52.544290" level="INFO">${old_connection_index} = 72</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:52.543072" elapsed="0.001241"/>
</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-04-17T03:26:52.546082" elapsed="0.000432"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:52.547804" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:52.547476" elapsed="0.000867">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:52.546822" elapsed="0.001634"/>
</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-04-17T03:26:52.549412" elapsed="0.000107"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:52.548768" elapsed="0.000845"/>
</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-04-17T03:26:52.544614" elapsed="0.005092"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:52.544392" elapsed="0.005404"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:52.544372" elapsed="0.005450"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:52.551097" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:52.550523" elapsed="0.000616"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:52.551304" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:26:52.551464" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:52.550048" elapsed="0.001442"/>
</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-04-17T03:26:52.551648" elapsed="0.000651"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:52.552585" level="INFO">index=73
host=10.30.170.120
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-04-17T03:26:52.552685" level="INFO">${karaf_connection_object} = index=73
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:52.552474" elapsed="0.000236"/>
</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-04-17T03:26:52.552861" elapsed="0.008562"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:52.562180" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:52.563656" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:52.561597" elapsed="0.002641">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:52.569481" elapsed="0.000155"/>
</kw>
<msg time="2026-04-17T03:26:52.569710" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:52.568589" elapsed="0.001271"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:52.570802" elapsed="0.000070"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:52.571745" elapsed="0.000065"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:52.565120" elapsed="0.006799"/>
</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-04-17T03:26:52.564527" elapsed="0.007541"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:52.540691" elapsed="0.031462">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:52.572572" elapsed="0.000030"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:52.572650" 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="FAIL" start="2026-04-17T03:26:52.521824" elapsed="0.050935">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:52.572866" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:52.572910" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:52.517059" elapsed="0.055903"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:52.573300" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:52.573043" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:52.573025" elapsed="0.000353"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:52.516882" elapsed="0.056519"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:52.516698" elapsed="0.056736"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:52.514178" elapsed="0.059315"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:52.509071" 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 error.</doc>
<status status="PASS" start="2026-04-17T03:26:52.508604" elapsed="0.065044"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:52.504154" elapsed="0.069547"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:52.576727" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:52.778239" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:53.180805" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:53.184137" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:52.574203" elapsed="0.614441">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:53.189077" elapsed="0.000046"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:53.189366" elapsed="0.000031"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:53.189766" elapsed="0.000038"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:52.573855" elapsed="0.616159">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:52.503392" elapsed="0.686731">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:52.502686" elapsed="0.687695">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:53.196808" elapsed="0.000384"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:53.196389" 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-04-17T03:26:53.199087" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:53.198829" elapsed="0.000355"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:53.198785" 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-04-17T03:26:53.206536" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:53.206391" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:53.206365" elapsed="0.000310"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:53.207861" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:53.207412" elapsed="0.000479"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:53.208484" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:53.208163" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:53.208559" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:26:53.208729" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:53.207003" elapsed="0.001752"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:53.214865" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:53.214739" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:53.214716" elapsed="0.000243"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:53.216486" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:53.216277" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:53.216258" elapsed="0.000395"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:53.217270" level="INFO">${karaf_connection_index} = 73</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:53.216812" elapsed="0.000532"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:53.218033" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:53.217730" elapsed="0.000369"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:53.220995" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:53.220246" elapsed="0.001612">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:53.222099" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:53.222297" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:53.218444" elapsed="0.003957"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:53.225460" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:53.224887" elapsed="0.001358">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:53.226432" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:53.226577" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:53.223077" elapsed="0.003606"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:53.228301" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_mac_mac"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:53.227466" elapsed="0.001047">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_mac_mac"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:53.227044" elapsed="0.001581">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_mac_mac"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:53.227013" elapsed="0.001697">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_mac_mac"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:53.228891" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:53.229576" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:53.229327" elapsed="0.000388"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:53.229305" elapsed="0.000503"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:53.229881" 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-04-17T03:26:53.234215" elapsed="0.000214"/>
</kw>
<msg time="2026-04-17T03:26:53.234498" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:53.233509" elapsed="0.001087"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:53.235120" elapsed="0.000037"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:53.235383" elapsed="0.000024"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:53.232388" elapsed="0.003266"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:53.230288" elapsed="0.005459"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:53.215807" elapsed="0.020237">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_mac_mac"</status>
</kw>
<msg time="2026-04-17T03:26:53.236182" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:53.236229" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_mac_mac"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:53.215132" elapsed="0.021125"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:53.236515" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:53.236375" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:53.236347" elapsed="0.000267"/>
</if>
<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-04-17T03:26:53.238025" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:53.237868" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:53.237849" elapsed="0.000259"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:53.238417" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:53.238527" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:53.238272" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:53.239422" level="INFO">{1: 73}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:53.238774" elapsed="0.000696"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:53.239946" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:53.239629" elapsed="0.000364"/>
</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-04-17T03:26:53.240564" elapsed="0.000386"/>
</kw>
<msg time="2026-04-17T03:26:53.241201" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:53.241248" level="INFO">${old_connection_index} = 73</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:53.240163" elapsed="0.001110"/>
</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-04-17T03:26:53.243212" elapsed="0.000457"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:53.245086" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:53.244851" elapsed="0.000822">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:53.244088" elapsed="0.001726"/>
</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-04-17T03:26:53.246895" elapsed="0.000163"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:53.246188" elapsed="0.000964"/>
</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-04-17T03:26:53.241575" elapsed="0.005674"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:53.241350" elapsed="0.005951"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:53.241331" elapsed="0.006001"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:53.248588" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:53.248025" elapsed="0.000613"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:53.248826" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:26:53.249186" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:53.247573" elapsed="0.001638"/>
</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-04-17T03:26:53.249379" elapsed="0.000650"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:53.250412" level="INFO">index=74
host=10.30.170.120
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-04-17T03:26:53.250537" level="INFO">${karaf_connection_object} = index=74
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:53.250235" elapsed="0.000329"/>
</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-04-17T03:26:53.250889" elapsed="0.011708"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:53.263391" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:53.264526" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:53.262883" elapsed="0.002469">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:53.271016" elapsed="0.000360"/>
</kw>
<msg time="2026-04-17T03:26:53.271466" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:53.269887" elapsed="0.001785"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:53.272977" elapsed="0.000265"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:53.274206" elapsed="0.000072"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:53.266433" elapsed="0.007972"/>
</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-04-17T03:26:53.265735" elapsed="0.008799"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:53.237504" elapsed="0.037180">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:53.275287" elapsed="0.000032"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:53.275374" elapsed="0.000023"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:26:53.214291" elapsed="0.061213">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:53.275629" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:53.275676" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:53.209172" elapsed="0.066527"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:53.276097" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:53.275788" elapsed="0.000365"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:53.275767" elapsed="0.000413"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:53.209022" elapsed="0.067182"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:53.208813" elapsed="0.067431"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:53.205858" elapsed="0.070468"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:53.198226" elapsed="0.078181"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:53.197508" elapsed="0.078958"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:53.192594" elapsed="0.083955"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:53.279808" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:53.481477" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:53.883684" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:53.885887" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:53.277131" elapsed="0.612143">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:53.889644" elapsed="0.000043"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:53.889912" elapsed="0.000053"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:53.890328" elapsed="0.000039"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:53.276715" elapsed="0.613821">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:53.191569" elapsed="0.699073">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:53.190800" elapsed="0.700066">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:53.897213" elapsed="0.000312"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:53.896773" elapsed="0.000846"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:53.899227" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:53.899015" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:53.898914" 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-04-17T03:26:53.905004" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:53.904834" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:53.904808" elapsed="0.000289"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:53.906269" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:53.905797" elapsed="0.000509"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:53.906836" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:53.906521" elapsed="0.000343"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:53.906923" elapsed="0.000102"/>
</return>
<msg time="2026-04-17T03:26:53.907171" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:53.905378" elapsed="0.001818"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:53.913009" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:53.912878" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:53.912858" elapsed="0.000221"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:53.914762" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:53.914562" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:53.914542" elapsed="0.000409"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:53.915634" level="INFO">${karaf_connection_index} = 74</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:53.915175" elapsed="0.000522"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:53.916374" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:53.916070" elapsed="0.000370"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:53.919079" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:53.918511" elapsed="0.001407">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:53.920146" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:53.920262" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:53.916845" elapsed="0.003486"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:53.923109" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:53.922542" elapsed="0.001141">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:53.923829" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:53.923948" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:53.920798" elapsed="0.003239"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:53.925780" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_mac_rou"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:53.924805" elapsed="0.001201">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_mac_rou"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:53.924366" elapsed="0.001753">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_mac_rou"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:53.924328" elapsed="0.001873">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_mac_rou"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:53.926379" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:53.926875" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:53.926612" elapsed="0.000570"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:53.926584" elapsed="0.000687"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:53.927324" elapsed="0.000019"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:53.931603" elapsed="0.000162"/>
</kw>
<msg time="2026-04-17T03:26:53.931820" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:53.930774" elapsed="0.001118"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:53.932131" elapsed="0.000030"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:53.932391" elapsed="0.000024"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:53.929988" elapsed="0.002681"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:53.927651" elapsed="0.005146"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:53.914069" elapsed="0.018987">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_mac_rou"</status>
</kw>
<msg time="2026-04-17T03:26:53.933207" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:53.933268" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_route_mac_rou"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:53.913238" elapsed="0.020064"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:53.933572" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:53.933419" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:53.933388" elapsed="0.000282"/>
</if>
<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-04-17T03:26:53.934733" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:53.934623" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:53.934603" elapsed="0.000198"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:53.935310" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:53.935423" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:53.935164" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:53.936033" level="INFO">{1: 74}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:53.935676" elapsed="0.000405"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:53.936570" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:53.936242" elapsed="0.000395"/>
</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-04-17T03:26:53.937243" elapsed="0.000363"/>
</kw>
<msg time="2026-04-17T03:26:53.937854" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:53.937902" level="INFO">${old_connection_index} = 74</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:53.936821" elapsed="0.001104"/>
</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-04-17T03:26:53.940159" elapsed="0.000412"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:53.941754" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:53.941571" elapsed="0.000991">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:53.940904" elapsed="0.001776"/>
</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-04-17T03:26:53.943798" elapsed="0.000109"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:53.943106" elapsed="0.000939"/>
</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-04-17T03:26:53.938250" elapsed="0.005917"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:53.938020" elapsed="0.006208"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:53.938001" elapsed="0.006281"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:53.945659" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:53.945019" elapsed="0.000691"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:53.945920" elapsed="0.000056"/>
</return>
<msg time="2026-04-17T03:26:53.946111" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:53.944585" elapsed="0.001553"/>
</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-04-17T03:26:53.946305" elapsed="0.000802"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:53.947416" level="INFO">index=75
host=10.30.170.120
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-04-17T03:26:53.947520" level="INFO">${karaf_connection_object} = index=75
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:53.947288" elapsed="0.000258"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:26:53.947698" elapsed="0.009224"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:53.957620" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:53.958801" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:53.957183" elapsed="0.002360">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:53.965235" elapsed="0.000173"/>
</kw>
<msg time="2026-04-17T03:26:53.965497" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:53.964269" 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-04-17T03:26:53.966549" elapsed="0.000097"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:53.967638" elapsed="0.000070"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:53.960627" elapsed="0.007201"/>
</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-04-17T03:26:53.959961" elapsed="0.007997"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:53.934305" elapsed="0.033747">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:53.968612" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:53.968694" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:26:53.912509" elapsed="0.056305">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:53.968966" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:53.969039" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:53.907622" elapsed="0.061444"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:53.969445" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:53.969161" elapsed="0.000349"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:53.969138" elapsed="0.000401"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:53.907445" elapsed="0.062119"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:53.907256" elapsed="0.062343"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:53.904371" elapsed="0.065292"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:53.898497" elapsed="0.071227"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:53.897841" elapsed="0.071932"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:53.892882" elapsed="0.076969"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:53.973385" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:54.175042" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:54.577718" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:54.581022" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:53.970419" elapsed="0.613885">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:54.584658" elapsed="0.000040"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:54.584921" elapsed="0.000054"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:54.585326" elapsed="0.000036"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:53.970086" elapsed="0.615426">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:53.892128" elapsed="0.693483">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:53.891402" elapsed="0.694559">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:54.591608" elapsed="0.000359"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:54.591122" elapsed="0.000910"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:54.593344" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:54.593206" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:54.593180" elapsed="0.000242"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:54.598953" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:54.598802" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:54.598781" elapsed="0.000250"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:54.600346" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:54.599759" elapsed="0.000628"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:54.601092" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:54.600624" elapsed="0.000508"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:54.601207" elapsed="0.000051"/>
</return>
<msg time="2026-04-17T03:26:54.601446" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:54.599295" elapsed="0.002186"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:54.608704" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:54.608564" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:54.608540" 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-04-17T03:26:54.610535" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:54.610340" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:54.610321" elapsed="0.000384"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:54.611372" level="INFO">${karaf_connection_index} = 75</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:54.610871" elapsed="0.000568"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:54.612099" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:54.611796" elapsed="0.000372"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:54.614758" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:54.614163" elapsed="0.001306">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:54.615632" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:54.615729" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:54.612487" elapsed="0.003301"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:54.618325" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:54.617857" elapsed="0.001038">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:54.619096" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:54.619211" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:54.616274" elapsed="0.003008"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:54.621190" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_mac_rou"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:54.620228" elapsed="0.001173">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_mac_rou"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:54.619653" elapsed="0.001863">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_mac_rou"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:54.619624" elapsed="0.002046">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_mac_rou"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:54.621850" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:54.622374" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:54.622139" elapsed="0.000363"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:54.622106" elapsed="0.000457"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:54.622606" elapsed="0.000020"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:54.627024" elapsed="0.000166"/>
</kw>
<msg time="2026-04-17T03:26:54.627243" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:54.626417" 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-04-17T03:26:54.627605" elapsed="0.000033"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:54.627855" 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-04-17T03:26:54.625566" elapsed="0.002629"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:54.623301" elapsed="0.005005"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:54.609831" elapsed="0.018687">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_mac_rou"</status>
</kw>
<msg time="2026-04-17T03:26:54.628670" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:54.628730" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_route_mac_rou"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:54.609016" elapsed="0.019746"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:54.629053" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:54.628874" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:54.628845" elapsed="0.000305"/>
</if>
<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-04-17T03:26:54.630556" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:54.630437" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:54.630417" elapsed="0.000218"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:54.631058" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:54.631202" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:54.630842" elapsed="0.000392"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:54.631847" level="INFO">{1: 75}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:54.631471" elapsed="0.000422"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:54.632376" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:54.632073" elapsed="0.000348"/>
</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-04-17T03:26:54.633003" elapsed="0.000364"/>
</kw>
<msg time="2026-04-17T03:26:54.633614" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:54.633662" level="INFO">${old_connection_index} = 75</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:54.632586" elapsed="0.001099"/>
</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-04-17T03:26:54.635639" elapsed="0.000408"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:54.637197" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:54.637009" elapsed="0.000714">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:54.636361" elapsed="0.001475"/>
</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-04-17T03:26:54.638785" elapsed="0.000106"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:54.638164" elapsed="0.000841"/>
</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-04-17T03:26:54.634006" elapsed="0.005093"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:54.633762" elapsed="0.005464"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:54.633743" elapsed="0.005516"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:54.640764" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:54.640136" elapsed="0.000682"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:54.641079" elapsed="0.000058"/>
</return>
<msg time="2026-04-17T03:26:54.641325" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:54.639539" elapsed="0.001832"/>
</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-04-17T03:26:54.641613" elapsed="0.000876"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:54.642901" level="INFO">index=76
host=10.30.170.120
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-04-17T03:26:54.643068" level="INFO">${karaf_connection_object} = index=76
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:54.642734" elapsed="0.000371"/>
</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-04-17T03:26:54.643319" elapsed="0.009123"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:54.653093" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:54.654218" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:54.652643" elapsed="0.002020">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:54.661411" elapsed="0.000180"/>
</kw>
<msg time="2026-04-17T03:26:54.661683" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:54.660332" 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-04-17T03:26:54.662847" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:54.663847" elapsed="0.000177"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:54.655784" elapsed="0.008414"/>
</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-04-17T03:26:54.655038" elapsed="0.009282"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:54.630081" elapsed="0.034387">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:54.665123" elapsed="0.000038"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:54.665231" elapsed="0.000030"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:26:54.608096" elapsed="0.057283">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:54.665510" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:54.665554" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:54.602077" elapsed="0.063501"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:54.666070" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:54.665671" elapsed="0.000457"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:54.665648" elapsed="0.000515"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:54.601816" elapsed="0.064380"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:54.601559" elapsed="0.064682"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:54.598395" elapsed="0.067934"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:54.592866" elapsed="0.073633"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:54.592394" elapsed="0.074174"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:54.587923" elapsed="0.078724"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:54.670318" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:54.871709" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:55.274156" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:55.276456" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:54.667205" elapsed="0.614282">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:55.282051" elapsed="0.000067"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:55.282463" elapsed="0.000045"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:55.283043" elapsed="0.000052"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:54.666848" elapsed="0.616464">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:54.587155" elapsed="0.696274">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:54.586459" elapsed="0.697246">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:55.289965" elapsed="0.000416"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:55.289580" elapsed="0.000885"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:55.291990" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:55.291789" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:55.291752" 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-04-17T03:26:55.298625" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:55.298477" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:55.298458" elapsed="0.000264"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:55.299864" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:55.299399" elapsed="0.000496"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:55.300553" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:55.300175" elapsed="0.000415"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:55.300653" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:26:55.300844" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:55.298999" elapsed="0.001879"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:55.308542" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:55.308393" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:55.308366" elapsed="0.000271"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:55.310596" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:55.310377" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:55.310354" elapsed="0.000435"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:55.311438" level="INFO">${karaf_connection_index} = 76</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:55.310970" elapsed="0.000532"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:55.312273" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:55.311990" elapsed="0.000348"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:55.314827" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:55.314319" elapsed="0.001106">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:55.315577" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:55.315675" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:55.312709" elapsed="0.003050"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:55.318391" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:55.317948" elapsed="0.001087">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:55.319185" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:55.319281" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:55.316194" elapsed="0.003146"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:55.321032" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_pmsi_rsvp_te_p2mp_lsp"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:55.320170" elapsed="0.001073">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_pmsi_rsvp_te_p2mp_lsp"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:55.319643" elapsed="0.001710">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_pmsi_rsvp_te_p2mp_lsp"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:55.319620" elapsed="0.001814">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_pmsi_rsvp_te_p2mp_lsp"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:55.321606" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:55.322034" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:55.321810" elapsed="0.000342"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:55.321790" elapsed="0.000422"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:55.322250" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:55.326741" elapsed="0.000161"/>
</kw>
<msg time="2026-04-17T03:26:55.327126" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:55.326048" elapsed="0.001155"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:55.327423" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:55.327644" 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-04-17T03:26:55.325083" 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-04-17T03:26:55.322619" elapsed="0.005458"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:55.309760" elapsed="0.018489">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_pmsi_rsvp_te_p2mp_lsp"</status>
</kw>
<msg time="2026-04-17T03:26:55.328364" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:55.328408" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_pmsi_rsvp_te_p2mp_lsp"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:55.308857" elapsed="0.019575"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:55.328630" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:55.328515" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:55.328494" elapsed="0.000204"/>
</if>
<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-04-17T03:26:55.330419" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:55.330124" elapsed="0.000345"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:55.330096" elapsed="0.000395"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:55.330823" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:55.330992" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:55.330650" elapsed="0.000373"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:55.331534" level="INFO">{1: 76}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:55.331181" elapsed="0.000400"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:55.332085" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:55.331764" elapsed="0.000365"/>
</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-04-17T03:26:55.332700" elapsed="0.000384"/>
</kw>
<msg time="2026-04-17T03:26:55.333331" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:55.333379" level="INFO">${old_connection_index} = 76</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:55.332293" elapsed="0.001129"/>
</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-04-17T03:26:55.335483" elapsed="0.000503"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:55.337229" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:55.337051" elapsed="0.000687">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:55.336331" elapsed="0.001523"/>
</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-04-17T03:26:55.338916" elapsed="0.000128"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:55.338229" elapsed="0.000910"/>
</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-04-17T03:26:55.333760" elapsed="0.005473"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:55.333527" elapsed="0.005758"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:55.333507" elapsed="0.005803"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:55.340696" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:55.340036" elapsed="0.000703"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:55.340904" elapsed="0.000054"/>
</return>
<msg time="2026-04-17T03:26:55.341093" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:55.339547" elapsed="0.001571"/>
</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-04-17T03:26:55.341278" elapsed="0.000706"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:55.342295" level="INFO">index=77
host=10.30.170.120
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-04-17T03:26:55.342400" level="INFO">${karaf_connection_object} = index=77
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:55.342176" elapsed="0.000251"/>
</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-04-17T03:26:55.342640" elapsed="0.010033"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:55.353489" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:55.354724" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:55.352917" elapsed="0.002383">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:55.361661" elapsed="0.000219"/>
</kw>
<msg time="2026-04-17T03:26:55.362048" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:55.360617" elapsed="0.001596"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:55.363283" elapsed="0.000088"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:55.364632" 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-04-17T03:26:55.356604" elapsed="0.008280"/>
</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-04-17T03:26:55.355712" elapsed="0.009343"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:55.329597" elapsed="0.035576">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:55.365794" elapsed="0.000030"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:55.365878" elapsed="0.000029"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:26:55.307908" elapsed="0.058140">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:55.366170" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:55.366217" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:55.301362" elapsed="0.064878"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:55.366633" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:55.366329" elapsed="0.000377"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:55.366307" elapsed="0.000435"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:55.301178" elapsed="0.065600"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:55.300960" elapsed="0.065859"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:55.298075" elapsed="0.068805"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:55.291347" elapsed="0.075609"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:55.290686" elapsed="0.076325"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:55.286154" elapsed="0.080914"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:55.370842" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:55.572643" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:55.975323" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:55.978498" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:55.367520" elapsed="0.615890">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:55.983789" elapsed="0.000041"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:55.984146" elapsed="0.000032"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:55.984532" elapsed="0.000038"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:55.367225" elapsed="0.617500">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:55.284978" elapsed="0.699846">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:55.284253" elapsed="0.700808">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:55.992484" elapsed="0.000327"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:55.992011" elapsed="0.000873"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:55.994103" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:55.993959" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:55.993916" elapsed="0.000266"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:55.999784" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:55.999644" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:55.999619" elapsed="0.000252"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:56.001218" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:56.000726" elapsed="0.000523"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:56.001774" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:56.001446" elapsed="0.000355"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:56.001848" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:26:56.002049" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:56.000261" elapsed="0.001821"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:56.008831" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:56.008696" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:56.008672" elapsed="0.000244"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:56.010592" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:56.010353" elapsed="0.000353"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:56.010330" elapsed="0.000435"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:56.011446" level="INFO">${karaf_connection_index} = 77</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:56.010951" elapsed="0.000574"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:56.012321" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:56.011985" elapsed="0.000406"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:56.014880" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:56.014386" elapsed="0.001228">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:56.015772" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:56.015872" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:56.012715" elapsed="0.003234"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:56.018602" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:56.017994" elapsed="0.001300">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:56.019448" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:56.019544" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:56.016401" elapsed="0.003204"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:56.021459" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_pmsi_rsvp_te_p2mp_lsp"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:56.020519" elapsed="0.001183">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_pmsi_rsvp_te_p2mp_lsp"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:56.019916" elapsed="0.001903">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_pmsi_rsvp_te_p2mp_lsp"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:56.019889" elapsed="0.002015">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_pmsi_rsvp_te_p2mp_lsp"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:56.022102" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:56.022592" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:56.022323" elapsed="0.000391"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:56.022290" elapsed="0.000500"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:56.022836" elapsed="0.000020"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:56.027326" elapsed="0.000220"/>
</kw>
<msg time="2026-04-17T03:26:56.027621" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:56.026469" elapsed="0.001253"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:56.028004" elapsed="0.000027"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:56.028348" 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-04-17T03:26:56.025626" 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-04-17T03:26:56.023434" elapsed="0.005244"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:56.009853" elapsed="0.019001">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_pmsi_rsvp_te_p2mp_lsp"</status>
</kw>
<msg time="2026-04-17T03:26:56.028992" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:56.029045" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_pmsi_rsvp_te_p2mp_lsp"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:56.009120" elapsed="0.019950"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:56.029329" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:56.029170" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:56.029142" elapsed="0.000267"/>
</if>
<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-04-17T03:26:56.030768" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:56.030619" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:56.030588" elapsed="0.000276"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:56.031515" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:56.031740" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:56.031304" elapsed="0.000474"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:56.032509" level="INFO">{1: 77}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:56.032016" elapsed="0.000554"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:56.033086" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:56.032735" elapsed="0.000415"/>
</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-04-17T03:26:56.033789" elapsed="0.000460"/>
</kw>
<msg time="2026-04-17T03:26:56.034543" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:56.034599" level="INFO">${old_connection_index} = 77</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:56.033334" elapsed="0.001288"/>
</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-04-17T03:26:56.037036" elapsed="0.000456"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:56.038751" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:56.038535" elapsed="0.000848">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:56.037842" elapsed="0.001661"/>
</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-04-17T03:26:56.040837" elapsed="0.000149"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:56.039836" elapsed="0.001254"/>
</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-04-17T03:26:56.035197" elapsed="0.005989"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:56.034711" elapsed="0.006529"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:56.034689" elapsed="0.006583"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:56.042696" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:56.042132" elapsed="0.000607"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:56.042922" elapsed="0.000066"/>
</return>
<msg time="2026-04-17T03:26:56.043130" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:56.041606" elapsed="0.001549"/>
</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-04-17T03:26:56.043336" elapsed="0.000879"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:56.044538" level="INFO">index=78
host=10.30.170.120
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-04-17T03:26:56.044644" level="INFO">${karaf_connection_object} = index=78
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:56.044404" elapsed="0.000266"/>
</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-04-17T03:26:56.044825" elapsed="0.009236"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:56.054825" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:56.056057" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:56.054350" elapsed="0.002197">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:56.063116" elapsed="0.000238"/>
</kw>
<msg time="2026-04-17T03:26:56.063476" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:56.062097" elapsed="0.001610"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:56.064984" elapsed="0.000103"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:56.066252" 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-04-17T03:26:56.057667" elapsed="0.008850"/>
</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-04-17T03:26:56.056906" elapsed="0.009851"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:56.029970" elapsed="0.036914">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:56.067555" elapsed="0.000039"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:56.067667" elapsed="0.000031"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:26:56.008231" elapsed="0.059603">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:56.068023" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:56.068091" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:56.002528" elapsed="0.065634"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:56.068673" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:56.068286" elapsed="0.000468"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:56.068256" elapsed="0.000537"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:56.002374" elapsed="0.066456"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:56.002154" elapsed="0.066725"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:55.999144" elapsed="0.069839"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:55.993578" elapsed="0.075476"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:55.993086" elapsed="0.076015"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:55.989082" elapsed="0.080075"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:56.073352" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:56.275268" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:56.678036" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:56.681825" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:56.069805" elapsed="0.615846">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:56.686171" elapsed="0.000055"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:56.686512" elapsed="0.000042"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:56.687044" elapsed="0.000054"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:56.069374" elapsed="0.617953">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:55.985770" elapsed="0.701797">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:55.985300" elapsed="0.702524">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:56.693645" elapsed="0.000254"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:56.693282" elapsed="0.000710"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:56.695333" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:56.695140" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:56.695114" elapsed="0.000302"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:56.700956" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:56.700816" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:56.700794" elapsed="0.000244"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:56.702270" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:56.701747" elapsed="0.000559"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:56.702809" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:56.702490" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:56.702883" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:26:56.703073" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:56.701316" elapsed="0.001782"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:56.709480" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:56.709332" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:56.709312" 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-04-17T03:26:56.711122" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:56.710913" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:56.710896" elapsed="0.000390"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:56.711909" level="INFO">${karaf_connection_index} = 78</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:56.711446" elapsed="0.000546"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:56.712656" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:56.712353" elapsed="0.000365"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:56.715139" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:56.714658" elapsed="0.001332">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:56.716178" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:56.716283" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:56.713076" elapsed="0.003280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:56.719050" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:56.718593" elapsed="0.001072">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:56.719821" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:56.719924" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:56.716862" elapsed="0.003245"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:56.721655" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_pmsi_mldp_p2mp_lsp"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:56.720820" elapsed="0.001130">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_pmsi_mldp_p2mp_lsp"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:56.720421" elapsed="0.001651">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_pmsi_mldp_p2mp_lsp"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:56.720396" elapsed="0.001780">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_pmsi_mldp_p2mp_lsp"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:56.722381" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:56.722802" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:56.722595" elapsed="0.000321"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:56.722576" elapsed="0.000416"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:56.723034" elapsed="0.000019"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:56.727039" elapsed="0.000172"/>
</kw>
<msg time="2026-04-17T03:26:56.727264" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:56.726324" elapsed="0.001008"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:56.727550" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:56.727770" 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-04-17T03:26:56.725527" 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-04-17T03:26:56.723344" elapsed="0.004926"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:56.710465" elapsed="0.018015">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_pmsi_mldp_p2mp_lsp"</status>
</kw>
<msg time="2026-04-17T03:26:56.728596" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:56.728641" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_pmsi_mldp_p2mp_lsp"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:56.709722" elapsed="0.019042"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:56.728991" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:56.728859" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:56.728839" elapsed="0.000220"/>
</if>
<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-04-17T03:26:56.729975" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:56.729852" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:56.729833" elapsed="0.000211"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:56.730380" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:56.730505" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:56.730220" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:56.731047" level="INFO">{1: 78}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:56.730698" elapsed="0.000394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:56.731552" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:56.731251" elapsed="0.000346"/>
</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-04-17T03:26:56.732308" elapsed="0.000401"/>
</kw>
<msg time="2026-04-17T03:26:56.732971" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:56.733029" level="INFO">${old_connection_index} = 78</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:56.731760" elapsed="0.001297"/>
</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-04-17T03:26:56.734843" elapsed="0.000419"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:56.737001" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:56.736735" elapsed="0.001275">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:56.735660" elapsed="0.002560"/>
</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-04-17T03:26:56.739392" elapsed="0.000146"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:56.738640" elapsed="0.001016"/>
</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-04-17T03:26:56.733381" elapsed="0.006399"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:56.733152" elapsed="0.006703"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:56.733129" elapsed="0.006766"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:56.741569" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:56.740801" elapsed="0.000827"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:56.741849" elapsed="0.000054"/>
</return>
<msg time="2026-04-17T03:26:56.742166" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:56.740255" elapsed="0.001948"/>
</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-04-17T03:26:56.742431" elapsed="0.000924"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:56.743767" level="INFO">index=79
host=10.30.170.120
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-04-17T03:26:56.743914" level="INFO">${karaf_connection_object} = index=79
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:56.743590" elapsed="0.000609"/>
</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-04-17T03:26:56.744425" elapsed="0.010625"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:56.755843" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:56.757500" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:56.755362" elapsed="0.002778">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:56.766188" elapsed="0.000235"/>
</kw>
<msg time="2026-04-17T03:26:56.766542" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:56.764623" elapsed="0.002139"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:56.768127" elapsed="0.000096"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:56.769438" 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-04-17T03:26:56.759617" elapsed="0.010077"/>
</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-04-17T03:26:56.758660" elapsed="0.011197"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:56.729543" elapsed="0.040479">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:56.770734" elapsed="0.000039"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:56.770844" 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="FAIL" start="2026-04-17T03:26:56.708962" elapsed="0.062074">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:56.771212" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:56.771279" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:56.703691" elapsed="0.067623"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:56.771831" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:56.771438" elapsed="0.000685"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:56.771407" elapsed="0.000758"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:56.703411" elapsed="0.068796"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:56.703156" elapsed="0.069102"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:56.700360" elapsed="0.071989"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:56.694774" elapsed="0.077662"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:56.694164" elapsed="0.078380"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:56.690023" elapsed="0.082604"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:56.776862" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:56.978842" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:57.383838" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:57.387414" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:56.773283" elapsed="0.616881">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:57.390478" elapsed="0.000035"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:57.390707" elapsed="0.000022"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:57.391020" elapsed="0.000032"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:56.772844" elapsed="0.618367">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:56.689346" elapsed="0.701954">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:56.688333" elapsed="0.703159">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:57.395698" elapsed="0.000252"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:57.395408" elapsed="0.000624"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:57.397297" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:57.397123" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:57.397091" elapsed="0.000307"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:57.402987" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:57.402840" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:57.402819" elapsed="0.000253"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:57.404281" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:57.403818" elapsed="0.000493"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:57.404789" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:57.404480" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:57.404860" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:26:57.405049" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:57.403415" elapsed="0.001659"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:57.411222" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:57.411082" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:57.411043" 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-04-17T03:26:57.413009" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:57.412795" elapsed="0.000385"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:57.412777" elapsed="0.000463"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:57.413850" level="INFO">${karaf_connection_index} = 79</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:57.413402" elapsed="0.000515"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:57.414589" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:57.414307" elapsed="0.000345"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:57.417169" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:57.416677" elapsed="0.001078">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:57.417908" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:57.418053" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:57.414992" elapsed="0.003122"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:57.420608" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:57.420164" elapsed="0.001044">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:57.421359" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:57.421456" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:57.418514" elapsed="0.003003"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:57.423132" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_pmsi_mldp_p2mp_lsp"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:57.422331" elapsed="0.001007">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_pmsi_mldp_p2mp_lsp"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:57.421835" elapsed="0.001612">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_pmsi_mldp_p2mp_lsp"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:57.421809" elapsed="0.001721">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_pmsi_mldp_p2mp_lsp"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:57.423709" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:57.424180" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:57.423917" elapsed="0.000382"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:57.423896" elapsed="0.000464"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:57.424400" elapsed="0.000018"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:57.428391" elapsed="0.000166"/>
</kw>
<msg time="2026-04-17T03:26:57.428614" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:57.427800" elapsed="0.000889"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:57.429116" elapsed="0.000028"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:57.429351" 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-04-17T03:26:57.427008" elapsed="0.002569"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:57.424726" elapsed="0.004939"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:57.412335" elapsed="0.017505">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_pmsi_mldp_p2mp_lsp"</status>
</kw>
<msg time="2026-04-17T03:26:57.429961" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:57.430024" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_pmsi_mldp_p2mp_lsp"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:57.411565" elapsed="0.018484"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:57.430266" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:57.430142" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:57.430117" elapsed="0.000221"/>
</if>
<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-04-17T03:26:57.431704" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:57.431595" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:57.431576" elapsed="0.000198"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:57.432095" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:57.432205" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:57.431939" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:57.432764" level="INFO">{1: 79}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:57.432424" elapsed="0.000385"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:57.433284" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:57.432982" elapsed="0.000347"/>
</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-04-17T03:26:57.433892" elapsed="0.000382"/>
</kw>
<msg time="2026-04-17T03:26:57.434522" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:57.434570" level="INFO">${old_connection_index} = 79</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:57.433492" elapsed="0.001101"/>
</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-04-17T03:26:57.436833" elapsed="0.000400"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:57.438359" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:57.438182" elapsed="0.000684">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:57.437541" elapsed="0.001592"/>
</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-04-17T03:26:57.440082" elapsed="0.000108"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:57.439446" elapsed="0.000837"/>
</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-04-17T03:26:57.434895" elapsed="0.005478"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:57.434670" elapsed="0.005755"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:57.434652" elapsed="0.005801"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:57.441712" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:57.441168" elapsed="0.000586"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:57.441920" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:26:57.442113" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:57.440682" elapsed="0.001455"/>
</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-04-17T03:26:57.442303" elapsed="0.000614"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:57.443359" level="INFO">index=80
host=10.30.170.120
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-04-17T03:26:57.443461" level="INFO">${karaf_connection_object} = index=80
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:57.443234" elapsed="0.000253"/>
</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-04-17T03:26:57.443638" elapsed="0.008936"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:57.453261" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:57.454898" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:57.452798" elapsed="0.002607">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:57.462077" elapsed="0.000238"/>
</kw>
<msg time="2026-04-17T03:26:57.462427" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:57.460753" elapsed="0.001894"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:57.463630" elapsed="0.000072"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:57.464703" elapsed="0.000086"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:57.456451" elapsed="0.008493"/>
</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-04-17T03:26:57.455746" elapsed="0.009358"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:57.431274" elapsed="0.033958">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:57.465892" elapsed="0.000038"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:57.466017" elapsed="0.000029"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:26:57.410597" elapsed="0.055577">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:57.466330" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:57.466388" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:57.405474" elapsed="0.060944"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:57.466899" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:57.466530" elapsed="0.000603"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:57.466503" elapsed="0.000672"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:57.405323" elapsed="0.061887"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:57.405135" elapsed="0.062119"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:57.402347" elapsed="0.064985"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:57.396705" elapsed="0.070700"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:57.396193" elapsed="0.071272"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:57.392922" elapsed="0.074612"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:57.471218" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:57.673082" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:58.080728" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:58.083423" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:57.468164" elapsed="0.620643">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:58.089411" elapsed="0.000060"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:58.089820" elapsed="0.000082"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:58.090617" elapsed="0.000064"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:57.467742" elapsed="0.623204">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:57.392332" elapsed="0.698813">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:57.391819" elapsed="0.699669">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:58.097710" elapsed="0.000235"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:58.097431" elapsed="0.000594"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:58.099119" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:58.098960" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:58.098935" elapsed="0.000262"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:58.104269" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:58.104161" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:58.104143" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:58.105390" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:58.104966" elapsed="0.000453"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:58.105917" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:58.105611" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:58.106006" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:26:58.106174" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:58.104574" elapsed="0.001624"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:58.111966" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:58.111846" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:58.111828" elapsed="0.000225"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:58.113552" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:58.113369" elapsed="0.000351"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:58.113352" elapsed="0.000431"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:58.114554" level="INFO">${karaf_connection_index} = 80</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:58.114024" elapsed="0.000613"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:58.115401" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:58.115107" elapsed="0.000356"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:58.120219" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:58.117530" elapsed="0.003275">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:58.120981" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:58.121083" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:58.115785" elapsed="0.005361"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:58.123718" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:58.123264" elapsed="0.001198">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:58.124610" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:58.124708" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:58.121563" elapsed="0.003205"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:58.126271" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_pmsi_pim_ssm_tree"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:58.125480" elapsed="0.001058">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_pmsi_pim_ssm_tree"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:58.125102" elapsed="0.001549">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_pmsi_pim_ssm_tree"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:58.125077" elapsed="0.001659">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_pmsi_pim_ssm_tree"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:58.126927" elapsed="0.000055"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:58.127557" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:58.127254" elapsed="0.000459"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:58.127219" elapsed="0.000576"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:58.127848" 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-04-17T03:26:58.133096" elapsed="0.000214"/>
</kw>
<msg time="2026-04-17T03:26:58.133378" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:58.132407" elapsed="0.001065"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:58.133768" elapsed="0.000033"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:58.134092" elapsed="0.000031"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:58.131179" elapsed="0.003214"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:58.128379" elapsed="0.006133"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:58.112877" elapsed="0.021956">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_pmsi_pim_ssm_tree"</status>
</kw>
<msg time="2026-04-17T03:26:58.135155" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:58.135215" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_pmsi_pim_ssm_tree"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:58.112211" elapsed="0.023029"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:58.135445" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:58.135329" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:58.135307" elapsed="0.000206"/>
</if>
<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-04-17T03:26:58.136608" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:58.136496" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:58.136473" elapsed="0.000274"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:58.137210" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:58.137320" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:58.136912" elapsed="0.000435"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:58.137848" level="INFO">{1: 80}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:58.137516" elapsed="0.000378"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:58.138367" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:58.138068" elapsed="0.000343"/>
</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-04-17T03:26:58.139046" elapsed="0.000365"/>
</kw>
<msg time="2026-04-17T03:26:58.139654" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:58.139702" level="INFO">${old_connection_index} = 80</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:58.138576" elapsed="0.001149"/>
</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-04-17T03:26:58.141641" elapsed="0.000409"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:58.143478" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:58.143020" elapsed="0.000992">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:58.142363" elapsed="0.001808"/>
</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-04-17T03:26:58.145561" elapsed="0.000150"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:58.144628" elapsed="0.001214"/>
</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-04-17T03:26:58.140051" elapsed="0.006073"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:58.139803" elapsed="0.006400"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:58.139784" elapsed="0.006457"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:58.148011" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:58.147132" elapsed="0.000949"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:58.148288" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:26:58.148461" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:58.146550" elapsed="0.001937"/>
</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-04-17T03:26:58.148650" elapsed="0.000670"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:58.149634" level="INFO">index=81
host=10.30.170.120
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-04-17T03:26:58.149738" level="INFO">${karaf_connection_object} = index=81
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:58.149506" elapsed="0.000259"/>
</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-04-17T03:26:58.149919" elapsed="0.009939"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:58.161100" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:58.162285" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:58.160577" elapsed="0.002196">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:58.168742" elapsed="0.000204"/>
</kw>
<msg time="2026-04-17T03:26:58.169059" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:58.167609" elapsed="0.001618"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:58.170278" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:58.171343" elapsed="0.000070"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:58.163923" elapsed="0.007615"/>
</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-04-17T03:26:58.163165" elapsed="0.008486"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:58.136135" elapsed="0.035617">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:58.172383" elapsed="0.000033"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:58.172473" elapsed="0.000024"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:26:58.111498" elapsed="0.061102">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:58.172726" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:58.172770" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:58.106625" elapsed="0.066168"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:58.173194" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:58.172887" elapsed="0.000362"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:58.172864" elapsed="0.000411"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:58.106470" elapsed="0.066830"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:58.106256" elapsed="0.067080"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:58.103776" elapsed="0.069619"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:58.098641" elapsed="0.074814"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:58.098185" elapsed="0.075316"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:58.094720" elapsed="0.078836"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:58.177371" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:58.379384" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:58.784130" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:58.787778" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:58.174083" elapsed="0.617174">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:58.791624" elapsed="0.000041"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:58.791922" elapsed="0.000034"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:58.792425" elapsed="0.000057"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:58.173716" elapsed="0.619040">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:58.094027" elapsed="0.698842">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:58.092439" elapsed="0.700775">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:58.798393" elapsed="0.000227"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:58.798116" 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-04-17T03:26:58.799988" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:58.799803" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:58.799778" elapsed="0.000340"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:58.805743" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:58.805627" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:58.805608" elapsed="0.000208"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:58.806929" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:58.806508" elapsed="0.000450"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:58.807488" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:58.807170" elapsed="0.000344"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:58.807561" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:26:58.807729" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:58.806083" elapsed="0.001672"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:58.814215" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:58.814103" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:58.814084" 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-04-17T03:26:58.815786" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:58.815597" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:58.815580" elapsed="0.000367"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:58.816536" level="INFO">${karaf_connection_index} = 81</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:58.816118" elapsed="0.000484"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:58.817329" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:58.817045" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:58.819744" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:58.819286" elapsed="0.001057">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:58.820493" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:58.820595" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:58.817702" elapsed="0.002953"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:58.823824" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:58.823238" elapsed="0.001457">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:58.824897" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:58.825229" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:58.821114" elapsed="0.004205"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:58.826995" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_pmsi_pim_ssm_tree"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:58.826224" elapsed="0.000975">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_pmsi_pim_ssm_tree"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:58.825734" elapsed="0.001575">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_pmsi_pim_ssm_tree"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:58.825704" elapsed="0.001684">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_pmsi_pim_ssm_tree"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:58.827560" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:58.828124" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:58.827759" elapsed="0.000484"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:58.827740" elapsed="0.000561"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:58.828338" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:58.832284" elapsed="0.000156"/>
</kw>
<msg time="2026-04-17T03:26:58.832506" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:58.831576" elapsed="0.001017"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:58.832818" elapsed="0.000025"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:58.833058" elapsed="0.000024"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:58.830730" elapsed="0.002643"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:58.828631" elapsed="0.004849"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:58.815153" elapsed="0.018496">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_pmsi_pim_ssm_tree"</status>
</kw>
<msg time="2026-04-17T03:26:58.833761" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:58.833806" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_pmsi_pim_ssm_tree"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:58.814443" elapsed="0.019386"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:58.834040" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:58.833909" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:58.833890" elapsed="0.000226"/>
</if>
<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-04-17T03:26:58.835637" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:58.835481" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:58.835452" elapsed="0.000280"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:58.836302" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:58.836450" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:58.836118" elapsed="0.000369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:58.837177" level="INFO">{1: 81}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:58.836705" elapsed="0.000536"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:58.837940" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:58.837512" elapsed="0.000516"/>
</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-04-17T03:26:58.838791" elapsed="0.000534"/>
</kw>
<msg time="2026-04-17T03:26:58.839668" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:58.839734" level="INFO">${old_connection_index} = 81</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:58.838264" elapsed="0.001504"/>
</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-04-17T03:26:58.842538" elapsed="0.000622"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:58.844768" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:58.844536" elapsed="0.000913">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:58.843590" elapsed="0.002014"/>
</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-04-17T03:26:58.846749" elapsed="0.000105"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:58.846132" elapsed="0.000819"/>
</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-04-17T03:26:58.840410" elapsed="0.006654"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:58.839874" elapsed="0.007242"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:58.839849" elapsed="0.007292"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:58.848332" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:58.847744" elapsed="0.000629"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:58.848534" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:26:58.848694" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:58.847355" elapsed="0.001364"/>
</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-04-17T03:26:58.848879" elapsed="0.000679"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:58.849853" level="INFO">index=82
host=10.30.170.120
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-04-17T03:26:58.850022" level="INFO">${karaf_connection_object} = index=82
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:58.849739" elapsed="0.000317"/>
</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-04-17T03:26:58.850213" elapsed="0.009165"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:58.860268" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:58.861801" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:58.859596" elapsed="0.002668">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:58.868551" elapsed="0.000188"/>
</kw>
<msg time="2026-04-17T03:26:58.868827" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:58.867439" elapsed="0.001568"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:58.869876" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:58.870911" elapsed="0.000099"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:58.863408" elapsed="0.007745"/>
</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-04-17T03:26:58.862659" elapsed="0.008621"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:58.834767" elapsed="0.036612">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:58.871876" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:58.871985" 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="FAIL" start="2026-04-17T03:26:58.813729" elapsed="0.058382">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:58.872229" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:58.872275" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:58.808199" elapsed="0.064102"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:58.872730" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:58.872454" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:58.872432" elapsed="0.000378"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:58.808022" elapsed="0.064812"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:58.807813" elapsed="0.065055"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:58.805190" elapsed="0.067745"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:58.799438" elapsed="0.073577"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:58.798856" elapsed="0.074209"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:58.795489" elapsed="0.077633"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:58.876295" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:59.081388" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:59.486553" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:59.488740" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:58.873573" elapsed="0.617561">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:59.491418" elapsed="0.000033"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:59.491614" elapsed="0.000021"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:26:59.491905" elapsed="0.000032"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:58.873280" elapsed="0.618791">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:58.794710" elapsed="0.697438">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:58.793809" elapsed="0.698516">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:26:59.499856" elapsed="0.000461"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:26:59.499321" elapsed="0.001122"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:59.502356" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:59.502212" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:59.502185" elapsed="0.000248"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:59.508718" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:59.508565" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:59.508536" elapsed="0.000278"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:26:59.510302" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:26:59.509759" elapsed="0.000579"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:26:59.510953" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:26:59.510569" elapsed="0.000428"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:26:59.511044" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:26:59.511221" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:26:59.509178" elapsed="0.002067"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:59.517109" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:59.516977" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:59.516941" elapsed="0.000244"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:26:59.518896" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:59.518644" elapsed="0.000412"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:59.518619" elapsed="0.000498"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:59.519724" level="INFO">${karaf_connection_index} = 82</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:26:59.519281" elapsed="0.000507"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:59.520511" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:26:59.520206" elapsed="0.000380"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:59.523271" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:59.522557" elapsed="0.001441">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:59.524164" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:26:59.524262" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:59.520917" elapsed="0.003406"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:26:59.527134" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:26:59.526561" elapsed="0.001326">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:26:59.528114" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:26:59.528237" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:59.524774" elapsed="0.003539"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:26:59.530556" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_pmsi_pim_sm_tree"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:26:59.529413" elapsed="0.001394">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_pmsi_pim_sm_tree"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:59.528679" elapsed="0.002308">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_pmsi_pim_sm_tree"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:26:59.528650" elapsed="0.002454">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_pmsi_pim_sm_tree"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:59.531356" elapsed="0.000034"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:59.531922" elapsed="0.000091"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:59.531621" elapsed="0.000491"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:26:59.531589" elapsed="0.000605"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:26:59.532252" 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-04-17T03:26:59.537397" elapsed="0.000173"/>
</kw>
<msg time="2026-04-17T03:26:59.537629" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:59.536331" elapsed="0.001374"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:59.537932" elapsed="0.000037"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:59.538169" 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-04-17T03:26:59.535491" elapsed="0.002962"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:26:59.532795" elapsed="0.005754"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:26:59.518167" elapsed="0.020601">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_pmsi_pim_sm_tree"</status>
</kw>
<msg time="2026-04-17T03:26:59.538895" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:59.538951" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_pmsi_pim_sm_tree"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:59.517359" elapsed="0.021723"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:59.539306" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:59.539182" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:59.539157" elapsed="0.000221"/>
</if>
<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-04-17T03:26:59.540427" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:26:59.540320" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:59.540301" elapsed="0.000193"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:59.540806" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:59.540950" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:26:59.540658" elapsed="0.000466"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:59.541714" level="INFO">{1: 82}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:59.541335" elapsed="0.000426"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:26:59.542303" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:26:59.541940" elapsed="0.000423"/>
</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-04-17T03:26:59.543093" elapsed="0.000499"/>
</kw>
<msg time="2026-04-17T03:26:59.543877" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:26:59.543929" level="INFO">${old_connection_index} = 82</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:59.542629" elapsed="0.001324"/>
</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-04-17T03:26:59.546190" elapsed="0.000521"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:26:59.548219" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:26:59.547758" elapsed="0.001026">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:59.547049" elapsed="0.001860"/>
</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-04-17T03:26:59.549935" elapsed="0.000126"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:59.549303" elapsed="0.000853"/>
</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-04-17T03:26:59.544289" elapsed="0.005964"/>
</kw>
<status status="PASS" start="2026-04-17T03:26:59.544049" elapsed="0.006257"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:59.544030" elapsed="0.006305"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:26:59.551647" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:26:59.551103" elapsed="0.000586"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:26:59.551914" elapsed="0.000057"/>
</return>
<msg time="2026-04-17T03:26:59.552105" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:26:59.550572" elapsed="0.001558"/>
</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-04-17T03:26:59.552289" elapsed="0.000641"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:26:59.553353" level="INFO">index=83
host=10.30.170.120
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-04-17T03:26:59.553502" level="INFO">${karaf_connection_object} = index=83
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:26:59.553212" elapsed="0.000321"/>
</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-04-17T03:26:59.553711" elapsed="0.011075"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:26:59.565816" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:26:59.567504" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:26:59.565343" elapsed="0.002737">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:26:59.574546" elapsed="0.000187"/>
</kw>
<msg time="2026-04-17T03:26:59.574822" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:26:59.573418" 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-04-17T03:26:59.575947" elapsed="0.000177"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:59.577025" elapsed="0.000067"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:26:59.569816" elapsed="0.007395"/>
</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-04-17T03:26:59.568737" elapsed="0.008584"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:26:59.540012" elapsed="0.037406">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:59.577903" elapsed="0.000032"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:26:59.578004" elapsed="0.000024"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:26:59.516544" elapsed="0.061584">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:26:59.578252" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:26:59.578297" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:59.511652" elapsed="0.066669"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:26:59.578690" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:26:59.578408" elapsed="0.000339"/>
</branch>
<status status="PASS" start="2026-04-17T03:26:59.578387" elapsed="0.000385"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:26:59.511501" elapsed="0.067295"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:26:59.511307" elapsed="0.067524"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:26:59.508043" elapsed="0.070851"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:26:59.501740" elapsed="0.077236"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:26:59.500866" elapsed="0.078164"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:26:59.494240" elapsed="0.084848"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:26:59.582317" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:59.785351" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:00.194165" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:00.198496" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:26:59.579550" elapsed="0.624969">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:00.205194" elapsed="0.000049"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:00.205485" elapsed="0.000029"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:27:00.205900" elapsed="0.000044"/>
</kw>
<status status="FAIL" start="2026-04-17T03:26:59.579246" elapsed="0.626912">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:26:59.493387" elapsed="0.712882">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:26:59.492711" elapsed="0.713835">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:27:00.212864" elapsed="0.000354"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:27:00.212279" elapsed="0.001004"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:00.214492" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:00.214330" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:00.214291" elapsed="0.000286"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:00.219777" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:00.219639" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:00.219620" elapsed="0.000236"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:00.221038" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:27:00.220517" elapsed="0.000554"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:27:00.221570" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:27:00.221244" elapsed="0.000355"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:27:00.221648" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:27:00.221844" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:27:00.220125" elapsed="0.001748"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:00.227829" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:00.227718" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:00.227699" elapsed="0.000289"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:00.229477" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:00.229296" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:00.229277" elapsed="0.000359"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:00.230231" level="INFO">${karaf_connection_index} = 83</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:27:00.229791" elapsed="0.000503"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:00.230918" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:27:00.230648" elapsed="0.000349"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:00.233345" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:27:00.232842" elapsed="0.001098">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:27:00.234112" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:27:00.234210" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:00.231313" elapsed="0.002955"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:27:00.236606" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:27:00.236190" elapsed="0.000992">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:27:00.237323" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:27:00.237448" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:00.234659" elapsed="0.002848"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:27:00.239003" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_pmsi_pim_sm_tree"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:27:00.238243" elapsed="0.000962">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_pmsi_pim_sm_tree"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:27:00.237801" elapsed="0.001512">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_pmsi_pim_sm_tree"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:27:00.237780" elapsed="0.001612">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_pmsi_pim_sm_tree"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:00.239561" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:00.240169" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:00.239760" elapsed="0.000523"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:27:00.239742" elapsed="0.000598"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:27:00.240377" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:27:00.244403" elapsed="0.000160"/>
</kw>
<msg time="2026-04-17T03:27:00.244616" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:00.243498" elapsed="0.001188"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:00.244907" elapsed="0.000029"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:00.245262" 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-04-17T03:27:00.242685" elapsed="0.002801"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:27:00.240665" elapsed="0.004911"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:27:00.228787" elapsed="0.017010">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_pmsi_pim_sm_tree"</status>
</kw>
<msg time="2026-04-17T03:27:00.245911" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:27:00.245975" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_pmsi_pim_sm_tree"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:00.228148" elapsed="0.017854"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:27:00.246312" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:00.246127" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:00.246063" elapsed="0.000321"/>
</if>
<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-04-17T03:27:00.247535" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:00.247420" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:00.247402" elapsed="0.000210"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:00.247912" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:27:00.248041" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:27:00.247773" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:00.248603" level="INFO">{1: 83}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:00.248251" elapsed="0.000398"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:00.249171" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:00.248803" elapsed="0.000436"/>
</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-04-17T03:27:00.249898" elapsed="0.000562"/>
</kw>
<msg time="2026-04-17T03:27:00.250711" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:27:00.250765" level="INFO">${old_connection_index} = 83</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:00.249452" elapsed="0.001344"/>
</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-04-17T03:27:00.252651" elapsed="0.000403"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:00.254226" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:27:00.254033" elapsed="0.000741">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:00.253359" elapsed="0.001547"/>
</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-04-17T03:27:00.255908" elapsed="0.000129"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:00.255239" elapsed="0.000892"/>
</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-04-17T03:27:00.251127" elapsed="0.005094"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:00.250880" elapsed="0.005391"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:00.250861" elapsed="0.005439"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:00.257548" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:27:00.256943" elapsed="0.000649"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:27:00.257755" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:27:00.257929" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:27:00.256530" elapsed="0.001437"/>
</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-04-17T03:27:00.258151" elapsed="0.000623"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:00.259091" level="INFO">index=84
host=10.30.170.120
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-04-17T03:27:00.259193" level="INFO">${karaf_connection_object} = index=84
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:27:00.258969" elapsed="0.000251"/>
</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-04-17T03:27:00.259371" elapsed="0.010982"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:27:00.271123" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:27:00.272657" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:27:00.270640" elapsed="0.002843">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:27:00.278766" elapsed="0.000162"/>
</kw>
<msg time="2026-04-17T03:27:00.279075" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:00.277824" 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-04-17T03:27:00.280108" elapsed="0.000068"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:00.281058" elapsed="0.000065"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:27:00.274562" elapsed="0.006672"/>
</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-04-17T03:27:00.273836" elapsed="0.007504"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:27:00.247115" elapsed="0.034316">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:00.281876" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:27:00.281972" 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="FAIL" start="2026-04-17T03:27:00.227370" elapsed="0.054725">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:27:00.282213" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:27:00.282258" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:00.222339" elapsed="0.059942"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:00.282628" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:00.282366" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:00.282344" elapsed="0.000367"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:27:00.222186" elapsed="0.060565"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:27:00.221948" elapsed="0.060839"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:27:00.219260" elapsed="0.063587"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:27:00.213989" elapsed="0.068915"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:00.213482" elapsed="0.069482"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:27:00.208734" elapsed="0.074287"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:27:00.286227" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:00.489112" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:00.892916" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:00.895816" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:27:00.283446" elapsed="0.618418">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:00.902275" elapsed="0.000042"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:00.902738" elapsed="0.000046"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:27:00.903306" elapsed="0.000052"/>
</kw>
<status status="FAIL" start="2026-04-17T03:27:00.283172" elapsed="0.620384">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:27:00.207756" elapsed="0.695906">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:27:00.207063" elapsed="0.696844">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:27:00.911026" elapsed="0.000260"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:27:00.910700" elapsed="0.000672"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:00.912760" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:00.912593" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:00.912563" elapsed="0.000297"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:00.920048" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:00.919849" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:00.919819" elapsed="0.000339"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:00.921799" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:27:00.921119" elapsed="0.000721"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:27:00.922498" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:27:00.922086" elapsed="0.000445"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:27:00.922580" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:27:00.922755" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:27:00.920541" elapsed="0.002240"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:00.928708" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:00.928594" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:00.928575" elapsed="0.000205"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:00.930320" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:00.930131" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:00.930113" elapsed="0.000369"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:00.931092" level="INFO">${karaf_connection_index} = 84</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:27:00.930640" elapsed="0.000516"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:00.931787" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:27:00.931510" elapsed="0.000340"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:00.934482" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:27:00.934009" elapsed="0.001282">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:27:00.935447" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:27:00.935544" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:00.932245" elapsed="0.003360"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:27:00.938238" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:27:00.937761" elapsed="0.001049">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:27:00.939045" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:27:00.939148" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:00.936132" elapsed="0.003076"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:27:00.940784" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_pmsi_bidir_pim_tree"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:27:00.939966" elapsed="0.001044">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_pmsi_bidir_pim_tree"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:27:00.939557" elapsed="0.001568">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_pmsi_bidir_pim_tree"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:27:00.939528" elapsed="0.001680">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_pmsi_bidir_pim_tree"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:00.941383" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:00.941803" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:00.941594" elapsed="0.000333"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:27:00.941573" elapsed="0.000497"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:27:00.942122" elapsed="0.000019"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:27:00.946616" elapsed="0.000159"/>
</kw>
<msg time="2026-04-17T03:27:00.946825" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:00.945891" elapsed="0.001002"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:00.947243" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:00.947464" 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-04-17T03:27:00.944859" 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-04-17T03:27:00.942426" elapsed="0.005346"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:27:00.929637" elapsed="0.018359">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_pmsi_bidir_pim_tree"</status>
</kw>
<msg time="2026-04-17T03:27:00.948132" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:27:00.948194" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_pmsi_bidir_pim_tree"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:00.928942" elapsed="0.019288"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:27:00.948474" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:00.948335" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:00.948309" elapsed="0.000251"/>
</if>
<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-04-17T03:27:00.949685" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:00.949549" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:00.949526" elapsed="0.000252"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:00.950203" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:27:00.950435" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:27:00.950022" elapsed="0.000451"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:00.951150" level="INFO">{1: 84}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:00.950691" elapsed="0.000520"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:00.951811" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:00.951415" elapsed="0.000459"/>
</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-04-17T03:27:00.952761" elapsed="0.000479"/>
</kw>
<msg time="2026-04-17T03:27:00.953546" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:27:00.953669" level="INFO">${old_connection_index} = 84</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:00.952244" elapsed="0.001457"/>
</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-04-17T03:27:00.956293" elapsed="0.000505"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:00.958103" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:27:00.957891" elapsed="0.001137">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:00.957223" elapsed="0.001927"/>
</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-04-17T03:27:00.960265" elapsed="0.000113"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:00.959526" elapsed="0.000949"/>
</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-04-17T03:27:00.954122" elapsed="0.006450"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:00.953803" elapsed="0.006822"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:00.953778" elapsed="0.006877"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:00.961990" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:27:00.961357" elapsed="0.000677"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:27:00.962205" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:27:00.962418" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:27:00.960898" elapsed="0.001549"/>
</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-04-17T03:27:00.962642" elapsed="0.000721"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:00.963671" level="INFO">index=85
host=10.30.170.120
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-04-17T03:27:00.963775" level="INFO">${karaf_connection_object} = index=85
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:27:00.963543" elapsed="0.000258"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:27:00.963985" elapsed="0.009708"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:27:00.974532" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:27:00.975945" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:27:00.973973" elapsed="0.002560">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:27:00.984262" elapsed="0.000224"/>
</kw>
<msg time="2026-04-17T03:27:00.984612" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:00.982890" elapsed="0.001949"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:00.985883" elapsed="0.000112"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:00.987137" elapsed="0.000078"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:27:00.977872" elapsed="0.009519"/>
</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-04-17T03:27:00.977019" elapsed="0.010492"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:27:00.949170" elapsed="0.038448">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:00.988174" elapsed="0.000036"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:27:00.988277" 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="FAIL" start="2026-04-17T03:27:00.928236" elapsed="0.060198">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:27:00.988699" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:27:00.988757" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:00.923246" elapsed="0.065543"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:00.989240" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:00.988884" elapsed="0.000421"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:00.988860" elapsed="0.000472"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:27:00.923089" elapsed="0.066268"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:27:00.922845" elapsed="0.066549"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:27:00.919258" elapsed="0.070198"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:27:00.912210" elapsed="0.077311"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:00.911581" elapsed="0.077989"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:27:00.906310" elapsed="0.083319"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:27:00.992936" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:01.198023" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:01.601352" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:01.604567" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:27:00.990166" elapsed="0.618235">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:01.608794" elapsed="0.000056"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:01.609140" elapsed="0.000033"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:27:01.609582" elapsed="0.000040"/>
</kw>
<status status="FAIL" start="2026-04-17T03:27:00.989796" elapsed="0.620007">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:27:00.905302" elapsed="0.704624">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:27:00.904487" elapsed="0.705769">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:27:01.617182" elapsed="0.000407"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:27:01.616650" elapsed="0.001013"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:01.618864" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:01.618708" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:01.618674" 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-04-17T03:27:01.624383" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:01.624240" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:01.624212" elapsed="0.000304"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:01.625753" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:27:01.625242" elapsed="0.000542"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:27:01.626328" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:27:01.625980" elapsed="0.000391"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:27:01.626431" elapsed="0.000048"/>
</return>
<msg time="2026-04-17T03:27:01.626643" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:27:01.624817" elapsed="0.001852"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:01.633240" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:01.633093" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:01.633060" 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-04-17T03:27:01.634919" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:01.634731" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:01.634713" elapsed="0.000399"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:01.635747" level="INFO">${karaf_connection_index} = 85</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:27:01.635273" elapsed="0.000540"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:01.636506" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:27:01.636217" elapsed="0.000358"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:01.639161" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:27:01.638654" elapsed="0.001169">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:27:01.640016" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:27:01.640113" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:01.636974" elapsed="0.003196"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:27:01.642759" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:27:01.642290" elapsed="0.001057">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:27:01.643520" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:27:01.643631" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:01.640606" elapsed="0.003097"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:27:01.645305" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_pmsi_bidir_pim_tree"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:27:01.644461" elapsed="0.001056">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_pmsi_bidir_pim_tree"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:27:01.644089" elapsed="0.001537">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_pmsi_bidir_pim_tree"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:27:01.644065" elapsed="0.001643">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_pmsi_bidir_pim_tree"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:01.645891" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:01.646436" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:01.646136" elapsed="0.000425"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:27:01.646115" elapsed="0.000524"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:27:01.646681" elapsed="0.000018"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:27:01.651029" elapsed="0.000167"/>
</kw>
<msg time="2026-04-17T03:27:01.651247" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:01.650361" elapsed="0.000960"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:01.651536" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:01.651755" 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-04-17T03:27:01.649532" elapsed="0.002612"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:27:01.647059" elapsed="0.005190"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:27:01.634264" elapsed="0.018165">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_pmsi_bidir_pim_tree"</status>
</kw>
<msg time="2026-04-17T03:27:01.652560" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:27:01.652618" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_pmsi_bidir_pim_tree"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:01.633505" elapsed="0.019139"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:27:01.652859" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:01.652735" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:01.652704" elapsed="0.000237"/>
</if>
<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-04-17T03:27:01.654272" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:01.654148" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:01.654130" elapsed="0.000211"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:01.654672" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:27:01.654780" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:27:01.654523" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:01.655355" level="INFO">{1: 85}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:01.655006" elapsed="0.000395"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:01.655948" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:01.655596" elapsed="0.000414"/>
</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-04-17T03:27:01.656606" elapsed="0.000434"/>
</kw>
<msg time="2026-04-17T03:27:01.657377" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:27:01.657428" level="INFO">${old_connection_index} = 85</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:01.656176" elapsed="0.001274"/>
</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-04-17T03:27:01.659579" elapsed="0.000413"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:01.661126" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:27:01.660948" elapsed="0.000687">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:01.660306" elapsed="0.001442"/>
</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-04-17T03:27:01.662707" elapsed="0.000109"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:01.662091" elapsed="0.000817"/>
</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-04-17T03:27:01.657801" elapsed="0.005219"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:01.657560" elapsed="0.005511"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:01.657539" elapsed="0.005594"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:01.664330" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:27:01.663772" elapsed="0.000599"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:27:01.664536" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:27:01.664694" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:27:01.663385" elapsed="0.001333"/>
</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-04-17T03:27:01.664875" elapsed="0.000707"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:01.665901" level="INFO">index=86
host=10.30.170.120
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-04-17T03:27:01.666058" level="INFO">${karaf_connection_object} = index=86
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:27:01.665782" elapsed="0.000303"/>
</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-04-17T03:27:01.666239" elapsed="0.008820"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:27:01.675670" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:27:01.677003" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:27:01.675252" elapsed="0.002163">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:27:01.683444" elapsed="0.000253"/>
</kw>
<msg time="2026-04-17T03:27:01.683809" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:01.681787" elapsed="0.002289"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:01.685310" elapsed="0.000095"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:01.686663" elapsed="0.000095"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:27:01.678676" elapsed="0.008238"/>
</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-04-17T03:27:01.677736" elapsed="0.009357"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:27:01.653735" elapsed="0.033481">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:01.687849" elapsed="0.000041"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:27:01.687983" elapsed="0.000031"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:27:01.632606" elapsed="0.055539">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:27:01.688299" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:27:01.688360" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:01.627141" elapsed="0.061251"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:01.688884" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:01.688506" elapsed="0.000480"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:01.688479" elapsed="0.000545"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:27:01.626945" elapsed="0.062113"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:27:01.626729" elapsed="0.062373"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:27:01.623726" elapsed="0.065463"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:27:01.618357" elapsed="0.070918"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:01.617840" elapsed="0.071504"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:27:01.612700" elapsed="0.076790"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:27:01.693846" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:01.897121" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:02.304919" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:02.307396" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:27:01.690281" elapsed="0.620212">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:02.310857" elapsed="0.000041"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:02.311144" elapsed="0.000031"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:27:02.311524" elapsed="0.000037"/>
</kw>
<status status="FAIL" start="2026-04-17T03:27:01.689704" elapsed="0.622011">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:27:01.611633" elapsed="0.700189">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:27:01.610860" elapsed="0.701208">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:27:02.317893" elapsed="0.000354"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:27:02.317519" elapsed="0.000809"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:02.319771" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:02.319588" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:02.319557" elapsed="0.000343"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:02.327048" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:02.326853" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:02.326821" elapsed="0.000332"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:02.328696" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:27:02.328107" elapsed="0.000629"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:27:02.329408" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:27:02.328982" elapsed="0.000462"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:27:02.329504" elapsed="0.000049"/>
</return>
<msg time="2026-04-17T03:27:02.329827" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:27:02.327536" elapsed="0.002327"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:02.337825" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:02.337650" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:02.337617" elapsed="0.000317"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:02.340115" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:02.339839" elapsed="0.000417"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:02.339813" elapsed="0.000524"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:02.341155" level="INFO">${karaf_connection_index} = 86</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:27:02.340559" elapsed="0.000683"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:02.342111" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:27:02.341720" elapsed="0.000474"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:02.345379" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:27:02.344723" elapsed="0.001457">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:27:02.346381" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:27:02.346517" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:02.342655" elapsed="0.003941"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:27:02.349924" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:27:02.349338" elapsed="0.001396">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:27:02.351017" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:27:02.351159" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:02.347217" elapsed="0.004024"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:27:02.353134" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_pmsi_ingress_replication"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:27:02.352285" elapsed="0.001074">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_pmsi_ingress_replication"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:27:02.351628" elapsed="0.001857">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_pmsi_ingress_replication"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:27:02.351595" elapsed="0.001975">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_pmsi_ingress_replication"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:02.353765" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:02.354198" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:02.353990" elapsed="0.000323"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:27:02.353969" elapsed="0.000401"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:27:02.354413" 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-04-17T03:27:02.359024" elapsed="0.000201"/>
</kw>
<msg time="2026-04-17T03:27:02.359285" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:02.358370" elapsed="0.001000"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:02.359650" elapsed="0.000029"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:02.359939" elapsed="0.000209"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:27:02.357383" 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-04-17T03:27:02.354817" elapsed="0.005625"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:27:02.339247" elapsed="0.021415">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_pmsi_ingress_replication"</status>
</kw>
<msg time="2026-04-17T03:27:02.360777" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:27:02.360821" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_pmsi_ingress_replication"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:02.338200" elapsed="0.022645"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:27:02.361062" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:02.360924" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:02.360905" elapsed="0.000225"/>
</if>
<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-04-17T03:27:02.362370" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:02.362248" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:02.362230" elapsed="0.000222"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:02.362751" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:27:02.362862" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:27:02.362615" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:02.363489" level="INFO">{1: 86}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:02.363147" elapsed="0.000389"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:02.364020" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:02.363699" elapsed="0.000365"/>
</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-04-17T03:27:02.364692" elapsed="0.000477"/>
</kw>
<msg time="2026-04-17T03:27:02.365480" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:27:02.365543" level="INFO">${old_connection_index} = 86</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:02.364241" elapsed="0.001334"/>
</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-04-17T03:27:02.367995" elapsed="0.000548"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:02.369783" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:27:02.369602" elapsed="0.000742">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:02.368947" elapsed="0.001508"/>
</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-04-17T03:27:02.371514" elapsed="0.000108"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:02.370772" elapsed="0.000943"/>
</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-04-17T03:27:02.366115" elapsed="0.005692"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:02.365676" elapsed="0.006182"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:02.365652" elapsed="0.006232"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:02.373135" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:27:02.372545" elapsed="0.000645"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:27:02.373398" elapsed="0.000049"/>
</return>
<msg time="2026-04-17T03:27:02.373619" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:27:02.372144" elapsed="0.001509"/>
</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-04-17T03:27:02.373845" elapsed="0.000778"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:02.374946" level="INFO">index=87
host=10.30.170.120
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-04-17T03:27:02.375067" level="INFO">${karaf_connection_object} = index=87
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:27:02.374815" elapsed="0.000278"/>
</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-04-17T03:27:02.375273" elapsed="0.009906"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:27:02.386365" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:27:02.387820" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:27:02.385533" elapsed="0.002747">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:27:02.393788" elapsed="0.000198"/>
</kw>
<msg time="2026-04-17T03:27:02.394066" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:02.392907" elapsed="0.001310"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:02.395091" elapsed="0.000067"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:02.396071" elapsed="0.000066"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:27:02.389334" elapsed="0.006917"/>
</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-04-17T03:27:02.388655" elapsed="0.007702"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:27:02.361804" elapsed="0.034642">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:02.396893" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:27:02.397000" elapsed="0.000024"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:27:02.337092" elapsed="0.060026">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:27:02.397231" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:27:02.397275" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:02.330486" elapsed="0.066815"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:02.397648" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:02.397387" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:02.397367" elapsed="0.000360"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:27:02.330219" elapsed="0.067532"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:27:02.329944" elapsed="0.067841"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:27:02.326230" elapsed="0.071613"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:27:02.319176" elapsed="0.078723"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:02.318542" elapsed="0.079420"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:27:02.314424" elapsed="0.083596"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:27:02.401121" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:02.604563" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:03.009039" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:03.011696" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:27:02.398445" elapsed="0.617427">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:03.016376" elapsed="0.000054"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:03.016728" elapsed="0.000037"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:27:03.017249" elapsed="0.000047"/>
</kw>
<status status="FAIL" start="2026-04-17T03:27:02.398171" elapsed="0.619517">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:27:02.313279" elapsed="0.704634">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:27:02.312546" elapsed="0.705682">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:27:03.027543" elapsed="0.000304"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:27:03.027174" 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-04-17T03:27:03.029200" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:03.029059" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:03.029034" elapsed="0.000242"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:03.034548" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:03.034423" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:03.034403" elapsed="0.000215"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:03.035735" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:27:03.035323" elapsed="0.000441"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:27:03.036260" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:27:03.035933" elapsed="0.000362"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:27:03.036354" elapsed="0.000048"/>
</return>
<msg time="2026-04-17T03:27:03.036545" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:27:03.034901" elapsed="0.001670"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:03.042439" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:03.042264" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:03.042243" elapsed="0.000285"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:03.044163" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:03.043910" elapsed="0.000359"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:03.043884" elapsed="0.000449"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:03.045045" level="INFO">${karaf_connection_index} = 87</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:27:03.044493" elapsed="0.000616"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:03.045784" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:27:03.045468" elapsed="0.000380"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:03.048403" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:27:03.047935" elapsed="0.001071">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:27:03.049163" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:27:03.049298" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:03.046289" elapsed="0.003083"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:27:03.052032" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:27:03.051562" elapsed="0.001121">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:27:03.052834" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:27:03.052935" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:03.049775" elapsed="0.003345"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:27:03.054662" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_pmsi_ingress_replication"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:27:03.053815" elapsed="0.001064">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_pmsi_ingress_replication"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:27:03.053431" elapsed="0.001613">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_pmsi_ingress_replication"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:27:03.053406" elapsed="0.001734">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_pmsi_ingress_replication"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:03.055323" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:03.055738" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:03.055528" elapsed="0.000325"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:27:03.055509" elapsed="0.000406"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:27:03.055976" elapsed="0.000021"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:27:03.060273" elapsed="0.000191"/>
</kw>
<msg time="2026-04-17T03:27:03.060530" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:03.059700" elapsed="0.000920"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:03.060906" elapsed="0.000034"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:03.061541" 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-04-17T03:27:03.058871" 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-04-17T03:27:03.056331" elapsed="0.005566"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:27:03.043452" elapsed="0.018641">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_pmsi_ingress_replication"</status>
</kw>
<msg time="2026-04-17T03:27:03.062215" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:27:03.062259" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_pmsi_ingress_replication"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:03.042738" elapsed="0.019546"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:27:03.062507" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:03.062374" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:03.062351" elapsed="0.000229"/>
</if>
<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-04-17T03:27:03.063861" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:03.063743" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:03.063722" elapsed="0.000213"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:03.064273" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:27:03.064388" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:27:03.064125" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:03.065023" level="INFO">{1: 87}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:03.064633" elapsed="0.000442"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:03.065618" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:03.065285" elapsed="0.000379"/>
</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-04-17T03:27:03.066504" elapsed="0.000420"/>
</kw>
<msg time="2026-04-17T03:27:03.067197" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:27:03.067246" level="INFO">${old_connection_index} = 87</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:03.065833" elapsed="0.001441"/>
</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-04-17T03:27:03.069172" elapsed="0.000397"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:03.070843" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:27:03.070655" elapsed="0.000922">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:03.069921" elapsed="0.001776"/>
</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-04-17T03:27:03.072687" elapsed="0.000110"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:03.072040" elapsed="0.000855"/>
</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-04-17T03:27:03.067614" elapsed="0.005403"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:03.067353" elapsed="0.005718"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:03.067334" elapsed="0.005769"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:03.074389" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:27:03.073798" elapsed="0.000636"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:27:03.074624" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:27:03.074806" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:27:03.073351" elapsed="0.001480"/>
</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-04-17T03:27:03.075037" elapsed="0.000845"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:03.076480" level="INFO">index=88
host=10.30.170.120
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-04-17T03:27:03.076611" level="INFO">${karaf_connection_object} = index=88
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:27:03.076322" elapsed="0.000317"/>
</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-04-17T03:27:03.076796" elapsed="0.009703"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:27:03.087286" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:27:03.088872" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:27:03.086777" elapsed="0.002585">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:27:03.096019" elapsed="0.000202"/>
</kw>
<msg time="2026-04-17T03:27:03.096325" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:03.094821" elapsed="0.001670"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:03.097412" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:03.098375" elapsed="0.000069"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:27:03.090537" elapsed="0.008037"/>
</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-04-17T03:27:03.089766" elapsed="0.008922"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:27:03.063140" elapsed="0.035647">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:03.099479" elapsed="0.000037"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:27:03.099594" elapsed="0.000062"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:27:03.041880" elapsed="0.057885">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:27:03.099887" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:27:03.099933" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:03.036980" elapsed="0.062994"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:03.100380" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:03.100067" elapsed="0.000375"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:03.100045" elapsed="0.000444"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:27:03.036812" elapsed="0.063709"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:27:03.036630" elapsed="0.063929"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:27:03.033939" elapsed="0.066683"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:27:03.028713" elapsed="0.071972"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:03.028166" elapsed="0.072569"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:27:03.023801" elapsed="0.076991"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:27:03.104613" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:03.309832" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:03.714090" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:03.716359" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:27:03.101397" elapsed="0.619932">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:03.721699" elapsed="0.000043"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:03.721993" elapsed="0.000032"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:27:03.722461" elapsed="0.000052"/>
</kw>
<status status="FAIL" start="2026-04-17T03:27:03.101087" elapsed="0.621596">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:27:03.019716" elapsed="0.703075">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:27:03.018821" elapsed="0.704404">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:27:03.729519" elapsed="0.000332"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:27:03.729221" elapsed="0.000712"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:03.731371" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:03.731185" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:03.731151" elapsed="0.000329"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:03.738217" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:03.738088" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:03.738066" elapsed="0.000239"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:03.739631" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:27:03.739143" elapsed="0.000521"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:27:03.740246" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:27:03.739836" elapsed="0.000446"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:27:03.740344" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:27:03.740568" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:27:03.738651" elapsed="0.001953"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:03.748578" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:03.748378" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:03.748347" elapsed="0.000370"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:03.751012" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:03.750738" elapsed="0.000415"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:03.750712" elapsed="0.000524"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:03.752079" level="INFO">${karaf_connection_index} = 88</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:27:03.751455" elapsed="0.000716"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:03.753124" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:27:03.752674" elapsed="0.000535"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:03.756308" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:27:03.755679" elapsed="0.001761">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:27:03.757595" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:27:03.757695" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:03.753639" elapsed="0.004139"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:27:03.760397" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:27:03.759909" elapsed="0.001078">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:27:03.761184" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:27:03.761287" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:03.758214" elapsed="0.003134"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:27:03.763130" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_pmsi_mldp_mp2mp_lsp"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:27:03.762085" elapsed="0.001253">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_pmsi_mldp_mp2mp_lsp"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:27:03.761686" elapsed="0.001839">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_pmsi_mldp_mp2mp_lsp"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:27:03.761660" elapsed="0.001950">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_pmsi_mldp_mp2mp_lsp"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:03.763788" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:03.764222" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:03.764011" elapsed="0.000327"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:27:03.763991" elapsed="0.000405"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:27:03.764438" elapsed="0.000020"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:27:03.768550" elapsed="0.000179"/>
</kw>
<msg time="2026-04-17T03:27:03.768783" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:03.767698" elapsed="0.001157"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:03.769095" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:03.769364" 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-04-17T03:27:03.766862" elapsed="0.002735"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:27:03.764763" elapsed="0.004922"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:27:03.750120" elapsed="0.019736">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_pmsi_mldp_mp2mp_lsp"</status>
</kw>
<msg time="2026-04-17T03:27:03.769986" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:27:03.770032" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Odl_To_Play_pmsi_mldp_mp2mp_lsp"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:03.749041" elapsed="0.021016"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:27:03.770258" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:03.770142" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:03.770120" elapsed="0.000205"/>
</if>
<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-04-17T03:27:03.771259" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:03.771152" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:03.771133" elapsed="0.000193"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:03.771617" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:27:03.771727" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:27:03.771483" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:03.772300" level="INFO">{1: 88}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:03.771961" elapsed="0.000393"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:03.772868" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:03.772538" elapsed="0.000395"/>
</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-04-17T03:27:03.773895" elapsed="0.000385"/>
</kw>
<msg time="2026-04-17T03:27:03.774631" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:27:03.774682" level="INFO">${old_connection_index} = 88</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:03.773469" elapsed="0.001236"/>
</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-04-17T03:27:03.776583" elapsed="0.000436"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:03.778252" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:27:03.778054" elapsed="0.001174">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:03.777333" elapsed="0.002014"/>
</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-04-17T03:27:03.780401" elapsed="0.000111"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:03.779731" elapsed="0.000876"/>
</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-04-17T03:27:03.775046" elapsed="0.005657"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:03.774788" elapsed="0.005968"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:03.774766" elapsed="0.006020"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:03.782245" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:27:03.781629" elapsed="0.000673"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:27:03.782490" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:27:03.782667" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:27:03.781164" elapsed="0.001528"/>
</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-04-17T03:27:03.782851" elapsed="0.000648"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:03.783805" level="INFO">index=89
host=10.30.170.120
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-04-17T03:27:03.783906" level="INFO">${karaf_connection_object} = index=89
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:27:03.783679" elapsed="0.000258"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:27:03.784102" elapsed="0.008689"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:27:03.793548" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:27:03.795068" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:27:03.793046" elapsed="0.002651">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:27:03.801187" elapsed="0.000162"/>
</kw>
<msg time="2026-04-17T03:27:03.801424" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:03.800222" elapsed="0.001353"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:03.802490" elapsed="0.000070"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:03.803473" elapsed="0.000071"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:27:03.797045" elapsed="0.006616"/>
</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-04-17T03:27:03.796395" elapsed="0.007375"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:27:03.770817" elapsed="0.033044">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:03.804344" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:27:03.804423" 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="FAIL" start="2026-04-17T03:27:03.747787" elapsed="0.056755">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:27:03.804658" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:27:03.804704" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:03.741220" elapsed="0.063507"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:03.805101" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:03.804813" elapsed="0.000345"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:03.804792" elapsed="0.000448"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:27:03.741012" elapsed="0.064258"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:27:03.740680" elapsed="0.064625"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:27:03.737622" elapsed="0.067745"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:27:03.730743" elapsed="0.074685"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:03.730115" elapsed="0.075361"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:27:03.725492" elapsed="0.080043"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:27:03.808903" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:04.010860" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:04.413893" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:04.417387" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:27:03.806084" elapsed="0.616737">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:04.423403" elapsed="0.000062"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:04.423842" elapsed="0.000051"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:27:04.424491" elapsed="0.000060"/>
</kw>
<status status="FAIL" start="2026-04-17T03:27:03.805695" elapsed="0.619120">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:27:03.724693" elapsed="0.700320">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:27:03.723645" elapsed="0.701741">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:27:04.429844" elapsed="0.000262"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:27:04.429575" 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-04-17T03:27:04.431231" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:04.431097" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:04.431071" 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-04-17T03:27:04.436468" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:04.436354" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:04.436336" elapsed="0.000264"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:04.437662" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:27:04.437259" elapsed="0.000430"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:27:04.438219" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:27:04.437858" elapsed="0.000388"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:27:04.438292" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:27:04.438452" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:27:04.436844" elapsed="0.001633"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:04.444221" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:04.444111" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:04.444093" 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-04-17T03:27:04.446031" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:04.445821" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:04.445803" elapsed="0.000390"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:04.446805" level="INFO">${karaf_connection_index} = 89</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:27:04.446385" elapsed="0.000481"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:04.447506" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:27:04.447236" elapsed="0.000329"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:04.449863" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:27:04.449422" elapsed="0.001058">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:27:04.450625" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:27:04.450721" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:04.447870" elapsed="0.002910"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:27:04.453185" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:27:04.452748" elapsed="0.000987">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:27:04.453877" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:27:04.453992" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:04.451218" elapsed="0.002834"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:27:04.455556" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_pmsi_mldp_mp2mp_lsp"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:27:04.454724" elapsed="0.001029">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_pmsi_mldp_mp2mp_lsp"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:27:04.454347" elapsed="0.001512">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_pmsi_mldp_mp2mp_lsp"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:27:04.454325" elapsed="0.001616">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_pmsi_mldp_mp2mp_lsp"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:04.456124" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:04.456522" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:04.456320" elapsed="0.000314"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:27:04.456301" elapsed="0.000390"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:27:04.456728" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:27:04.460383" elapsed="0.000148"/>
</kw>
<msg time="2026-04-17T03:27:04.460579" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:04.459888" elapsed="0.000755"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:04.460902" elapsed="0.000027"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:04.461153" 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-04-17T03:27:04.459152" elapsed="0.002223"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:27:04.457032" elapsed="0.004433"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:27:04.445242" elapsed="0.016441">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_pmsi_mldp_mp2mp_lsp"</status>
</kw>
<msg time="2026-04-17T03:27:04.461797" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:27:04.461840" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Play_To_Odl_pmsi_mldp_mp2mp_lsp"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:04.444589" elapsed="0.017275"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:27:04.462189" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:04.462068" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:04.461923" elapsed="0.000333"/>
</if>
<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-04-17T03:27:04.463543" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:04.463420" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:04.463397" elapsed="0.000218"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:04.463906" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:27:04.464042" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:27:04.463778" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:04.464549" level="INFO">{1: 89}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:04.464229" elapsed="0.000365"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:04.465084" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:04.464750" elapsed="0.000379"/>
</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-04-17T03:27:04.465673" elapsed="0.000382"/>
</kw>
<msg time="2026-04-17T03:27:04.466303" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:27:04.466351" level="INFO">${old_connection_index} = 89</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:04.465290" elapsed="0.001084"/>
</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-04-17T03:27:04.468407" elapsed="0.000374"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:04.469940" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:27:04.469768" elapsed="0.000642">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:04.469121" elapsed="0.001402"/>
</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-04-17T03:27:04.471562" elapsed="0.000104"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:04.470863" elapsed="0.000904"/>
</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-04-17T03:27:04.466754" elapsed="0.005105"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:04.466451" elapsed="0.005458"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:04.466433" elapsed="0.005505"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:04.473250" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:27:04.472610" elapsed="0.000682"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:27:04.473455" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:27:04.473653" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:27:04.472164" elapsed="0.001516"/>
</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-04-17T03:27:04.473884" elapsed="0.000689"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:04.475002" level="INFO">index=90
host=10.30.170.120
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-04-17T03:27:04.475174" level="INFO">${karaf_connection_object} = index=90
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:27:04.474747" elapsed="0.000454"/>
</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-04-17T03:27:04.475410" elapsed="0.010225"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:27:04.486351" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:27:04.487893" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:27:04.485890" elapsed="0.002560">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:27:04.495125" elapsed="0.000286"/>
</kw>
<msg time="2026-04-17T03:27:04.495547" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:04.494004" elapsed="0.001781"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:04.496922" elapsed="0.000122"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:04.497933" elapsed="0.000089"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:27:04.489759" elapsed="0.008444"/>
</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-04-17T03:27:04.488902" elapsed="0.009434"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:27:04.463101" elapsed="0.035541">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:04.499182" elapsed="0.000069"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:27:04.499311" 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="FAIL" start="2026-04-17T03:27:04.443749" elapsed="0.055736">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:27:04.499624" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:27:04.499682" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:04.438858" elapsed="0.060850"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:04.500176" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:04.499822" elapsed="0.000410"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:04.499780" elapsed="0.000479"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:27:04.438712" elapsed="0.061573"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:27:04.438534" elapsed="0.061787"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:27:04.435981" elapsed="0.064401"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:27:04.430765" elapsed="0.069676"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:04.430315" elapsed="0.070173"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:27:04.427327" elapsed="0.073220"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:27:04.503992" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:04.707186" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:05.126729" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:05.128828" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_CONF_URL}?content=config</arg>
<arg>expected_status=anything</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:27:04.501253" elapsed="0.630875">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:05.132497" elapsed="0.000042"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<var>${resp}</var>
<arg>${CONFIG_SESSION}</arg>
<arg>url=${EVPN_FAMILY_LOC_RIB}</arg>
<arg>headers=${HEADERS}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:05.132767" elapsed="0.000029"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<arg>${EMPTY_ROUTES}</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-04-17T03:27:05.133176" elapsed="0.000036"/>
</kw>
<status status="FAIL" start="2026-04-17T03:27:04.500731" elapsed="0.632631">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:27:04.426757" elapsed="0.706896">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:27:04.426147" elapsed="0.707719">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:27:05.139197" elapsed="0.000315"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:27:05.138793" elapsed="0.000775"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:05.140649" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:05.140520" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:05.140496" elapsed="0.000228"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:05.147891" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:05.147778" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:05.147759" elapsed="0.000222"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:05.149098" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:27:05.148660" elapsed="0.000465"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:27:05.149606" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:27:05.149290" elapsed="0.000343"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:27:05.149679" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:27:05.149869" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:27:05.148230" elapsed="0.001675"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:05.155713" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:05.155594" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:05.155575" elapsed="0.000206"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:05.156994" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:05.156859" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:05.156842" elapsed="0.000279"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:05.157585" level="INFO">${karaf_connection_index} = 90</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:27:05.157276" elapsed="0.000337"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:05.158023" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:27:05.157778" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:05.174744" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:27:05.158555" elapsed="0.016918">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:27:05.175671" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:27:05.175717" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:05.158213" elapsed="0.017527"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:27:05.176560" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:27:05.176316" elapsed="0.000925">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:27:05.177428" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:27:05.177479" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:05.175933" elapsed="0.001577"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:27:05.178469" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Kill_Talking_BGP_Speaker"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:27:05.177828" elapsed="0.000721">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Kill_Talking_BGP_Speaker"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:27:05.177597" elapsed="0.001041">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Kill_Talking_BGP_Speaker"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:27:05.177576" elapsed="0.001101">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Kill_Talking_BGP_Speaker"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:05.178848" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:05.179177" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:05.178957" elapsed="0.000284"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:27:05.178920" elapsed="0.000347"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:27:05.179302" elapsed="0.000018"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:27:05.182159" elapsed="0.000168"/>
</kw>
<msg time="2026-04-17T03:27:05.182399" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:05.180913" elapsed="0.001630"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:05.182822" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:05.183271" 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-04-17T03:27:05.180246" elapsed="0.003215"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:27:05.179636" elapsed="0.003891"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:27:05.156559" elapsed="0.027055">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Kill_Talking_BGP_Speaker"</status>
</kw>
<msg time="2026-04-17T03:27:05.183724" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:27:05.183769" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Kill_Talking_BGP_Speaker"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:05.155940" elapsed="0.027853"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:27:05.184011" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:05.183874" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:05.183854" elapsed="0.000227"/>
</if>
<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-04-17T03:27:05.184938" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:05.184823" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:05.184804" elapsed="0.000277"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:05.185378" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:27:05.185496" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:27:05.185243" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:05.186033" level="INFO">{1: 90}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:05.185729" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:05.186493" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:05.186240" elapsed="0.000298"/>
</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-04-17T03:27:05.187232" elapsed="0.000294"/>
</kw>
<msg time="2026-04-17T03:27:05.187627" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:27:05.187672" level="INFO">${old_connection_index} = 90</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:05.186703" elapsed="0.000991"/>
</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-04-17T03:27:05.188534" elapsed="0.000197"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:05.190232" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:27:05.189494" elapsed="0.001892">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:05.188918" elapsed="0.002574"/>
</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-04-17T03:27:05.192187" elapsed="0.000295"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:05.191680" elapsed="0.000891"/>
</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-04-17T03:27:05.188011" elapsed="0.004613"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:05.187769" elapsed="0.004910"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:05.187751" elapsed="0.004957"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:05.193718" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:27:05.193347" elapsed="0.000400"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:27:05.193798" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:27:05.193983" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:27:05.192970" elapsed="0.001039"/>
</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-04-17T03:27:05.194175" elapsed="0.000454"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:05.194958" level="INFO">index=91
host=10.30.170.120
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-04-17T03:27:05.195071" level="INFO">${karaf_connection_object} = index=91
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:27:05.194811" elapsed="0.000289"/>
</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-04-17T03:27:05.195269" elapsed="0.002857"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:27:05.198597" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:27:05.199870" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:27:05.198315" elapsed="0.002009">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:27:05.216182" elapsed="0.000421"/>
</kw>
<msg time="2026-04-17T03:27:05.216706" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:05.214370" elapsed="0.002494"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:05.217059" elapsed="0.000025"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:05.217310" elapsed="0.000023"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:27:05.201339" elapsed="0.016060"/>
</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-04-17T03:27:05.200675" elapsed="0.016774"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:27:05.184509" elapsed="0.033030">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:05.217932" elapsed="0.000042"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:27:05.218029" 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="FAIL" start="2026-04-17T03:27:05.155250" elapsed="0.062895">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:27:05.218263" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:27:05.218310" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:05.150341" elapsed="0.067995"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:05.218709" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:05.218423" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:05.218401" elapsed="0.000391"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:27:05.150170" elapsed="0.068648"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:27:05.149980" elapsed="0.068872"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:27:05.147378" elapsed="0.071532"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:27:05.140206" elapsed="0.078784"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:05.139725" elapsed="0.079313"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:27:05.135148" elapsed="0.083946"/>
</kw>
<kw name="Kill_BGP_Speaker" owner="BGPSpeaker">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:27:05.220534" 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-04-17T03:27:05.220193" elapsed="0.000370"/>
</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-04-17T03:27:05.220725" elapsed="0.000340"/>
</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-04-17T03:27:05.219757" elapsed="0.001373"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:27:05.236628" level="INFO">^C
[?2004h[jenkins@releng-26932-188-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-04-17T03:27:05.221682" elapsed="0.015012"/>
</kw>
<msg time="2026-04-17T03:27:05.236795" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:27:05.236839" level="INFO">${message} = ^C
[?2004h[jenkins@releng-26932-188-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${status}</var>
<var>${message}</var>
<arg>SSHLibrary.Read_Until_Prompt</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:05.221310" elapsed="0.015554"/>
</kw>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:05.237529" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-04-17T03:27:05.249603" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:27:05.249758" level="INFO">${output_log} = 2026-04-17 03:26:08,453 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:26:08,453 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.238
2026-04-17 03:26:08,453 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-04-17T03:27:05.237383" elapsed="0.012413"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:05.250491" level="INFO">2026-04-17 03:26:08,453 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:26:08,453 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.238
2026-04-17 03:26:08,453 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-04-17 03:26:08,453 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.120
2026-04-17 03:26:08,454 DEBUG BGP-Thread-1 (job): Remote port: 1790
Exception in thread Thread-1 (job):
Traceback (most recent call last):
  File "/usr/lib/python3.10/threading.py", line 1016, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.10/threading.py", line 953, in run
    self._target(*self._args, **self._kwargs)
  File "/home/jenkins/play.py", line 2406, in job
    bgp_socket = establish_connection(arguments)
  File "/home/jenkins/play.py", line 284, in establish_connection
    talking_socket.connect((str(arguments.peerip), arguments.peerport))
ConnectionRefusedError: [Errno 111] Connection refused
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-04-17T03:27:05.250081" elapsed="0.000568"/>
</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-04-17T03:27:05.237090" elapsed="0.013643"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<status status="PASS" start="2026-04-17T03:27:05.251038" elapsed="0.000049"/>
</return>
<status status="PASS" start="2026-04-17T03:27:05.250834" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:05.250803" elapsed="0.000364"/>
</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-04-17T03:27:05.251383" elapsed="0.000034"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was not seen within timeout period.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:05.251621" elapsed="0.000028"/>
</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-04-17T03:27:05.219386" elapsed="0.032342"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:05.263675" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-04-17T03:27:05.297202" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:27:05.297576" level="INFO">${output_log} = 2026-04-17 03:26:08,453 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:26:08,453 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.238
2026-04-17 03:26:08,453 DEBUG BGP-Thr...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-17T03:27:05.263527" elapsed="0.034142"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:05.299338" level="INFO">2026-04-17 03:26:08,453 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:26:08,453 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.238
2026-04-17 03:26:08,453 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-04-17 03:26:08,453 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.120
2026-04-17 03:26:08,454 DEBUG BGP-Thread-1 (job): Remote port: 1790
Exception in thread Thread-1 (job):
Traceback (most recent call last):
  File "/usr/lib/python3.10/threading.py", line 1016, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.10/threading.py", line 953, in run
    self._target(*self._args, **self._kwargs)
  File "/home/jenkins/play.py", line 2406, in job
    bgp_socket = establish_connection(arguments)
  File "/home/jenkins/play.py", line 284, in establish_connection
    talking_socket.connect((str(arguments.peerip), arguments.peerport))
ConnectionRefusedError: [Errno 111] Connection refused
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-04-17T03:27:05.298377" elapsed="0.001163"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-04-17T03:27:05.301170" 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-04-17T03:27:05.300124" elapsed="0.001209"/>
</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-04-17T03:27:05.263154" elapsed="0.038342"/>
</kw>
<doc>Abort the Python speaker</doc>
<status status="PASS" start="2026-04-17T03:27:05.134414" elapsed="0.167403"/>
</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-04-17T03:27:05.306963" elapsed="0.000227"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:27:05.306664" 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-04-17T03:27:05.308401" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:05.308258" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:05.308234" elapsed="0.000243"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:05.313750" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:05.313633" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:05.313609" elapsed="0.000212"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:05.314909" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:27:05.314483" elapsed="0.000471"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:27:05.315434" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:27:05.315125" elapsed="0.000336"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:27:05.315507" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:27:05.315676" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:27:05.314084" elapsed="0.001617"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:05.321774" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:05.321658" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:05.321638" 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-04-17T03:27:05.323256" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:05.323144" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:05.323125" elapsed="0.000202"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:05.323821" level="INFO">${karaf_connection_index} = 91</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:27:05.323480" elapsed="0.000370"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:05.324269" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:27:05.324039" elapsed="0.000257"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:05.325128" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:27:05.324815" elapsed="0.001072">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:27:05.326155" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:27:05.326206" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:05.324461" elapsed="0.001771"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:27:05.327072" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:27:05.326800" elapsed="0.000938">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:27:05.327933" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:27:05.328002" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:05.326443" elapsed="0.001584"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:27:05.329015" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Delete_Bgp_Peer_Configuration"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:27:05.328362" elapsed="0.000720">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Delete_Bgp_Peer_Configuration"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:27:05.328119" elapsed="0.001036">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Delete_Bgp_Peer_Configuration"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:27:05.328092" elapsed="0.001098">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Delete_Bgp_Peer_Configuration"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:05.329364" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:05.329647" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:05.329453" elapsed="0.000250"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:27:05.329435" elapsed="0.000293"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:27:05.329762" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:27:05.332473" elapsed="0.000158"/>
</kw>
<msg time="2026-04-17T03:27:05.332698" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:05.331325" 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-04-17T03:27:05.333138" elapsed="0.000080"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:05.333492" 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-04-17T03:27:05.330665" elapsed="0.003045"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:27:05.330076" elapsed="0.003705"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:27:05.322795" elapsed="0.011090">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Delete_Bgp_Peer_Configuration"</status>
</kw>
<msg time="2026-04-17T03:27:05.334019" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:27:05.334067" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Delete_Bgp_Peer_Configuration"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:05.322084" elapsed="0.012008"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:27:05.334333" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:05.334173" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:05.334154" elapsed="0.000259"/>
</if>
<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-04-17T03:27:05.335535" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:05.335418" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:05.335396" elapsed="0.000213"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:05.335904" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:27:05.336066" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:27:05.335772" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:05.336610" level="INFO">{1: 91}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:05.336310" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:05.337153" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:05.336826" elapsed="0.000373"/>
</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-04-17T03:27:05.337798" elapsed="0.000301"/>
</kw>
<msg time="2026-04-17T03:27:05.338203" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:27:05.338251" level="INFO">${old_connection_index} = 91</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:05.337368" elapsed="0.000907"/>
</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-04-17T03:27:05.339238" elapsed="0.000205"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:05.340606" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:27:05.340166" elapsed="0.001403">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:05.339622" elapsed="0.002054"/>
</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-04-17T03:27:05.342423" elapsed="0.000291"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:05.341896" elapsed="0.000906"/>
</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-04-17T03:27:05.338604" elapsed="0.004249"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:05.338352" elapsed="0.004555"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:05.338333" elapsed="0.004662"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:05.343986" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:27:05.343633" elapsed="0.000382"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:27:05.344065" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:27:05.344228" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:27:05.343276" elapsed="0.000977"/>
</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-04-17T03:27:05.344415" elapsed="0.000433"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:05.345184" level="INFO">index=92
host=10.30.170.120
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-04-17T03:27:05.345289" level="INFO">${karaf_connection_object} = index=92
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:27:05.345062" elapsed="0.000254"/>
</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-04-17T03:27:05.345470" elapsed="0.002465"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:27:05.348411" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:27:05.349521" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:27:05.348122" elapsed="0.001905">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:27:05.364932" elapsed="0.000555"/>
</kw>
<msg time="2026-04-17T03:27:05.365655" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:05.363417" elapsed="0.002403"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:05.366007" elapsed="0.000025"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:05.366200" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:27:05.351154" elapsed="0.015136"/>
</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-04-17T03:27:05.350382" elapsed="0.015964"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:27:05.334853" elapsed="0.031600">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:05.366895" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:27:05.366998" elapsed="0.000023"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:27:05.321237" elapsed="0.045883">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:27:05.367254" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:27:05.367303" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:05.316112" elapsed="0.051216"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:05.367698" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:05.367421" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:05.367399" elapsed="0.000383"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:27:05.315962" elapsed="0.051847"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:27:05.315760" elapsed="0.052085"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:27:05.313194" elapsed="0.054712"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:27:05.307908" elapsed="0.060080"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:05.307410" elapsed="0.060628"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:27:05.303341" elapsed="0.064754"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:27:05.368769" level="INFO">&amp;{mapping} = { IP=10.30.171.238 | 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-04-17T03:27:05.368278" elapsed="0.000519"/>
</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-04-17T03:27:05.415140" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:05.414640" elapsed="0.000540"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:27:05.416058" 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-04-17T03:27:05.415753" elapsed="0.000402">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-04-17T03:27:05.416268" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:27:05.415376" elapsed="0.000930"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:05.417007" 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-04-17T03:27:05.416550" elapsed="0.000492"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:27:05.417365" 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-04-17T03:27:05.417614" 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-04-17T03:27:05.417215" elapsed="0.000427"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:05.418088" 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-04-17T03:27:05.417807" 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-04-17T03:27:05.419244" level="INFO">mapping: {'IP': '10.30.171.238', '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-04-17T03:27:05.418910" elapsed="0.000382"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:27:05.419741" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:27:05.419459" elapsed="0.000309"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:27:05.420487" level="INFO">${value} = 10.30.171.238</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:27:05.420177" elapsed="0.000336"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:27:05.421574" level="INFO">${encoded} = 10.30.171.238</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:27:05.421337" elapsed="0.000264"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:27:05.421656" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:27:05.421828" level="INFO">${encoded_value} = 10.30.171.238</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:27:05.420711" elapsed="0.001143"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:27:05.422032" elapsed="0.000256"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.238</var>
<status status="PASS" start="2026-04-17T03:27:05.420032" elapsed="0.002297"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:27:05.422896" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:27:05.422588" elapsed="0.000339"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:27:05.423722" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:27:05.423499" elapsed="0.000250"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:27:05.423801" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:27:05.423984" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:27:05.423168" 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-04-17T03:27:05.424168" elapsed="0.000233"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:27:05.422448" elapsed="0.001994"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:27:05.419822" elapsed="0.004656"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:27:05.424524" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:27:05.424690" level="INFO">${mapping_to_use} = {'IP': '10.30.171.238', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:27:05.418563" elapsed="0.006155"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:05.418219" elapsed="0.006532"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:05.424951" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:05.424778" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:05.418194" elapsed="0.006838"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:27:05.425836" 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-04-17T03:27:05.425197" elapsed="0.000670"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:27:05.425916" elapsed="0.000057"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:27:05.413898" elapsed="0.012188"/>
</kw>
<msg time="2026-04-17T03:27:05.426144" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:05.400305" elapsed="0.025891"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:27:05.439539" elapsed="0.000064"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:27:05.454022" elapsed="0.000063"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name} 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-04-17T03:27:05.468758" elapsed="0.000035"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:05.469038" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:05.469251" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:05.469715" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:05.469539" elapsed="0.000235"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:27:05.469519" 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-04-17T03:27:05.469985" 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-04-17T03:27:05.470176" 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-04-17T03:27:05.470362" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:27:05.469477" elapsed="0.000941"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:27:05.469343" elapsed="0.001105"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:05.470613" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:27:05.470698" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:27:05.470878" 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-04-17T03:27:05.395705" elapsed="0.075204"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:05.472269" 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.238</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:05.471926" elapsed="0.000400"/>
</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-04-17T03:27:05.478138" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:27:05.679997" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:27:06.082477" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:27:06.085375" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:27:05.475041" elapsed="0.615928">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:27:05.472401" elapsed="0.618716">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:27:06.091488" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:06.091180" elapsed="0.000400"/>
</branch>
<status status="FAIL" start="2026-04-17T03:27:05.472382" elapsed="0.619232">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:27:06.092241" elapsed="0.000039"/>
</kw>
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:27:06.092352" elapsed="0.000030"/>
</return>
<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-04-17T03:27:05.471233" elapsed="0.621283">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:27:06.092609" elapsed="0.000021"/>
</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="FAIL" start="2026-04-17T03:27:05.369248" elapsed="0.723494">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="FAIL" start="2026-04-17T03:27:05.302459" elapsed="0.790546">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:27:06.098179" elapsed="0.000310"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:27:06.097764" elapsed="0.000787"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:06.099639" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:06.099501" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:06.099478" 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-04-17T03:27:06.105134" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:06.105001" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:06.104979" elapsed="0.000233"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:06.106486" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:27:06.106025" elapsed="0.000492"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:27:06.107126" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:27:06.106766" elapsed="0.000395"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:27:06.107219" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:27:06.107401" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:27:06.105576" elapsed="0.001851"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:06.113247" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:06.113121" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:06.113099" elapsed="0.000221"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:06.114606" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:06.114499" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:06.114482" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:06.115165" level="INFO">${karaf_connection_index} = 92</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:27:06.114822" elapsed="0.000371"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:06.115579" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:27:06.115357" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:06.116402" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:27:06.116128" elapsed="0.000953">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:27:06.117270" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:27:06.117317" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:06.115767" elapsed="0.001574"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:27:06.118149" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:27:06.117889" elapsed="0.000905">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:27:06.118996" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:27:06.119042" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:06.117511" elapsed="0.001554"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:27:06.120173" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Deconfigure_App_Peer"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:27:06.119362" elapsed="0.000873">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Deconfigure_App_Peer"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:27:06.119138" elapsed="0.001167">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Deconfigure_App_Peer"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:27:06.119120" elapsed="0.001219">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Deconfigure_App_Peer"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:06.120507" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:06.120737" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:06.120593" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:27:06.120576" elapsed="0.000236"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:27:06.120845" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:27:06.123496" elapsed="0.000157"/>
</kw>
<msg time="2026-04-17T03:27:06.123721" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:06.122377" 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-04-17T03:27:06.124172" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:06.124503" 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-04-17T03:27:06.121737" 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-04-17T03:27:06.121151" elapsed="0.003658"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:27:06.114196" elapsed="0.010703">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Deconfigure_App_Peer"</status>
</kw>
<msg time="2026-04-17T03:27:06.125021" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:27:06.125065" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.030 Bgp Functional Evpn.Deconfigure_App_Peer"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:06.113493" elapsed="0.011596"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:27:06.125283" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:06.125171" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:06.125150" elapsed="0.000202"/>
</if>
<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-04-17T03:27:06.126241" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:06.126134" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:06.126116" elapsed="0.000192"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:06.126600" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:27:06.126708" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:27:06.126469" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:06.127190" level="INFO">{1: 92}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:06.126890" elapsed="0.000345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:06.127627" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:06.127388" elapsed="0.000283"/>
</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-04-17T03:27:06.128396" elapsed="0.000291"/>
</kw>
<msg time="2026-04-17T03:27:06.128795" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:27:06.128845" level="INFO">${old_connection_index} = 92</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:06.127832" elapsed="0.001037"/>
</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-04-17T03:27:06.129845" elapsed="0.000230"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:06.131243" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:27:06.130777" elapsed="0.001594">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:06.130264" elapsed="0.002210"/>
</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-04-17T03:27:06.133189" elapsed="0.000293"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:06.132668" elapsed="0.000902"/>
</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-04-17T03:27:06.129220" elapsed="0.004400"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:06.128968" elapsed="0.004707"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:06.128934" elapsed="0.004769"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:06.134678" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:27:06.134342" elapsed="0.000367"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:27:06.134763" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:27:06.134934" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:27:06.133972" elapsed="0.001007"/>
</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-04-17T03:27:06.135160" elapsed="0.000467"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:06.136202" level="INFO">index=93
host=10.30.170.120
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-04-17T03:27:06.136316" level="INFO">${karaf_connection_object} = index=93
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:27:06.135820" elapsed="0.000574"/>
</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-04-17T03:27:06.136572" elapsed="0.002631"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:27:06.139667" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:27:06.140833" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:27:06.139389" elapsed="0.001881">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:27:06.173409" elapsed="0.000477"/>
</kw>
<msg time="2026-04-17T03:27:06.174101" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:06.171717" elapsed="0.002594"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:06.174509" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:06.174677" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:27:06.142261" elapsed="0.032501"/>
</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-04-17T03:27:06.141597" elapsed="0.033214"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:27:06.125811" elapsed="0.049091">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:06.175409" elapsed="0.000045"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:27:06.175523" elapsed="0.000030"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:27:06.112720" elapsed="0.062974">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:27:06.175884" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:27:06.175931" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:06.107834" elapsed="0.068550"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:06.176902" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:06.176524" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:06.176500" elapsed="0.000567"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:27:06.107681" elapsed="0.069437"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:27:06.107487" elapsed="0.069714"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:27:06.104551" elapsed="0.072719"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:27:06.099191" elapsed="0.078150"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:06.098711" elapsed="0.078741"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:27:06.094521" elapsed="0.083022"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:27:06.178422" level="INFO">&amp;{mapping} = { IP=10.30.170.120 | 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-04-17T03:27:06.177765" elapsed="0.000699"/>
</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-04-17T03:27:06.238194" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:06.237717" elapsed="0.000511"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:27:06.239115" 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-04-17T03:27:06.238817" elapsed="0.000451">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-04-17T03:27:06.239366" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:27:06.238409" elapsed="0.000983"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:06.240139" 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-04-17T03:27:06.239664" elapsed="0.000504"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:27:06.240525" 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-04-17T03:27:06.240695" 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-04-17T03:27:06.240350" elapsed="0.000383"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:06.241168" 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-04-17T03:27:06.240901" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:06.242323" level="INFO">mapping: {'IP': '10.30.170.120', '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-04-17T03:27:06.242062" elapsed="0.000306"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:27:06.242803" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:27:06.242534" elapsed="0.000294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:27:06.243537" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:27:06.243210" elapsed="0.000354"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:27:06.244343" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:27:06.244119" elapsed="0.000250"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:27:06.244421" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:27:06.244587" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:27:06.243754" elapsed="0.000863"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:27:06.244773" elapsed="0.000256"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:27:06.243071" elapsed="0.001998"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:27:06.245636" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:27:06.245330" elapsed="0.000332"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:27:06.246414" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:27:06.246202" elapsed="0.000239"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:27:06.246489" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:27:06.246640" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:27:06.245861" elapsed="0.000804"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:27:06.246816" elapsed="0.000240"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:27:06.245183" elapsed="0.001913"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:27:06.242878" elapsed="0.004252"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:27:06.247173" elapsed="0.000027"/>
</return>
<msg time="2026-04-17T03:27:06.247330" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:27:06.241651" elapsed="0.005705"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:06.241290" elapsed="0.006098"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:06.247587" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:06.247414" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:06.241266" elapsed="0.006399"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:27:06.248446" 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-04-17T03:27:06.247810" elapsed="0.000674"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:27:06.248569" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:27:06.236987" elapsed="0.011709"/>
</kw>
<msg time="2026-04-17T03:27:06.248879" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:06.209415" elapsed="0.039514"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:27:06.263528" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:06.276432" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:06.289537" elapsed="0.000037"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:06.289780" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:06.289980" 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-04-17T03:27:06.290391" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:06.290239" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:27:06.290221" 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-04-17T03:27:06.290631" 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-04-17T03:27:06.290801" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:06.290993" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:27:06.290185" elapsed="0.000874"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:27:06.290064" elapsed="0.001023"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:06.291271" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:27:06.291353" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:27:06.291509" 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-04-17T03:27:06.204780" elapsed="0.086769"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:06.293290" 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.120</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:06.292974" elapsed="0.000370"/>
</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-04-17T03:27:06.298432" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:27:06.500242" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:27:06.903516" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:27:06.905809" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:27:06.295518" elapsed="0.616118">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:27:06.293410" elapsed="0.618570">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:27:06.912492" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:06.912083" elapsed="0.000478"/>
</branch>
<status status="FAIL" start="2026-04-17T03:27:06.293393" elapsed="0.619193">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:27:06.913094" elapsed="0.000041"/>
</kw>
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:27:06.913189" elapsed="0.000020"/>
</return>
<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-04-17T03:27:06.291903" elapsed="0.621407">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:27:06.913377" elapsed="0.000016"/>
</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="FAIL" start="2026-04-17T03:27:06.178772" elapsed="0.734700">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Revert the BGP configuration to the original state: without application peer</doc>
<status status="FAIL" start="2026-04-17T03:27:06.093679" elapsed="0.819980">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:27:06.914760" elapsed="0.000417"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-17T03:27:06.915423" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-17T03:27:06.915345" elapsed="0.000166"/>
</kw>
<doc>Suite teardown keyword</doc>
<status status="PASS" start="2026-04-17T03:27:06.914497" elapsed="0.001066"/>
</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="FAIL" start="2026-04-17T03:26:01.634311" elapsed="65.281281"/>
</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-04-17T03:27:07.012165" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:27:07.007622" elapsed="0.004627"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-17T03:27:07.007368" elapsed="0.004981"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-17T03:27:07.017392" 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-04-17T03:27:07.013619" elapsed="0.003806"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-17T03:27:07.017658" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:07.017526" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:07.017499" elapsed="0.000233"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:27:07.018357" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:27:07.017925" elapsed="0.000480"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-17T03:27:07.018890" 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-04-17T03:27:07.018575" elapsed="0.000341"/>
</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-04-17T03:27:07.019450" elapsed="0.000318"/>
</kw>
<msg time="2026-04-17T03:27:07.019882" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:27:07.019953" level="INFO">${possibly_int_of_members} = 1</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:07.019102" elapsed="0.000879"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:07.020555" 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-04-17T03:27:07.020155" elapsed="0.000427"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:27:07.021638" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:27:07.021364" elapsed="0.000301"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:27:07.022141" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:27:07.021814" elapsed="0.000355"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:27:07.022665" 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-04-17T03:27:07.022330" elapsed="0.000362"/>
</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-04-17T03:27:07.025937" elapsed="0.000290"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:27:07.026739" level="INFO">${member_ip} = 10.30.170.120</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:07.026397" elapsed="0.000369"/>
</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-04-17T03:27:07.026920" elapsed="0.000256"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:27:07.027998" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:07.027679" elapsed="0.000346"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-17T03:27:07.028076" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:27:07.028249" 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-04-17T03:27:07.027378" elapsed="0.000896"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:27:07.029220" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.120:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a441701c8d0&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-04-17T03:27:07.028434" elapsed="0.000932"/>
</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-04-17T03:27:07.029615" elapsed="0.000198"/>
</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-04-17T03:27:07.025339" elapsed="0.004536"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:27:07.025125" elapsed="0.004796"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-04-17T03:27:07.022751" elapsed="0.007231"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:27:07.030618" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:27:07.030151" elapsed="0.000511"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:27:07.031331" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.120'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:27:07.030826" elapsed="0.000553"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:27:07.031970" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:27:07.031546" elapsed="0.000469"/>
</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-04-17T03:27:07.020862" elapsed="0.011212"/>
</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-04-17T03:27:07.013259" elapsed="0.018871"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:07.032361" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:07.032219" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:07.032193" elapsed="0.000244"/>
</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-04-17T03:27:07.036026" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:27:07.035589" elapsed="0.000467"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:27:07.036556" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:27:07.036236" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:27:07.036632" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:27:07.036802" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:27:07.035227" elapsed="0.001600"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:07.037971" level="INFO">${member_ip} = 10.30.170.120</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-04-17T03:27:07.037665" elapsed="0.000333"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:07.038814" 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-04-17T03:27:07.038958" 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-04-17T03:27:07.038640" elapsed="0.000351"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:07.042452" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:07.041828" elapsed="0.000710"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:07.041809" elapsed="0.000766"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:07.043234" 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-04-17T03:27:07.043475" 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-04-17T03:27:07.042774" elapsed="0.000752"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:07.044530" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.120" 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-04-17T03:27:07.043794" elapsed="0.000844"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:07.045980" 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-04-17T03:27:07.044978" elapsed="0.001055"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-17T03:27:07.048185" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:27:07.048406" 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-04-17T03:27:07.047571" elapsed="0.000886"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:07.048833" elapsed="0.000495"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:27:07.050664" level="INFO">Logging into '10.30.170.120:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:27:07.807906" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 17 03:27:07 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:26:02 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:27:07.050255" elapsed="0.757858"/>
</kw>
<msg time="2026-04-17T03:27:07.808219" 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-04-17T03:27:07.049687" elapsed="0.758734"/>
</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-04-17T03:27:07.046528" elapsed="0.762090"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:07.809794" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-17T03:27:07.823240" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-17T03:27:07.823678" level="INFO">${stdout} = </msg>
<msg time="2026-04-17T03:27:07.823867" 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-04-17T03:27:07.809143" elapsed="0.014866"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:27:07.824683" elapsed="0.000813"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:07.827176" 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-04-17T03:27:07.826321" elapsed="0.000996"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-17T03:27:07.827864" elapsed="0.000066"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:07.827541" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:07.827504" elapsed="0.000665"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:27:07.828588" elapsed="0.000095"/>
</return>
<status status="PASS" start="2026-04-17T03:27:07.828284" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:07.828261" elapsed="0.000593"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-17T03:27:07.828973" elapsed="0.000022"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:07.833534" elapsed="0.000735"/>
</kw>
<kw name="Open 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-04-17T03:27:07.834665" elapsed="0.000438"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:27:07.835463" elapsed="0.000311"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:27:07.829656" elapsed="0.006220"/>
</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-04-17T03:27:07.040876" elapsed="0.795269"/>
</kw>
<msg time="2026-04-17T03:27:07.836302" 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-04-17T03:27:07.040237" elapsed="0.796170"/>
</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-04-17T03:27:07.039735" elapsed="0.796911"/>
</kw>
<msg time="2026-04-17T03:27:07.836709" 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-04-17T03:27:07.039178" elapsed="0.797601"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:07.840815" elapsed="0.000549"/>
</kw>
<kw name="Open 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-04-17T03:27:07.841608" elapsed="0.000240"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:27:07.842086" elapsed="0.000147"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:27:07.837289" elapsed="0.005023"/>
</kw>
<msg time="2026-04-17T03:27:07.842450" 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-04-17T03:27:07.038219" elapsed="0.804266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:07.843155" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:07.842771" elapsed="0.000444"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-17T03:27:07.843280" elapsed="0.000055"/>
</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-04-17T03:27:07.037247" elapsed="0.806220"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:27:07.037049" elapsed="0.806465"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:27:07.036887" elapsed="0.806672"/>
</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-04-17T03:27:07.032696" elapsed="0.810938"/>
</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-04-17T03:27:07.843848" 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-04-17T03:27:07.862784" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:07.862589" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:07.862549" elapsed="0.000358"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:07.863481" 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-04-17T03:27:07.863645" 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-04-17T03:27:07.863227" elapsed="0.000456"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:07.864345" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:07.863911" elapsed="0.000489"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:07.865017" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:07.864700" elapsed="0.000381"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:07.866076" 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-04-17T03:27:07.865808" elapsed="0.000385">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-17T03:27:07.866305" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:27:07.866350" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:07.865320" elapsed="0.001054"/>
</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-04-17T03:27:07.866796" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:07.866458" elapsed="0.000456"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:07.866436" elapsed="0.000540"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:07.867962" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:27:07.867600" elapsed="0.000392"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:27:07.868046" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:27:07.868214" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:27:07.867236" elapsed="0.001002"/>
</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-04-17T03:27:07.868399" elapsed="0.000656"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:07.869492" level="INFO">index=4
host=10.30.170.120
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-04-17T03:27:07.869644" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.120
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-04-17T03:27:07.869324" elapsed="0.000358"/>
</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-04-17T03:27:07.869895" elapsed="0.002490"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:27:07.873038" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:27:07.874301" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:27:07.872604" elapsed="0.002280">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:07.879391" elapsed="0.000398"/>
</kw>
<kw name="Open 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-04-17T03:27:07.879996" elapsed="0.000177"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:27:07.880359" 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-04-17T03:27:07.876254" elapsed="0.004272"/>
</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-04-17T03:27:07.875413" elapsed="0.005161"/>
</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="FAIL" start="2026-04-17T03:27:07.862024" elapsed="0.018650">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:27:08.904404" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:08.904235" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:08.904206" elapsed="0.000318"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:08.905098" 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-04-17T03:27:08.905245" 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-04-17T03:27:08.904818" elapsed="0.000455"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:08.905855" 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-04-17T03:27:08.905468" elapsed="0.000436"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:08.906376" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:08.906095" elapsed="0.000326"/>
</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-04-17T03:27:08.907076" elapsed="0.000248"/>
</kw>
<msg time="2026-04-17T03:27:08.907451" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:27:08.907523" level="INFO">${old_connection_index} = 4</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:08.906612" elapsed="0.000941"/>
</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-04-17T03:27:08.908669" elapsed="0.000169"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:08.909627" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:27:08.909419" elapsed="0.000762">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:08.909055" elapsed="0.001192"/>
</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-04-17T03:27:08.910911" elapsed="0.000164"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:08.910463" elapsed="0.000674"/>
</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-04-17T03:27:08.908009" elapsed="0.003187"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:08.907666" elapsed="0.003689"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:08.907636" elapsed="0.003768"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:08.912623" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:27:08.912239" elapsed="0.000421"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:27:08.912729" elapsed="0.000053"/>
</return>
<msg time="2026-04-17T03:27:08.912959" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:27:08.911726" elapsed="0.001261"/>
</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-04-17T03:27:08.913152" elapsed="0.000474"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:08.914001" level="INFO">index=6
host=10.30.170.120
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-04-17T03:27:08.914109" level="INFO">${karaf_connection_object} = index=6
host=10.30.170.120
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-04-17T03:27:08.913847" elapsed="0.000289"/>
</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-04-17T03:27:08.914298" elapsed="0.002915"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:27:08.917779" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:27:08.919004" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:27:08.917470" elapsed="0.001983">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:08.923044" 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-04-17T03:27:08.923642" elapsed="0.000185"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:27:08.924008" 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-04-17T03:27:08.920628" elapsed="0.003543"/>
</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-04-17T03:27:08.919798" elapsed="0.004460"/>
</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="FAIL" start="2026-04-17T03:27:08.903677" elapsed="0.020713">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:27:09.943299" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:09.943160" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:09.943134" elapsed="0.000253"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:09.943757" 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-04-17T03:27:09.943876" 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-04-17T03:27:09.943575" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:09.944382" level="INFO">{1: 6}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:09.944080" elapsed="0.000348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:09.944864" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:09.944582" elapsed="0.000337"/>
</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-04-17T03:27:09.945509" elapsed="0.000191"/>
</kw>
<msg time="2026-04-17T03:27:09.945801" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:27:09.945849" level="INFO">${old_connection_index} = 6</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:09.945106" elapsed="0.000765"/>
</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-04-17T03:27:09.946776" elapsed="0.000173"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:09.947685" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:27:09.947508" elapsed="0.000806">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:09.947132" elapsed="0.001249"/>
</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-04-17T03:27:09.948982" elapsed="0.000107"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:09.948604" elapsed="0.000534"/>
</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-04-17T03:27:09.946228" elapsed="0.002956"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:09.945965" elapsed="0.003270"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:09.945945" elapsed="0.003325"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:09.950121" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:27:09.949822" elapsed="0.000349"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:27:09.950221" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:27:09.950383" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:27:09.949501" elapsed="0.000907"/>
</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-04-17T03:27:09.950586" elapsed="0.000492"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:09.951356" level="INFO">index=8
host=10.30.170.120
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-04-17T03:27:09.951456" level="INFO">${karaf_connection_object} = index=8
host=10.30.170.120
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-04-17T03:27:09.951249" elapsed="0.000233"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:27:09.951637" elapsed="0.002429"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:27:09.954568" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:27:09.955907" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:27:09.954279" elapsed="0.002106">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:09.959842" elapsed="0.000433"/>
</kw>
<kw name="Open 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-04-17T03:27:09.960447" elapsed="0.000185"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:27:09.960791" elapsed="0.000103"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:27:09.957421" elapsed="0.003570"/>
</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-04-17T03:27:09.956745" elapsed="0.004304"/>
</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="FAIL" start="2026-04-17T03:27:09.942741" elapsed="0.018420">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:27:10.978558" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:10.978361" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:10.978322" elapsed="0.000357"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:10.979296" 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-04-17T03:27:10.979459" 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-04-17T03:27:10.979045" elapsed="0.000453"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:10.980191" level="INFO">{1: 8}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:10.979726" elapsed="0.000532"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:10.980830" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:10.980479" elapsed="0.000415"/>
</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-04-17T03:27:10.981836" elapsed="0.000295"/>
</kw>
<msg time="2026-04-17T03:27:10.982276" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:27:10.982342" level="INFO">${old_connection_index} = 8</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:10.981142" elapsed="0.001233"/>
</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-04-17T03:27:10.983664" elapsed="0.000197"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:10.984852" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:27:10.984593" elapsed="0.001042">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:10.984113" elapsed="0.001612"/>
</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-04-17T03:27:10.986439" elapsed="0.000132"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:10.985991" elapsed="0.000649"/>
</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-04-17T03:27:10.982830" elapsed="0.003874"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:10.982493" elapsed="0.004278"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:10.982461" elapsed="0.004352"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:10.987814" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:27:10.987518" elapsed="0.000322"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:27:10.987894" elapsed="0.000056"/>
</return>
<msg time="2026-04-17T03:27:10.988085" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:27:10.987192" elapsed="0.000918"/>
</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-04-17T03:27:10.988270" elapsed="0.000432"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:10.989024" level="INFO">index=10
host=10.30.170.120
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-04-17T03:27:10.989128" level="INFO">${karaf_connection_object} = index=10
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:27:10.988885" elapsed="0.000271"/>
</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-04-17T03:27:10.989308" elapsed="0.002691"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:27:10.992542" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:27:10.993826" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:27:10.992226" elapsed="0.002065">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:10.997719" elapsed="0.000394"/>
</kw>
<kw name="Open 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-04-17T03:27:10.998332" elapsed="0.000182"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:27:10.998671" elapsed="0.000104"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:27:10.995407" elapsed="0.003421"/>
</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-04-17T03:27:10.994675" elapsed="0.004200"/>
</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="FAIL" start="2026-04-17T03:27:10.977768" elapsed="0.021227">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:27:10.999122" level="FAIL">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<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="FAIL" start="2026-04-17T03:27:07.845374" elapsed="3.153854">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:07.844727" elapsed="3.154636"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:27:07.844528" elapsed="3.154879"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-04-17T03:27:07.844255" elapsed="3.155189"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-17T03:27:07.012737" elapsed="3.986779"/>
</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-04-17T03:27:11.003605" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:11.003462" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:11.003430" elapsed="0.000249"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:11.008815" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:11.008688" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:11.008666" elapsed="0.000226"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:11.010024" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:27:11.009549" elapsed="0.000514"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:27:11.010568" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:27:11.010243" elapsed="0.000351"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:27:11.010639" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:27:11.010808" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:27:11.009182" elapsed="0.001651"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:11.016756" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:11.016622" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:11.016599" 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-04-17T03:27:11.018199" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:11.018067" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:11.018049" elapsed="0.000220"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:11.018811" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:27:11.018419" elapsed="0.000422"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:11.019333" 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-04-17T03:27:11.019032" elapsed="0.000328"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:11.020504" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:27:11.020051" elapsed="0.001238">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:27:11.021430" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:27:11.021476" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:11.019521" elapsed="0.001979"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:27:11.022754" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:27:11.022340" elapsed="0.001305">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:27:11.023788" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:27:11.023834" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:11.021701" elapsed="0.002156"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:27:11.024907" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/040_bgp_functional_route_ref.robot"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:27:11.024230" elapsed="0.000785">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/040_bgp_functional_route_ref.robot"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:27:11.023962" elapsed="0.001194">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/040_bgp_functional_route_ref.robot"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:27:11.023920" elapsed="0.001342">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/040_bgp_functional_route_ref.robot"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:11.025438" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:11.025673" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:11.025529" elapsed="0.000289"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:27:11.025511" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:27:11.025882" elapsed="0.000019"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:11.028436" elapsed="0.000559"/>
</kw>
<kw name="Open 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-04-17T03:27:11.029362" elapsed="0.000604"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:27:11.030343" 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-04-17T03:27:11.027205" elapsed="0.003482"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:27:11.026223" elapsed="0.004602"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:27:11.017746" elapsed="0.013320">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/040_bgp_functional_route_ref.robot"</status>
</kw>
<msg time="2026-04-17T03:27:11.031189" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:27:11.031234" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/040_bgp_functional_route_ref.robot"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:11.017034" elapsed="0.014226"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:27:11.031545" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:11.031381" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:11.031352" elapsed="0.000286"/>
</if>
<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-04-17T03:27:11.032591" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:11.032475" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:11.032454" elapsed="0.000204"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:11.034546" 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-04-17T03:27:11.034674" 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-04-17T03:27:11.032816" elapsed="0.001887"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:11.035295" level="INFO">{1: 10}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:11.034866" elapsed="0.000578"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:11.035897" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:11.035643" elapsed="0.000317"/>
</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-04-17T03:27:11.036643" elapsed="0.000416"/>
</kw>
<msg time="2026-04-17T03:27:11.037194" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:27:11.037252" level="INFO">${old_connection_index} = 10</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:11.036126" elapsed="0.001153"/>
</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-04-17T03:27:11.038541" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:11.040483" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:27:11.040186" elapsed="0.000850">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:11.039244" elapsed="0.001887"/>
</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-04-17T03:27:11.042189" elapsed="0.000201"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:11.041420" elapsed="0.001044"/>
</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-04-17T03:27:11.037672" elapsed="0.004876"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:11.037404" elapsed="0.005260"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:11.037376" elapsed="0.005318"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:11.043829" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:27:11.043256" elapsed="0.000617"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:27:11.044003" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:27:11.044181" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:27:11.042948" elapsed="0.001259"/>
</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-04-17T03:27:11.044368" elapsed="0.000429"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:11.045106" level="INFO">index=13
host=10.30.170.120
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-04-17T03:27:11.045207" level="INFO">${karaf_connection_object} = index=13
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:27:11.044988" elapsed="0.000246"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:27:11.045382" elapsed="0.002607"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:27:11.048428" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:27:11.049663" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:27:11.048158" elapsed="0.001938">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:11.053630" elapsed="0.000708"/>
</kw>
<kw name="Open 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-04-17T03:27:11.054625" elapsed="0.000470"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:27:11.055357" elapsed="0.000235"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:27:11.050985" elapsed="0.004698"/>
</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-04-17T03:27:11.050417" elapsed="0.005317"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:27:11.032176" elapsed="0.023648">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:11.056214" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:27:11.056291" 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="FAIL" start="2026-04-17T03:27:11.016259" elapsed="0.040144">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:27:11.056514" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:27:11.056558" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:11.011319" elapsed="0.045263"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:11.056922" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:11.056664" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:11.056643" elapsed="0.000377"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:27:11.011100" elapsed="0.045943"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:27:11.010892" elapsed="0.046185"/>
</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-04-17T03:27:11.008264" elapsed="0.048869"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-17T03:27:11.000449" elapsed="0.056737"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:10.999758" elapsed="0.057470"/>
</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-04-17T03:27:07.007037" elapsed="4.050293"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:11.057837" level="INFO">${mininet_conn_id} = 15</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-04-17T03:27:11.057485" elapsed="0.000379"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:27:11.058384" level="INFO">${mininet_conn_id} = 15</msg>
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:27:11.058054" elapsed="0.000373"/>
</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-04-17T03:27:11.060282" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:27:11.060361" 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-04-17T03:27:11.060001" elapsed="0.000384"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:11.060553" elapsed="0.000393"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:27:11.061848" level="INFO">Logging into '10.30.171.238:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:27:11.649886" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 17 03:27:11 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:26:06 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:27:11.061525" elapsed="0.588528"/>
</kw>
<msg time="2026-04-17T03:27:11.650135" 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-04-17T03:27:11.061140" elapsed="0.589073"/>
</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-04-17T03:27:11.059483" elapsed="0.590838"/>
</kw>
<msg time="2026-04-17T03:27:11.650374" 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-04-17T03:27:11.059058" elapsed="0.591362"/>
</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-04-17T03:27:11.058656" elapsed="0.591841"/>
</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-04-17T03:27:11.657208" level="INFO">${cd_and_command} = cd '.' &amp;&amp; virtualenv /tmp/defaultvenv</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:11.656833" elapsed="0.000404"/>
</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-04-17T03:27:11.658773" level="INFO">Executing command 'cd '.' &amp;&amp; virtualenv /tmp/defaultvenv'.</msg>
<msg time="2026-04-17T03:27:11.926062" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:27:11.926568" level="INFO">${stdout} = created virtual environment CPython3.10.12.final.0-64 in 120ms
  creator CPython3Posix(dest=/tmp/defaultvenv, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=b...</msg>
<msg time="2026-04-17T03:27:11.926721" level="INFO">${stderr} = </msg>
<msg time="2026-04-17T03:27:11.926830" 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-04-17T03:27:11.658578" elapsed="0.268309"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:27:11.929397" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-04-17T03:27:11.928658" elapsed="0.000859"/>
</kw>
<msg time="2026-04-17T03:27:11.929761" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-04-17T03:27:11.929872" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:11.927464" elapsed="0.002497"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:11.931277" 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-04-17T03:27:11.930515" elapsed="0.000804"/>
</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-04-17T03:27:11.933207" level="INFO">created virtual environment CPython3.10.12.final.0-64 in 120ms
  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-04-17T03:27:11.932761" elapsed="0.000610"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:11.934000" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:11.933604" elapsed="0.000482"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:11.934715" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:11.934331" elapsed="0.000453"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-04-17T03:27:11.932046" elapsed="0.002846"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:11.931456" elapsed="0.003541"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:11.931418" elapsed="0.003636"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-04-17T03:27:11.935383" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:11.935175" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:11.935140" elapsed="0.000388"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:27:11.935817" elapsed="0.000062"/>
</return>
<status status="PASS" start="2026-04-17T03:27:11.935636" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:11.935604" elapsed="0.000426"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:11.936268" elapsed="0.000033"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-04-17T03:27:11.657971" elapsed="0.278481"/>
</kw>
<msg time="2026-04-17T03:27:11.936539" 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-04-17T03:27:11.657400" elapsed="0.279215"/>
</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-04-17T03:27:11.656188" elapsed="0.280628"/>
</kw>
<msg time="2026-04-17T03:27:11.936949" 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-04-17T03:27:11.651623" elapsed="0.285403"/>
</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-04-17T03:27:11.651235" elapsed="0.285953"/>
</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-04-17T03:27:11.945224" level="INFO">${cd_and_command} = cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install --upgrade pip; deactivate</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:11.944773" elapsed="0.000483"/>
</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-04-17T03:27:11.947840" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install --upgrade pip; deactivate'.</msg>
<msg time="2026-04-17T03:27:14.130474" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:27:14.131028" level="INFO">${stdout} = Requirement already satisfied: pip in /tmp/defaultvenv/lib/python3.10/site-packages (22.0.2)
Collecting pip
  Using cached pip-26.0.1-py3-none-any.whl (1.8 MB)
Installing collected packages: pip
  Att...</msg>
<msg time="2026-04-17T03:27:14.131221" level="INFO">${stderr} = </msg>
<msg time="2026-04-17T03:27:14.131396" 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-04-17T03:27:11.947432" elapsed="2.184115"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:27:14.137763" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-04-17T03:27:14.136904" elapsed="0.001046"/>
</kw>
<msg time="2026-04-17T03:27:14.138177" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-04-17T03:27:14.138282" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:14.132583" elapsed="0.005758"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:14.140667" 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-04-17T03:27:14.138829" elapsed="0.001910"/>
</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-04-17T03:27:14.144334" level="INFO">Requirement already satisfied: pip in /tmp/defaultvenv/lib/python3.10/site-packages (22.0.2)
Collecting pip
  Using cached pip-26.0.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.0.1</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:14.143589" elapsed="0.001046"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:14.145874" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:14.145336" elapsed="0.000770"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:14.147220" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:14.146658" elapsed="0.000700"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-04-17T03:27:14.142322" elapsed="0.005170"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:14.141029" elapsed="0.006603"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:14.140990" elapsed="0.006685"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-04-17T03:27:14.148231" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:14.147761" elapsed="0.000632"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:14.147735" elapsed="0.000696"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:27:14.148748" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-04-17T03:27:14.148509" elapsed="0.000382"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:14.148486" elapsed="0.000434"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:14.149106" elapsed="0.000029"/>
</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-04-17T03:27:11.946431" elapsed="2.202877"/>
</kw>
<msg time="2026-04-17T03:27:14.149368" 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-04-17T03:27:11.945425" elapsed="2.204000"/>
</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-04-17T03:27:11.944084" elapsed="2.205423"/>
</kw>
<msg time="2026-04-17T03:27:14.149560" 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-04-17T03:27:11.939693" elapsed="2.209913"/>
</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-04-17T03:27:11.939131" elapsed="2.210554"/>
</kw>
<msg time="2026-04-17T03:27:14.149733" 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-04-17T03:27:11.938695" elapsed="2.211081"/>
</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-04-17T03:27:11.938249" elapsed="2.211602"/>
</kw>
<msg time="2026-04-17T03:27:14.149893" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${upgrade_pip}</arg>
<arg>Virtual_Env_Run_Cmd_At_Cwd</arg>
<arg>pip install --upgrade pip</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:11.937423" elapsed="2.212531"/>
</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-04-17T03:27:11.650808" elapsed="2.499229"/>
</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-04-17T03:27:14.158337" level="INFO">${cd_and_command} = cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install setuptools==44.0.0; deactivate</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:14.157902" elapsed="0.000467"/>
</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-04-17T03:27:14.160446" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install setuptools==44.0.0; deactivate'.</msg>
<msg time="2026-04-17T03:27:15.092981" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:27:15.093558" 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-04-17T03:27:15.093669" level="INFO">${stderr} = </msg>
<msg time="2026-04-17T03:27:15.093765" 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-04-17T03:27:14.159887" elapsed="0.933931"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:27:15.098802" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-04-17T03:27:15.097907" elapsed="0.001135"/>
</kw>
<msg time="2026-04-17T03:27:15.099265" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-04-17T03:27:15.099328" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:15.094610" elapsed="0.004751"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:15.101144" 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-04-17T03:27:15.099686" elapsed="0.001500"/>
</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-04-17T03:27:15.104604" 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-04-17T03:27:15.104122" elapsed="0.000584"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:15.105674" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:15.105226" elapsed="0.000526"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:15.106426" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:15.106098" elapsed="0.000415"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-04-17T03:27:15.102655" elapsed="0.003936"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:15.101439" elapsed="0.005256"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:15.101387" elapsed="0.005383"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-04-17T03:27:15.107020" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:15.106841" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:15.106822" elapsed="0.000325"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:27:15.107354" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-17T03:27:15.107201" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:15.107185" elapsed="0.000318"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:15.107664" elapsed="0.000023"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-04-17T03:27:14.159215" elapsed="0.948599"/>
</kw>
<msg time="2026-04-17T03:27:15.107874" 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-04-17T03:27:14.158541" elapsed="0.949478"/>
</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-04-17T03:27:14.157191" elapsed="0.950936"/>
</kw>
<msg time="2026-04-17T03:27:15.108182" 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-04-17T03:27:14.152683" elapsed="0.955547"/>
</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-04-17T03:27:14.151915" elapsed="0.956407"/>
</kw>
<msg time="2026-04-17T03:27:15.108371" 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-04-17T03:27:14.151487" elapsed="0.956927"/>
</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-04-17T03:27:14.151030" elapsed="0.957472"/>
</kw>
<msg time="2026-04-17T03:27:15.108545" 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-04-17T03:27:14.150583" elapsed="0.958005"/>
</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-04-17T03:27:14.150288" elapsed="0.958389"/>
</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-04-17T03:27:15.116256" level="INFO">${cd_and_command} = cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install exabgp==3.4.16; deactivate</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:15.115842" elapsed="0.000445"/>
</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-04-17T03:27:15.118287" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install exabgp==3.4.16; deactivate'.</msg>
<msg time="2026-04-17T03:27:16.716612" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:27:16.717482" 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-04-17T03:27:16.717633" 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-04-17T03:27:16.717757" 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-04-17T03:27:15.117884" elapsed="1.599943"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:27:16.722773" level="INFO">Length is 1821.</msg>
<msg time="2026-04-17T03:27:16.723512" 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-0mzx2rhd/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-0mzx2rhd/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-0mzx2rhd/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-0mzx2rhd/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())
        File "&lt;string&gt;", line 40
          print """\
          ^^^^^^^^^
      SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed to build 'exabgp' when getting requirements to build wheel' should be empty.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="FAIL" start="2026-04-17T03:27:16.721849" elapsed="0.002665">'  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-0mzx2rhd/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-0mzx2rhd/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-0mzx2rhd/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-0mzx2rhd/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())
        File "&lt;string&gt;", line 40
          print """\
          ^^^^^^^^^
      SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed to build 'exabgp' when getting requirements to build wheel' should be empty.</status>
</kw>
<msg time="2026-04-17T03:27:16.725238" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-04-17T03:27:16.725379" level="INFO">${result} = '  error: subprocess-exited-with-error
  
  × Getting requirements to build wheel did not run successfully.
  │ exit code: 1
  ╰─&gt; [19 lines of output]
      Traceback (most recent call last):
       ...</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:16.718981" elapsed="0.006465"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:16.729202" 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-04-17T03:27:16.726223" elapsed="0.003049"/>
</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-04-17T03:27:16.734430" 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-04-17T03:27:16.733773" elapsed="0.000785"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:16.735591" 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-0mzx2rhd/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-0mzx2rhd/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-0mzx2rhd/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-0mzx2rhd/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())
        File "&lt;string&gt;", line 40
          print """\
          ^^^^^^^^^
      SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed to build 'exabgp' when getting requirements to build wheel</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:16.735096" elapsed="0.000723"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:16.736910" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:16.736412" elapsed="0.000624"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-04-17T03:27:16.731725" elapsed="0.005419"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:16.729603" elapsed="0.007679"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:16.729539" elapsed="0.007794"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-04-17T03:27:16.737661" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:16.737434" elapsed="0.000370"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:16.737407" elapsed="0.000434"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:27:16.738156" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-04-17T03:27:16.737916" elapsed="0.000421"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:16.737893" elapsed="0.000485"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:16.738589" elapsed="0.000038"/>
</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-04-17T03:27:15.117200" elapsed="1.621601"/>
</kw>
<msg time="2026-04-17T03:27:16.738888" 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-04-17T03:27:15.116481" elapsed="1.622619"/>
</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-04-17T03:27:15.115195" elapsed="1.624051"/>
</kw>
<msg time="2026-04-17T03:27:16.739324" 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-04-17T03:27:15.111004" elapsed="1.628387"/>
</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-04-17T03:27:15.110408" elapsed="1.629110"/>
</kw>
<msg time="2026-04-17T03:27:16.739588" 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-04-17T03:27:15.109960" elapsed="1.629690"/>
</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-04-17T03:27:15.109554" elapsed="1.630219"/>
</kw>
<msg time="2026-04-17T03:27:16.739837" 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-04-17T03:27:15.109179" elapsed="1.630718"/>
</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-04-17T03:27:15.108903" elapsed="1.631204"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:27:16.740770" level="INFO">Creating Session using : alias=config-session, url=http://10.30.170.120:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a4416e97c10&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-04-17T03:27:16.740339" elapsed="0.000643"/>
</kw>
<kw name="Upload_Config_Files">
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-04-17T03:27:16.767582" level="INFO">[chan 5] Opened sftp connection (server version 3)</msg>
<msg time="2026-04-17T03:27:16.775304" 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-04-17T03:27:16.741500" elapsed="0.033940"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-04-17T03:27:16.782463" 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-04-17T03:27:16.775813" elapsed="0.006761"/>
</kw>
<kw name="List Files In Directory" owner="SSHLibrary">
<msg time="2026-04-17T03:27:16.791174" 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-04-17T03:27:16.791367" 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-04-17T03:27:16.782877" elapsed="0.008527"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:16.792437" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.238/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-04-17T03:27:16.805406" 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-04-17T03:27:16.792163" elapsed="0.013428"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:16.806591" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.120/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-04-17T03:27:16.857492" 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-04-17T03:27:16.806103" elapsed="0.051623"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:16.858733" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/enable/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-04-17T03:27:16.909307" 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-04-17T03:27:16.858237" elapsed="0.051228"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:16.910101" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-04-17T03:27:16.965796" 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-04-17T03:27:16.909798" elapsed="0.056297"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:16.967130" level="INFO">Executing command 'cat bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-04-17T03:27:17.017900" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:27:17.018247" level="INFO">${stdout} = neighbor 10.30.170.120 {
router-id 10.30.171.238;
local-address 10.30.171.238;
local-as 64496;
peer-as 64496;
family {
  ipv4 flow;
}
flow {
    route flow1 {
        match {
            source 10.0.0...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-17T03:27:16.966650" elapsed="0.051660"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:17.019647" level="INFO">neighbor 10.30.170.120 {
router-id 10.30.171.238;
local-address 10.30.171.238;
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-04-17T03:27:17.018852" elapsed="0.000959"/>
</kw>
<var name="${cfgfile}">bgp-flowspec-redirect.cfg</var>
<status status="PASS" start="2026-04-17T03:27:16.791868" elapsed="0.228037"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:17.021152" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.238/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-04-17T03:27:17.069566" 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-04-17T03:27:17.020632" elapsed="0.049198"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:17.071145" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.120/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-04-17T03:27:17.122143" 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-04-17T03:27:17.070519" elapsed="0.051851"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:17.123377" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/enable/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-04-17T03:27:17.173612" 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-04-17T03:27:17.122891" elapsed="0.050965"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:17.174828" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-04-17T03:27:17.225632" 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-04-17T03:27:17.174412" elapsed="0.051496"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:17.227120" level="INFO">Executing command 'cat bgp-flowspec.cfg'.</msg>
<msg time="2026-04-17T03:27:17.278238" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:27:17.278573" level="INFO">${stdout} = neighbor 10.30.170.120 {
router-id 10.30.171.238;
local-address 10.30.171.238;
local-as 64496;
peer-as 64496;
family {
  ipv4 flow;
}
flow {
    route flow1 {
        match {
            source 10.0.0...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-17T03:27:17.226605" elapsed="0.052043"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:17.279496" level="INFO">neighbor 10.30.170.120 {
router-id 10.30.171.238;
local-address 10.30.171.238;
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-04-17T03:27:17.279082" elapsed="0.000473"/>
</kw>
<var name="${cfgfile}">bgp-flowspec.cfg</var>
<status status="PASS" start="2026-04-17T03:27:17.020278" elapsed="0.259314"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:17.280177" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.238/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-04-17T03:27:17.329751" 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-04-17T03:27:17.279990" elapsed="0.049931"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:17.330911" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.120/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-04-17T03:27:17.382054" 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-04-17T03:27:17.330363" elapsed="0.051976"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:17.383630" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/enable/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-04-17T03:27:17.433379" 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-04-17T03:27:17.383067" elapsed="0.050570"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:17.434857" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-04-17T03:27:17.481074" 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-04-17T03:27:17.434270" elapsed="0.047117"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:17.482561" level="INFO">Executing command 'cat bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-04-17T03:27:17.529583" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:27:17.529868" level="INFO">${stdout} = neighbor 10.30.170.120 {
router-id 10.30.171.238;
local-address 10.30.171.238;
local-as 64496;
peer-as 64496;
  family {
    ipv4 mpls-vpn;
  }
  static {
    route 1.1.1.0/24 {
      next-hop 10.0.25...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-17T03:27:17.482054" elapsed="0.047909"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:17.531395" level="INFO">neighbor 10.30.170.120 {
router-id 10.30.171.238;
local-address 10.30.171.238;
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-04-17T03:27:17.530552" elapsed="0.000963"/>
</kw>
<var name="${cfgfile}">bgp-l3vpn-ipv4.cfg</var>
<status status="PASS" start="2026-04-17T03:27:17.279771" elapsed="0.251827"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:17.532680" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.238/g' exa-md5.cfg'.</msg>
<msg time="2026-04-17T03:27:17.576662" 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-04-17T03:27:17.532292" elapsed="0.044512"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:17.577628" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.120/g' exa-md5.cfg'.</msg>
<msg time="2026-04-17T03:27:17.625128" 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-04-17T03:27:17.577227" elapsed="0.048118"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:17.626410" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/enable/g' exa-md5.cfg'.</msg>
<msg time="2026-04-17T03:27:17.673025" 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-04-17T03:27:17.625896" elapsed="0.047410"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:17.674204" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exa-md5.cfg'.</msg>
<msg time="2026-04-17T03:27:17.721419" 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-04-17T03:27:17.673805" elapsed="0.047850"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:17.722402" level="INFO">Executing command 'cat exa-md5.cfg'.</msg>
<msg time="2026-04-17T03:27:17.773785" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:27:17.774163" level="INFO">${stdout} = neighbor 10.30.170.120 {
  router-id 10.30.171.238;
  local-address 10.30.171.238;
  local-as 64496;
  peer-as 64496;
  md5-password topsecret;

  capability {
    route-refresh disable;
    add-path ...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-17T03:27:17.722094" elapsed="0.052126"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:17.775280" level="INFO">neighbor 10.30.170.120 {
  router-id 10.30.171.238;
  local-address 10.30.171.238;
  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-04-17T03:27:17.774746" elapsed="0.000612"/>
</kw>
<var name="${cfgfile}">exa-md5.cfg</var>
<status status="PASS" start="2026-04-17T03:27:17.531914" elapsed="0.243509"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:17.776222" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.238/g' exa.cfg'.</msg>
<msg time="2026-04-17T03:27:17.821603" 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-04-17T03:27:17.775951" elapsed="0.045930"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:17.823069" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.120/g' exa.cfg'.</msg>
<msg time="2026-04-17T03:27:17.873762" 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-04-17T03:27:17.822511" elapsed="0.051533"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:17.875217" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/enable/g' exa.cfg'.</msg>
<msg time="2026-04-17T03:27:17.925618" 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-04-17T03:27:17.874637" elapsed="0.051188"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:17.926559" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exa.cfg'.</msg>
<msg time="2026-04-17T03:27:17.977107" 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-04-17T03:27:17.926250" elapsed="0.051060"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:17.978233" level="INFO">Executing command 'cat exa.cfg'.</msg>
<msg time="2026-04-17T03:27:18.029054" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:27:18.029320" level="INFO">${stdout} = neighbor 10.30.170.120 {
router-id 10.30.171.238;
local-address 10.30.171.238;
local-as 64496;
peer-as 64496;
  capability {
    route-refresh enable;
    add-path disable;
  }

  family {
    ipv4 un...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-17T03:27:17.977776" elapsed="0.051587"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:18.030297" level="INFO">neighbor 10.30.170.120 {
router-id 10.30.171.238;
local-address 10.30.171.238;
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.238;
    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-04-17T03:27:18.029757" elapsed="0.000612"/>
</kw>
<var name="${cfgfile}">exa.cfg</var>
<status status="PASS" start="2026-04-17T03:27:17.775635" elapsed="0.254785"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:18.031105" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.238/g' gobgp.cfg'.</msg>
<msg time="2026-04-17T03:27:18.077352" 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-04-17T03:27:18.030849" elapsed="0.046704"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:18.078549" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.120/g' gobgp.cfg'.</msg>
<msg time="2026-04-17T03:27:18.126189" 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-04-17T03:27:18.078070" elapsed="0.048371"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:18.127511" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/enable/g' gobgp.cfg'.</msg>
<msg time="2026-04-17T03:27:18.177800" 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-04-17T03:27:18.127074" elapsed="0.051147"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:18.179517" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' gobgp.cfg'.</msg>
<msg time="2026-04-17T03:27:18.229530" 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-04-17T03:27:18.178975" elapsed="0.050874"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:18.231149" level="INFO">Executing command 'cat gobgp.cfg'.</msg>
<msg time="2026-04-17T03:27:18.277916" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:27:18.278506" level="INFO">${stdout} = [global.config]
    as = 64496
    router-id = "10.30.171.238"
    port = 17900
[[neighbors]]
    [neighbors.config]
        peer-as = 64496
        neighbor-address = "10.30.170.120"
        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-04-17T03:27:18.230584" elapsed="0.048023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:18.280481" level="INFO">[global.config]
    as = 64496
    router-id = "10.30.171.238"
    port = 17900
[[neighbors]]
    [neighbors.config]
        peer-as = 64496
        neighbor-address = "10.30.170.120"
        local-as = 64496
    [neighbors.transport.config]
        local-address = "10.30.171.238"
        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-04-17T03:27:18.279508" elapsed="0.001097"/>
</kw>
<var name="${cfgfile}">gobgp.cfg</var>
<status status="PASS" start="2026-04-17T03:27:18.030608" elapsed="0.250085"/>
</iter>
<var>${cfgfile}</var>
<value>@{cfgfiles}</value>
<status status="PASS" start="2026-04-17T03:27:16.791601" elapsed="1.489189"/>
</for>
<doc>Uploads exabgp config files</doc>
<status status="PASS" start="2026-04-17T03:27:16.741244" elapsed="1.539754"/>
</kw>
<doc>Suite setup keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:07.006594" elapsed="11.274543"/>
</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-04-17T03:27:18.291255" elapsed="0.000378"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:27:18.290917" elapsed="0.000809"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:18.293181" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:18.293015" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:18.292976" elapsed="0.000305"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:18.298311" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:18.298193" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:18.298174" elapsed="0.000206"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:18.299521" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:27:18.299081" elapsed="0.000482"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:27:18.300086" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:27:18.299754" elapsed="0.000361"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:27:18.300161" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:27:18.300331" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:27:18.298633" elapsed="0.001722"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:18.306359" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:18.306244" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:18.306223" 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-04-17T03:27:18.308159" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:18.308004" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:18.307925" elapsed="0.000330"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:18.308850" level="INFO">${karaf_connection_index} = 13</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:27:18.308457" elapsed="0.000424"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:18.309388" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:27:18.309110" elapsed="0.000313"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:18.310416" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:27:18.310097" elapsed="0.001255">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:27:18.311558" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:27:18.311606" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:18.309603" elapsed="0.002026"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:27:18.312472" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:27:18.312214" elapsed="0.000960">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:27:18.313366" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:27:18.313412" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:18.311821" elapsed="0.001614"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:27:18.314527" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.040 Bgp Functional Route Ref.Configure_App_Peer"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:27:18.313865" elapsed="0.000727">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.040 Bgp Functional Route Ref.Configure_App_Peer"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:27:18.313531" elapsed="0.001141">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.040 Bgp Functional Route Ref.Configure_App_Peer"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:27:18.313503" elapsed="0.001211">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.040 Bgp Functional Route Ref.Configure_App_Peer"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:18.314900" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:18.315161" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:18.315011" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:27:18.314992" elapsed="0.000248"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:27:18.315280" elapsed="0.000020"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:27:18.318340" elapsed="0.000164"/>
</kw>
<msg time="2026-04-17T03:27:18.318575" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:18.316968" elapsed="0.001744"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:18.319055" elapsed="0.000081"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:18.319401" 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-04-17T03:27:18.316245" elapsed="0.003350"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:27:18.315618" 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="FAIL" start="2026-04-17T03:27:18.307525" elapsed="0.012441">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.040 Bgp Functional Route Ref.Configure_App_Peer"</status>
</kw>
<msg time="2026-04-17T03:27:18.320087" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:27:18.320130" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.040 Bgp Functional Route Ref.Configure_App_Peer"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:18.306670" elapsed="0.013485"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:27:18.320418" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:18.320302" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:18.320280" elapsed="0.000208"/>
</if>
<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-04-17T03:27:18.321610" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:18.321502" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:18.321485" elapsed="0.000193"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:18.322283" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:27:18.322395" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:27:18.322131" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:18.322857" level="INFO">{1: 13}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:18.322582" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:18.323315" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:18.323071" elapsed="0.000288"/>
</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-04-17T03:27:18.323901" elapsed="0.000285"/>
</kw>
<msg time="2026-04-17T03:27:18.324285" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:27:18.324331" level="INFO">${old_connection_index} = 13</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:18.323517" elapsed="0.000837"/>
</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-04-17T03:27:18.325311" elapsed="0.000190"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:18.326628" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:27:18.326222" elapsed="0.001314">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:18.325667" elapsed="0.001968"/>
</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-04-17T03:27:18.328287" elapsed="0.000278"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:18.327805" elapsed="0.000844"/>
</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-04-17T03:27:18.324650" elapsed="0.004044"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:18.324428" elapsed="0.004315"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:18.324410" elapsed="0.004359"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:18.329709" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:27:18.329393" elapsed="0.000342"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:27:18.329844" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:27:18.330024" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:27:18.329057" elapsed="0.000993"/>
</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-04-17T03:27:18.330212" elapsed="0.000440"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:18.331029" level="INFO">index=16
host=10.30.170.120
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-04-17T03:27:18.331168" level="INFO">${karaf_connection_object} = index=16
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:27:18.330856" elapsed="0.000349"/>
</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-04-17T03:27:18.331412" elapsed="0.003431"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:27:18.335313" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:27:18.336597" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:27:18.335039" elapsed="0.001976">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:27:18.352578" elapsed="0.000427"/>
</kw>
<msg time="2026-04-17T03:27:18.353111" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:18.350810" elapsed="0.002460"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:18.353435" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:18.353598" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:27:18.337992" elapsed="0.015691"/>
</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-04-17T03:27:18.337378" elapsed="0.016353"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:27:18.321191" elapsed="0.032635">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:18.354474" elapsed="0.000030"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:27:18.354560" 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="FAIL" start="2026-04-17T03:27:18.305853" elapsed="0.048836">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:27:18.354834" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:27:18.354895" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:18.300865" elapsed="0.054085"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:18.355448" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:18.355077" elapsed="0.000447"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:18.355046" elapsed="0.000515"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:27:18.300715" elapsed="0.054881"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:27:18.300512" elapsed="0.055137"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:27:18.297803" elapsed="0.057932"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:27:18.292585" elapsed="0.063229"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:18.291955" elapsed="0.063925"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:27:18.284489" elapsed="0.071707"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:27:18.357434" 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.120 | BGP_RIB_OPENCONFIG=example-bgp-rib | IP=10.30.170.120 }</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-04-17T03:27:18.356451" elapsed="0.001024"/>
</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-04-17T03:27:18.391946" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:18.391528" elapsed="0.000454"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:27:18.392774" 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-04-17T03:27:18.392491" elapsed="0.000368">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-04-17T03:27:18.392970" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:27:18.392154" elapsed="0.000843"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:18.393626" 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-04-17T03:27:18.393164" elapsed="0.000490"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:27:18.394003" 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-04-17T03:27:18.394176" 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-04-17T03:27:18.393818" elapsed="0.000384"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:18.394610" 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-04-17T03:27:18.394360" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:18.395640" 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.120', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.170.120'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:18.395383" elapsed="0.000303"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:27:18.396147" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:27:18.395849" elapsed="0.000324"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:27:18.396865" 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-04-17T03:27:18.396561" elapsed="0.000329"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:27:18.397641" 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-04-17T03:27:18.397413" elapsed="0.000254"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:27:18.397721" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:27:18.397891" 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-04-17T03:27:18.397095" elapsed="0.000820"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:27:18.398118" elapsed="0.000252"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-04-17T03:27:18.396423" elapsed="0.001988"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:27:18.399025" 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-04-17T03:27:18.398657" elapsed="0.000393"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:27:18.399767" 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-04-17T03:27:18.399555" elapsed="0.000243"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:27:18.399847" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:27:18.400020" 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-04-17T03:27:18.399235" elapsed="0.000810"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:27:18.400195" elapsed="0.000222"/>
</kw>
<var name="${key}">APP_PEER_NAME</var>
<var name="${value}">example-bgp-peer-app</var>
<status status="PASS" start="2026-04-17T03:27:18.398525" elapsed="0.001932"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:27:18.401029" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:27:18.400696" elapsed="0.000359"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:27:18.401765" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:27:18.401557" elapsed="0.000233"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:27:18.401839" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:27:18.402029" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:27:18.401237" 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-04-17T03:27:18.402217" elapsed="0.001660"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:27:18.400566" elapsed="0.003354"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:27:18.404488" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:27:18.404187" elapsed="0.000327"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:27:18.405289" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:27:18.405034" elapsed="0.000281"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:27:18.405365" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:27:18.405515" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:27:18.404700" elapsed="0.000839"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:27:18.405689" elapsed="0.000221"/>
</kw>
<var name="${key}">APP_PEER_ID</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:27:18.404052" elapsed="0.001916"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:27:18.406550" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:27:18.406253" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:27:18.407370" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:27:18.407158" elapsed="0.000237"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:27:18.407450" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:27:18.407602" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:27:18.406768" elapsed="0.000858"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:27:18.407774" elapsed="0.000239"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:27:18.406118" elapsed="0.001935"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:27:18.408592" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:27:18.408293" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:27:18.409340" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:27:18.409132" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:27:18.409415" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:27:18.409564" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:27:18.408801" elapsed="0.000786"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:27:18.409736" elapsed="0.000248"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:27:18.408163" elapsed="0.001883"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:27:18.396233" elapsed="0.013849"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:27:18.410126" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:27:18.410287" 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.120', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:27:18.395062" elapsed="0.015251"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:18.394737" elapsed="0.015607"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:18.410518" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:18.410370" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:18.394710" elapsed="0.015884"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:27:18.411471" 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-04-17T03:27:18.410737" elapsed="0.000763"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:27:18.411550" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:27:18.390879" elapsed="0.020795"/>
</kw>
<msg time="2026-04-17T03:27:18.411729" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:18.378112" elapsed="0.033666"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:27:18.424104" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:18.437112" elapsed="0.000077"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:27:18.452440" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:18.452700" 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-04-17T03:27:18.452893" 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-04-17T03:27:18.453373" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:18.453212" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:27:18.453193" 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-04-17T03:27:18.453628" 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-04-17T03:27:18.453818" 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-04-17T03:27:18.454005" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:27:18.453146" elapsed="0.000915"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:27:18.453007" elapsed="0.001085"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:18.454300" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:27:18.454389" elapsed="0.000022"/>
</return>
<msg time="2026-04-17T03:27:18.454585" 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-04-17T03:27:18.373654" elapsed="0.080961"/>
</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-04-17T03:27:18.481743" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:18.481331" elapsed="0.000445"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:27:18.482738" 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-04-17T03:27:18.482464" elapsed="0.000360">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-04-17T03:27:18.482921" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:27:18.481966" elapsed="0.001003"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:18.483542" 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-04-17T03:27:18.483138" elapsed="0.000432"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:27:18.483878" 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-04-17T03:27:18.484124" 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-04-17T03:27:18.483734" elapsed="0.000419"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:18.484578" 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-04-17T03:27:18.484319" 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-04-17T03:27:18.485035" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:18.484701" elapsed="0.000395"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:27:18.485570" 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.120', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:18.485269" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:18.485124" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:18.484680" elapsed="0.000975"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:27:18.486586" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.120&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-04-17T03:27:18.485801" elapsed="0.000819"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:27:18.486687" 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/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-04-17T03:27:18.480676" elapsed="0.006171"/>
</kw>
<msg time="2026-04-17T03:27:18.486905" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:18.467479" elapsed="0.019491"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:27:18.499476" 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/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-04-17T03:27:18.512411" 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/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-04-17T03:27:18.524857" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:18.525110" 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-04-17T03:27:18.525298" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:18.525729" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:18.525578" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:27:18.525559" 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-04-17T03:27:18.525976" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:18.526219" 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-04-17T03:27:18.526386" elapsed="0.000053"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:27:18.525518" elapsed="0.000955"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:27:18.525389" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:18.526655" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:27:18.526733" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:27:18.526894" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.120&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-04-17T03:27:18.464552" elapsed="0.062372"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:27:18.528385" 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-04-17T03:27:18.528092" elapsed="0.000373">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-04-17T03:27:18.528560" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:27:18.527660" elapsed="0.000924"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:18.528913" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:18.528653" elapsed="0.000335"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:27:18.529496" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:18.529203" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:18.529012" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:18.528636" elapsed="0.000942"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:18.531965" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:27:18.529727" elapsed="0.002266"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:27:18.532044" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:27:18.532200" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:27:18.527284" elapsed="0.004940"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:18.533631" 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.120</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:18.533376" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:18.534088" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.120&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-04-17T03:27:18.533830" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:18.534567" 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-04-17T03:27:18.534285" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:18.535021" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:18.534759" elapsed="0.000306"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:18.535881" 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-04-17T03:27:18.535671" elapsed="0.000236"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:27:18.536255" 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-04-17T03:27:18.536079" 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-04-17T03:27:18.536429" elapsed="0.000218"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:18.537110" 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-04-17T03:27:18.536842" elapsed="0.000312"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:27:18.537196" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:27:18.537353" 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-04-17T03:27:18.535266" elapsed="0.002111"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:27:18.543069" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:27:18.745158" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:27:19.148091" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:27:19.152747" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:27:18.539754" elapsed="0.620074">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:27:18.537446" elapsed="0.622764">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:19.160952" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:19.160326" elapsed="0.000727"/>
</branch>
<status status="FAIL" start="2026-04-17T03:27:18.537429" elapsed="0.623651">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:19.161735" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:27:19.161912" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:19.161864" elapsed="0.000124"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:27:19.161837" 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-04-17T03:27:19.162190" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:27:19.162262" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:27:18.532553" elapsed="0.629848">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:27:19.162485" elapsed="0.000017"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:27:18.362615" elapsed="0.800098">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:19.163058" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:19.162835" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:27:19.162817" elapsed="0.000338"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:27:19.163189" elapsed="0.000015"/>
</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="FAIL" start="2026-04-17T03:27:18.357898" elapsed="0.805394">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Configures bgp application peer. Openconfig is used for carbon and above.</doc>
<status status="FAIL" start="2026-04-17T03:27:18.281303" elapsed="0.882229">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:27:19.167368" elapsed="0.000356"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:27:19.167086" 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-04-17T03:27:19.169228" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:19.169041" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:19.169017" elapsed="0.000303"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:19.175183" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:19.175028" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:19.175001" elapsed="0.000263"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:19.176778" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:27:19.176141" elapsed="0.000675"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:27:19.177373" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:27:19.177042" elapsed="0.000358"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:27:19.177447" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:27:19.177650" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:27:19.175610" elapsed="0.002066"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:19.184750" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:19.184575" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:19.184539" elapsed="0.000319"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:19.186600" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:19.186455" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:19.186430" elapsed="0.000260"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:19.187338" level="INFO">${karaf_connection_index} = 16</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:27:19.186891" elapsed="0.000486"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:19.187841" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:27:19.187594" elapsed="0.000275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:19.188964" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:27:19.188569" elapsed="0.001208">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:27:19.189997" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:27:19.190061" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:19.188186" elapsed="0.001908"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:27:19.191004" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:27:19.190659" elapsed="0.001263">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:27:19.192203" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:27:19.192265" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:19.190275" elapsed="0.002023"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:27:19.193907" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.040 Bgp Functional Route Ref.Reconfigure_ODL_To_Accept_Connection"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:27:19.192771" elapsed="0.001243">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.040 Bgp Functional Route Ref.Reconfigure_ODL_To_Accept_Connection"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:27:19.192403" elapsed="0.001715">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.040 Bgp Functional Route Ref.Reconfigure_ODL_To_Accept_Connection"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:27:19.192375" elapsed="0.001793">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.040 Bgp Functional Route Ref.Reconfigure_ODL_To_Accept_Connection"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:19.194400" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:19.194715" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:19.194521" elapsed="0.000264"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:27:19.194497" elapsed="0.000322"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:27:19.194863" elapsed="0.000021"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:27:19.197993" elapsed="0.000182"/>
</kw>
<msg time="2026-04-17T03:27:19.198262" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:19.196706" elapsed="0.001713"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:19.198777" elapsed="0.000095"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:19.199295" 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-04-17T03:27:19.196026" elapsed="0.003514"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:27:19.195321" elapsed="0.004309"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:27:19.186057" elapsed="0.013694">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.040 Bgp Functional Route Ref.Reconfigure_ODL_To_Accept_Connection"</status>
</kw>
<msg time="2026-04-17T03:27:19.199890" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:27:19.199960" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.040 Bgp Functional Route Ref.Reconfigure_ODL_To_Accept_Connection"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:19.185119" elapsed="0.014867"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:27:19.200179" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:19.200067" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:19.200046" elapsed="0.000200"/>
</if>
<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-04-17T03:27:19.201201" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:19.201068" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:19.201048" elapsed="0.000225"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:19.201584" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:27:19.201697" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:27:19.201431" elapsed="0.000357"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:19.202304" level="INFO">{1: 16}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:19.201967" elapsed="0.000383"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:19.202752" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:19.202503" elapsed="0.000296"/>
</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-04-17T03:27:19.203408" elapsed="0.000271"/>
</kw>
<msg time="2026-04-17T03:27:19.203778" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:27:19.203824" level="INFO">${old_connection_index} = 16</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:19.203012" elapsed="0.000835"/>
</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-04-17T03:27:19.204797" elapsed="0.000219"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:19.206197" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:27:19.205673" elapsed="0.001924">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:19.205186" elapsed="0.002545"/>
</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-04-17T03:27:19.208671" elapsed="0.000414"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:19.207991" elapsed="0.001209"/>
</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-04-17T03:27:19.204190" elapsed="0.005074"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:19.203924" elapsed="0.005409"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:19.203904" elapsed="0.005468"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:19.210624" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:27:19.210191" elapsed="0.000473"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:27:19.210731" elapsed="0.000052"/>
</return>
<msg time="2026-04-17T03:27:19.211012" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:27:19.209683" elapsed="0.001366"/>
</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-04-17T03:27:19.211275" elapsed="0.000607"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:19.212624" level="INFO">index=17
host=10.30.170.120
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-04-17T03:27:19.212758" level="INFO">${karaf_connection_object} = index=17
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:27:19.212148" elapsed="0.000643"/>
</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-04-17T03:27:19.212967" elapsed="0.002446"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:27:19.215900" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:27:19.217291" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:27:19.215593" elapsed="0.002223">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:27:19.237688" elapsed="0.001013"/>
</kw>
<msg time="2026-04-17T03:27:19.238889" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:19.234823" elapsed="0.004525"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:19.239594" elapsed="0.000043"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:19.239897" elapsed="0.000056"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:27:19.218880" elapsed="0.021179"/>
</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-04-17T03:27:19.218255" elapsed="0.021882"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:27:19.200715" elapsed="0.039690">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:19.241248" elapsed="0.000056"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:27:19.241406" elapsed="0.000053"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:27:19.183974" elapsed="0.057686">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:27:19.241912" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:27:19.242069" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:19.178158" elapsed="0.063937"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:19.242541" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:19.242202" elapsed="0.000415"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:19.242175" elapsed="0.000481"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:27:19.177972" elapsed="0.064724"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:27:19.177750" elapsed="0.065004"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:27:19.174606" elapsed="0.068243"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:27:19.168618" elapsed="0.074299"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:19.168034" elapsed="0.074960"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:27:19.164522" elapsed="0.078568"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:27:19.244127" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | BGP_NAME=example-bgp-peer | IP=10.30.171.238 | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | RIB_INSTANCE_NAME=example-bgp-rib | BGP_RIB_OPENCONFIG=example-bgp-ri...</msg>
<var>&amp;{mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</arg>
<arg>BGP_NAME=${BGP_PEER_NAME}</arg>
<arg>IP=${TOOLS_SYSTEM_IP}</arg>
<arg>HOLDTIME=${HOLDTIME}</arg>
<arg>PEER_PORT=${BGP_TOOL_PORT}</arg>
<arg>INITIATE=false</arg>
<arg>RIB_INSTANCE_NAME=${RIB_INSTANCE}</arg>
<arg>BGP_RIB_OPENCONFIG=${PROTOCOL_OPENCONFIG}</arg>
<arg>PASSIVE_MODE=true</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:27:19.243295" elapsed="0.000862"/>
</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-04-17T03:27:19.281136" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:19.280533" elapsed="0.000646"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:27:19.282255" 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-04-17T03:27:19.281891" elapsed="0.000474">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-04-17T03:27:19.282497" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:27:19.281411" elapsed="0.001121"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:19.283324" 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-04-17T03:27:19.282766" elapsed="0.000595"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:27:19.283780" 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-04-17T03:27:19.284020" 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-04-17T03:27:19.283587" elapsed="0.000470"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:19.284615" 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-04-17T03:27:19.284277" elapsed="0.000469"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:19.286156" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.238', '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-04-17T03:27:19.285774" elapsed="0.000449"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:27:19.286808" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:27:19.286440" elapsed="0.000402"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:27:19.287799" 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-04-17T03:27:19.287387" elapsed="0.000448"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:27:19.288892" 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-04-17T03:27:19.288534" elapsed="0.000414"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:27:19.289022" elapsed="0.000048"/>
</return>
<msg time="2026-04-17T03:27:19.289245" 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-04-17T03:27:19.288108" 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-04-17T03:27:19.289493" elapsed="0.000334"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-04-17T03:27:19.287196" elapsed="0.002686"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:27:19.290842" 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-04-17T03:27:19.290430" elapsed="0.000447"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:27:19.291875" 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-04-17T03:27:19.291587" elapsed="0.000322"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:27:19.291996" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:27:19.292202" 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-04-17T03:27:19.291150" elapsed="0.001085"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:27:19.292442" elapsed="0.000303"/>
</kw>
<var name="${key}">BGP_NAME</var>
<var name="${value}">example-bgp-peer</var>
<status status="PASS" start="2026-04-17T03:27:19.290245" elapsed="0.002583"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:27:19.293429" level="INFO">${value} = 10.30.171.238</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:27:19.293124" elapsed="0.000331"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:27:19.294397" level="INFO">${encoded} = 10.30.171.238</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:27:19.294185" elapsed="0.000238"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:27:19.294472" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:27:19.294621" level="INFO">${encoded_value} = 10.30.171.238</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:27:19.293806" elapsed="0.000840"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:27:19.294804" elapsed="0.000419"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.238</var>
<status status="PASS" start="2026-04-17T03:27:19.292984" elapsed="0.002281"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:27:19.295809" 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-04-17T03:27:19.295508" elapsed="0.000326"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:27:19.296565" 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-04-17T03:27:19.296357" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:27:19.296640" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:27:19.296794" 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-04-17T03:27:19.296038" elapsed="0.000828"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:27:19.297033" elapsed="0.000225"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:27:19.295376" elapsed="0.001922"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:27:19.297837" 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-04-17T03:27:19.297541" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:27:19.298585" 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-04-17T03:27:19.298377" elapsed="0.000270"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:27:19.298699" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:27:19.298856" 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-04-17T03:27:19.298062" elapsed="0.000818"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:27:19.299046" elapsed="0.000222"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:27:19.297409" elapsed="0.001899"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:27:19.299846" 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-04-17T03:27:19.299549" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:27:19.300596" 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-04-17T03:27:19.300388" elapsed="0.000233"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:27:19.300669" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:27:19.300846" 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-04-17T03:27:19.300073" elapsed="0.000804"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:27:19.301047" elapsed="0.000229"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:27:19.299418" elapsed="0.001898"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:27:19.301866" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:27:19.301570" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:27:19.302622" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:27:19.302413" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:27:19.302696" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:27:19.302845" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:27:19.302091" 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-04-17T03:27:19.303033" elapsed="0.000223"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:27:19.301437" elapsed="0.001860"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:27:19.303843" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:27:19.303547" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:27:19.304605" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:27:19.304396" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:27:19.304677" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:27:19.304871" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:27:19.304075" elapsed="0.000823"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:27:19.305065" elapsed="0.000228"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:27:19.303405" elapsed="0.001931"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:27:19.305883" 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-04-17T03:27:19.305578" elapsed="0.000330"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:27:19.306800" 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-04-17T03:27:19.306593" elapsed="0.000232"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:27:19.306873" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:27:19.307041" 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-04-17T03:27:19.306109" 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-04-17T03:27:19.307215" elapsed="0.000218"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:27:19.305447" elapsed="0.002026"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:27:19.286917" elapsed="0.020590"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:27:19.307550" elapsed="0.000027"/>
</return>
<msg time="2026-04-17T03:27:19.307709" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.238', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'RIB_INSTANCE_NAME': 'example-bgp-rib', 'BGP_R...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:27:19.285331" elapsed="0.022445"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:19.284885" elapsed="0.022926"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:19.308008" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:19.307838" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:19.284854" elapsed="0.023232"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:27:19.309027" 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-04-17T03:27:19.308232" elapsed="0.000825"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:27:19.309106" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:27:19.279670" elapsed="0.029560"/>
</kw>
<msg time="2026-04-17T03:27:19.309286" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:19.265355" elapsed="0.043980"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:27:19.321598" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name} 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-04-17T03:27:19.333790" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:19.346642" elapsed="0.000041"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:19.346929" elapsed="0.000042"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:19.347152" 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-04-17T03:27:19.347639" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:19.347461" elapsed="0.000239"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:27:19.347441" 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-04-17T03:27:19.347903" elapsed="0.000043"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:19.348102" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:19.348289" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:27:19.347399" elapsed="0.000949"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:27:19.347263" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:19.348550" elapsed="0.000024"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:27:19.348637" elapsed="0.000021"/>
</return>
<msg time="2026-04-17T03:27:19.348882" 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-04-17T03:27:19.261149" elapsed="0.087763"/>
</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-04-17T03:27:19.376303" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:19.375850" elapsed="0.000488"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:27:19.377201" 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-04-17T03:27:19.376869" elapsed="0.000418">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-04-17T03:27:19.377384" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:27:19.376516" elapsed="0.000892"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:19.378039" 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-04-17T03:27:19.377619" elapsed="0.000448"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:27:19.378375" 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-04-17T03:27:19.378568" 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-04-17T03:27:19.378231" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:19.379080" 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-04-17T03:27:19.378754" elapsed="0.000396"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-17T03:27:19.379594" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:19.379237" elapsed="0.000419"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:27:19.380204" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.238', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'RIB_INSTANCE_NAME': 'example-bgp-rib', 'BGP_R...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:19.379847" elapsed="0.000385"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:19.379683" elapsed="0.000584"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:19.379210" elapsed="0.001079"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:27:19.381831" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.238&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflec...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:27:19.380438" elapsed="0.001436"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:27:19.381960" 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/bgp_peer.vanadium/${file_name} 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-04-17T03:27:19.375157" elapsed="0.006958"/>
</kw>
<msg time="2026-04-17T03:27:19.382227" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:19.362264" elapsed="0.020014"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:27:19.395378" elapsed="0.000053"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name} 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-04-17T03:27:19.408259" elapsed="0.000042"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/${file_name} 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-04-17T03:27:19.421258" elapsed="0.000060"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:19.421580" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:19.421776" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:19.422288" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:19.422125" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:27:19.422105" 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-04-17T03:27:19.422525" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:19.422692" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:19.422857" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:27:19.422057" elapsed="0.000853"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:27:19.421873" elapsed="0.001113"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:19.423138" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:27:19.423220" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:27:19.423419" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.238&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflec...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:27:19.359462" elapsed="0.063991"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:27:19.425106" 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-04-17T03:27:19.424740" elapsed="0.000523">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-04-17T03:27:19.425378" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:27:19.424266" elapsed="0.001137"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:19.425827" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:19.425551" elapsed="0.000337"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:27:19.426422" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:19.426121" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:19.425913" elapsed="0.000571"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:19.425531" elapsed="0.000974"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:19.428845" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:27:19.426657" elapsed="0.002217"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:27:19.428941" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:27:19.429106" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:27:19.423837" elapsed="0.005295"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:19.430617" 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.238</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:19.430359" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:19.431084" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.238&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-04-17T03:27:19.430824" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:19.431545" 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-04-17T03:27:19.431299" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:19.431994" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:19.431738" elapsed="0.000300"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:19.432959" 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-04-17T03:27:19.432720" elapsed="0.000267"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:27:19.433354" 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-04-17T03:27:19.433144" elapsed="0.000236"/>
</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-04-17T03:27:19.433535" elapsed="0.000225"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:19.434283" 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-04-17T03:27:19.433967" elapsed="0.000365"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:27:19.434384" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:27:19.434581" 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-04-17T03:27:19.432239" elapsed="0.002373"/>
</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-04-17T03:27:19.440203" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:27:19.642371" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:27:20.045589" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:27:20.048311" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:27:19.437118" elapsed="0.616378">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:27:19.434700" elapsed="0.619017">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:20.054304" elapsed="0.000068"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:20.053808" elapsed="0.000696"/>
</branch>
<status status="FAIL" start="2026-04-17T03:27:19.434679" elapsed="0.619903">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:20.055893" elapsed="0.000059"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:27:20.056108" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:20.056054" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:27:20.056028" elapsed="0.000171"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:20.056406" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:27:20.056500" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:27:19.429529" elapsed="0.627122">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:27:20.056752" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:27:19.249228" elapsed="0.807658">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:20.057288" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:20.057058" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:27:20.057033" elapsed="0.000349"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:27:20.057415" elapsed="0.000014"/>
</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="FAIL" start="2026-04-17T03:27:19.244446" elapsed="0.813069">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Configures BGP peer module with initiate-connection set to false.</doc>
<status status="FAIL" start="2026-04-17T03:27:19.163833" elapsed="0.893914">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:27:20.059466" level="INFO">${app_rib} = 10.30.170.120</msg>
<var>${app_rib}</var>
<arg>${ODL_SYSTEM_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:20.059106" elapsed="0.000388"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:27:20.060337" level="INFO">&amp;{mapping} = { PREFIX=1.1.1.1/32 | APP_RIB=10.30.170.120 }</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-04-17T03:27:20.059826" elapsed="0.000539"/>
</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-04-17T03:27:20.095485" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:20.095002" elapsed="0.000515"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:27:20.096352" 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-04-17T03:27:20.096083" elapsed="0.000346">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-04-17T03:27:20.096523" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:27:20.095688" elapsed="0.000859"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:20.097114" 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-04-17T03:27:20.096709" elapsed="0.000432"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:27:20.097442" 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-04-17T03:27:20.097609" 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-04-17T03:27:20.097301" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:20.098053" 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-04-17T03:27:20.097788" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:20.099114" level="INFO">mapping: {'PREFIX': '1.1.1.1/32', 'APP_RIB': '10.30.170.120'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:20.098799" elapsed="0.000363"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:27:20.099590" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:27:20.099322" elapsed="0.000294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:27:20.100526" 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-04-17T03:27:20.099988" elapsed="0.000564"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:27:20.101690" 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-04-17T03:27:20.101208" elapsed="0.000522"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:27:20.101856" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:27:20.102102" 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-04-17T03:27:20.100740" 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-04-17T03:27:20.102281" elapsed="0.000503"/>
</kw>
<var name="${key}">PREFIX</var>
<var name="${value}">1.1.1.1/32</var>
<status status="PASS" start="2026-04-17T03:27:20.099836" elapsed="0.002990"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:27:20.103618" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:27:20.103111" elapsed="0.000533"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:27:20.104969" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:27:20.104482" elapsed="0.000531"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:27:20.105197" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:27:20.105420" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:27:20.103842" elapsed="0.001603"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:27:20.105597" elapsed="0.000520"/>
</kw>
<var name="${key}">APP_RIB</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:27:20.102960" elapsed="0.003201"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:27:20.099667" elapsed="0.006529"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:27:20.106238" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:27:20.106396" level="INFO">${mapping_to_use} = {'PREFIX': '1.1.1.1/32', 'APP_RIB': '10.30.170.120'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:27:20.098476" elapsed="0.007945"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:20.098173" elapsed="0.008280"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:20.106624" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:20.106477" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:20.098151" elapsed="0.008550"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:27:20.107499" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:27:20.106841" elapsed="0.000687"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:27:20.107577" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:27:20.094364" elapsed="0.013338"/>
</kw>
<msg time="2026-04-17T03:27:20.107757" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:20.081716" elapsed="0.026089"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:27:20.120278" 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/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-04-17T03:27:20.132424" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:20.144899" elapsed="0.000057"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:20.145191" 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-04-17T03:27:20.145442" 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-04-17T03:27:20.145860" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:20.145704" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:27:20.145689" elapsed="0.000273"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:20.146106" elapsed="0.000078"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:20.146337" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:20.146521" elapsed="0.000025"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:27:20.145657" elapsed="0.000924"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:27:20.145546" elapsed="0.001062"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:20.146754" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:27:20.146831" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:27:20.146988" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:27:20.077461" elapsed="0.069557"/>
</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-04-17T03:27:20.172847" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:20.172455" elapsed="0.000421"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:27:20.173653" 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-04-17T03:27:20.173392" elapsed="0.000335">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-04-17T03:27:20.173822" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:27:20.173057" elapsed="0.000789"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:20.174472" 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-04-17T03:27:20.174025" elapsed="0.000474"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:27:20.174802" 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-04-17T03:27:20.175002" 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-04-17T03:27:20.174660" elapsed="0.000372"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:20.175464" 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-04-17T03:27:20.175189" 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-04-17T03:27:20.175886" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:20.175588" elapsed="0.000371"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:27:20.176474" level="INFO">${mapping_to_use} = {'PREFIX': '1.1.1.1/32', 'APP_RIB': '10.30.170.120'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:20.176130" elapsed="0.000371"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:20.175985" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:20.175568" elapsed="0.000989"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:27:20.177342" 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-04-17T03:27:20.176702" elapsed="0.000719"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:27:20.177473" 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/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-04-17T03:27:20.171813" elapsed="0.005794"/>
</kw>
<msg time="2026-04-17T03:27:20.177662" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:20.158409" elapsed="0.019300"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:27:20.190237" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:20.202595" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:20.214673" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:20.214869" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:20.215058" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:20.215446" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:20.215283" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:27:20.215268" 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-04-17T03:27:20.215671" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:20.215887" 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-04-17T03:27:20.216082" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:27:20.215239" elapsed="0.000897"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:27:20.215135" elapsed="0.001028"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:20.216364" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:27:20.216445" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:27:20.216597" 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-04-17T03:27:20.157455" elapsed="0.059173"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:27:20.218147" 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-04-17T03:27:20.217839" elapsed="0.000383">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-04-17T03:27:20.218316" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:27:20.217457" elapsed="0.000883"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:20.218665" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:20.218409" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:27:20.219253" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:20.218952" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:20.218747" elapsed="0.000567"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:20.218391" elapsed="0.000945"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:20.221753" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:27:20.219576" elapsed="0.002204"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:27:20.221832" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:27:20.222007" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:27:20.217098" elapsed="0.004934"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:20.223610" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:27:20.223333" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:20.224066" 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-04-17T03:27:20.223809" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:20.224517" 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-04-17T03:27:20.224274" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:20.224965" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:20.224710" elapsed="0.000300"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:20.225810" 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-04-17T03:27:20.225615" elapsed="0.000224"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:27:20.226186" 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-04-17T03:27:20.226009" elapsed="0.000202"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:27:20.226359" elapsed="0.000208"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:20.226994" 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-04-17T03:27:20.226730" elapsed="0.000307"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:27:20.227078" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:27:20.227232" 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-04-17T03:27:20.225210" elapsed="0.002046"/>
</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-04-17T03:27:20.232561" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<msg time="2026-04-17T03:27:20.434213" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<msg time="2026-04-17T03:27:20.837372" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<msg time="2026-04-17T03:27:20.839976" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:27:20.229590" elapsed="0.615136">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:27:20.227324" elapsed="0.617662">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:27:20.845520" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:20.845101" elapsed="0.000568"/>
</branch>
<status status="FAIL" start="2026-04-17T03:27:20.227308" elapsed="0.618413">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:27:20.846386" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:27:20.846596" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:20.846537" elapsed="0.000126"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:27:20.846509" 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-04-17T03:27:20.846904" elapsed="0.000244"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:27:20.847215" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>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="FAIL" start="2026-04-17T03:27:20.222365" elapsed="0.625011">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:27:20.847491" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>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="FAIL" start="2026-04-17T03:27:20.066544" elapsed="0.781084">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:20.848082" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:20.847793" elapsed="0.000382"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:27:20.847767" elapsed="0.000444"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:27:20.848254" elapsed="0.000021"/>
</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="FAIL" start="2026-04-17T03:27:20.060624" elapsed="0.787771">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<var name="${prefix}">1.1.1.1/32</var>
<status status="FAIL" start="2026-04-17T03:27:20.059670" elapsed="0.788902">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</iter>
<var>${prefix}</var>
<value>1.1.1.1/32</value>
<value>2.2.2.2/32</value>
<status status="FAIL" start="2026-04-17T03:27:20.059553" elapsed="0.789116">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</for>
<kw name="Start_ExaBgp_And_Verify_Connected" owner="ExaBgpLib">
<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="NOT RUN" start="2026-04-17T03:27:20.849209" elapsed="0.000035"/>
</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-04-17T03:27:20.849524" elapsed="0.000031"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${update_count}</var>
<arg>4</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:20.849770" elapsed="0.000030"/>
</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-04-17T03:27:20.850056" elapsed="0.000029"/>
</kw>
<arg>${BGP_CFG_NAME}</arg>
<doc>Setup keyword for exa to odl test case</doc>
<status status="FAIL" start="2026-04-17T03:27:20.058660" elapsed="0.791566">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:27:20.851921" level="INFO">${output} =  </msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-04-17T03:27:20.851608" elapsed="0.000375"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:20.852630" level="INFO"> </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:20.852215" elapsed="0.000464"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:27:20.853734" 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-04-17T03:27:20.853347" elapsed="0.000415"/>
</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-04-17T03:27:20.853918" elapsed="0.000374"/>
</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-04-17T03:27:20.852950" elapsed="0.001421"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:27:20.856628" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-188-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-04-17T03:27:20.856758" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-188-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-04-17T03:27:20.854586" elapsed="0.002206"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:20.857488" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-188-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-04-17T03:27:20.857030" elapsed="0.000528"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:20.860599" 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-04-17T03:27:20.858480" elapsed="0.002193"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:27:20.940311" level="INFO">[?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-188-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-04-17T03:27:20.940508" level="INFO">${output} = [?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-188-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-04-17T03:27:20.860901" elapsed="0.079637"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:20.941430" level="INFO">[?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-188-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-04-17T03:27:20.941039" elapsed="0.000441"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:20.940662" elapsed="0.000852"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:20.940628" elapsed="0.000915"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-04-17T03:27:20.857914" elapsed="0.083687"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-04-17T03:27:20.851184" elapsed="0.090474"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:27:20.942201" level="INFO">${app_rib} = 10.30.170.120</msg>
<var>${app_rib}</var>
<arg>${ODL_SYSTEM_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:20.941885" elapsed="0.000341"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:27:20.942853" level="INFO">&amp;{mapping} = { PREFIX=http://10.30.170.120:8080 | APP_RIB=10.30.170.120 }</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-04-17T03:27:20.942394" elapsed="0.000486"/>
</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-04-17T03:27:20.986152" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:20.985680" elapsed="0.000602"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:27:20.987125" 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-04-17T03:27:20.986831" elapsed="0.000367">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-04-17T03:27:20.987294" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:27:20.986466" elapsed="0.000853"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:20.987880" 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-04-17T03:27:20.987485" elapsed="0.000422"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:27:20.988231" 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-04-17T03:27:20.988395" 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-04-17T03:27:20.988089" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:20.988822" 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-04-17T03:27:20.988575" 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-04-17T03:27:20.989986" level="INFO">mapping: {'PREFIX': 'http://10.30.170.120:8080', 'APP_RIB': '10.30.170.120'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:20.989697" elapsed="0.000334"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:27:20.990458" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:27:20.990189" elapsed="0.000294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:27:20.991164" level="INFO">${value} = http://10.30.170.120:8080</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:27:20.990842" elapsed="0.000348"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:27:20.991973" level="INFO">${encoded} = http%3A//10.30.170.120%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-04-17T03:27:20.991724" elapsed="0.000276"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:27:20.992052" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:27:20.992213" level="INFO">${encoded_value} = http%3A//10.30.170.120%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-04-17T03:27:20.991376" elapsed="0.000861"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:27:20.992386" elapsed="0.000247"/>
</kw>
<var name="${key}">PREFIX</var>
<var name="${value}">http://10.30.170.120:8080</var>
<status status="PASS" start="2026-04-17T03:27:20.990708" elapsed="0.001965"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:27:20.993563" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:27:20.992922" elapsed="0.000678"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:27:20.994471" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:27:20.994251" elapsed="0.000247"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:27:20.994548" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:27:20.994699" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:27:20.993809" 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-04-17T03:27:20.994873" elapsed="0.000244"/>
</kw>
<var name="${key}">APP_RIB</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:27:20.992790" elapsed="0.002369"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:27:20.990534" elapsed="0.004660"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:27:20.995236" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:27:20.995396" level="INFO">${mapping_to_use} = {'PREFIX': 'http%3A//10.30.170.120%3A8080', 'APP_RIB': '10.30.170.120'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:27:20.989319" elapsed="0.006103"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:20.988963" elapsed="0.006492"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:20.995633" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:20.995481" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:20.988923" elapsed="0.006838"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:27:20.996626" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:27:20.995949" elapsed="0.000714"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:27:20.996714" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/route_refresh/route/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:27:20.984866" elapsed="0.011977"/>
</kw>
<msg time="2026-04-17T03:27:20.996899" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:20.972169" elapsed="0.024824"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:27:21.011454" elapsed="0.000066"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:27:21.025556" elapsed="0.000067"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:27:21.043467" elapsed="0.000067"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:21.043843" 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-04-17T03:27:21.044120" 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-04-17T03:27:21.044717" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:21.044502" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:27:21.044478" 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-04-17T03:27:21.045094" 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-04-17T03:27:21.045366" elapsed="0.000041"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:21.045653" elapsed="0.000038"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:27:21.044416" elapsed="0.001328"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:27:21.044235" elapsed="0.001549"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:21.046080" elapsed="0.000030"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:27:21.046191" elapsed="0.000024"/>
</return>
<msg time="2026-04-17T03:27:21.046400" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:27:20.967642" elapsed="0.078798"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:21.048036" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:27:21.047582" elapsed="0.000531"/>
</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-04-17T03:27:21.053397" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<msg time="2026-04-17T03:27:21.255354" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<msg time="2026-04-17T03:27:21.658541" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<msg time="2026-04-17T03:27:21.660769" level="INFO">${response} = None</msg>
<msg time="2026-04-17T03:27:21.660846" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:27:21.050471" elapsed="0.614367">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:27:21.048215" elapsed="0.616780">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:27:21.665338" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:21.665055" elapsed="0.000374"/>
</branch>
<status status="FAIL" start="2026-04-17T03:27:21.048186" elapsed="0.617277">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:27:21.670620" 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-04-17T03:27:21.667124" elapsed="0.003549">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:27:21.666744" elapsed="0.004019">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:27:21.666717" elapsed="0.004091">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-04-17T03:27:21.673848" 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-04-17T03:27:21.671337" elapsed="0.002546">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:27:21.670905" elapsed="0.003062">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:27:21.670882" elapsed="0.003120">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:27:21.674670" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:27:21.674227" elapsed="0.000470"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:21.675029" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:21.674768" elapsed="0.000408"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:27:21.675733" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:21.675402" elapsed="0.000357"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:21.675205" elapsed="0.000590"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:21.674750" elapsed="0.001066"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:27:21.676512" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:27:21.676001" elapsed="0.000539"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:21.676851" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:21.676612" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:27:21.677458" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:21.677113" elapsed="0.000378"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:21.676949" elapsed="0.000580"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:21.676594" elapsed="0.000956"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:21.677752" elapsed="0.000496"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-17T03:27:21.678846" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:27:21.678462" elapsed="0.000420"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-04-17T03:27:21.683345" 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-04-17T03:27:21.679140" elapsed="0.004277">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-04-17T03:27:21.666062" elapsed="0.017648">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-04-17T03:27:21.683846" elapsed="0.000079"/>
</return>
<msg time="2026-04-17T03:27:21.686494" level="INFO">${response_text} = None</msg>
<msg time="2026-04-17T03:27:21.686526" 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-04-17T03:27:21.046843" elapsed="0.639713">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-04-17T03:27:21.686624" elapsed="0.000027"/>
</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="FAIL" start="2026-04-17T03:27:20.943155" elapsed="0.743652">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<doc>Teardown keyword for exa to odl test case</doc>
<status status="FAIL" start="2026-04-17T03:27:20.850596" elapsed="0.836359">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<doc>Exabgp sends route refresh and count received updates</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:27:20.058110" elapsed="1.628939">Setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))

Also teardown failed:
Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</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-04-17T03:27:21.691755" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<var>${start_cmd}</var>
<arg>${CMD} ${cfg_file}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:21.691363" elapsed="0.000421"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:21.692223" 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-04-17T03:27:21.691968" elapsed="0.000300"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:21.694962" 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-04-17T03:27:21.692883" elapsed="0.002140"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:27:21.699325" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-04-17T03:27:21.699418" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:27:21.695245" elapsed="0.004199"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:21.700127" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:27:21.699779" elapsed="0.000485"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:21.699518" elapsed="0.000795"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:21.699497" elapsed="0.000853"/>
</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-04-17T03:27:21.692510" elapsed="0.007906"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:21.702363" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<msg time="2026-04-17T03:27:21.702489" 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-04-17T03:27:21.700628" elapsed="0.001896"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:21.703114" 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-04-17T03:27:21.702746" elapsed="0.000476"/>
</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-04-17T03:27:21.690875" elapsed="0.012425"/>
</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-04-17T03:27:21.705445" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:21.705053" elapsed="0.000421"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:21.707975" 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-04-17T03:27:21.705642" elapsed="0.002369"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:27:21.711097" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:21.913029" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:22.315970" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:22.318421" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:27:21.708198" elapsed="0.614593">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:22.323166" elapsed="0.000041"/>
</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="NOT RUN" start="2026-04-17T03:27:22.323438" elapsed="0.000043"/>
</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-04-17T03:27:21.704562" elapsed="0.619111">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:27:25.327661" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:25.326627" elapsed="0.001111"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:25.333202" 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-04-17T03:27:25.328191" elapsed="0.005093"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:27:25.337351" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:25.539055" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:25.941815" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:25.944518" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:27:25.333773" elapsed="0.615997">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:25.950150" elapsed="0.000044"/>
</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="NOT RUN" start="2026-04-17T03:27:25.950420" elapsed="0.000032"/>
</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-04-17T03:27:25.325127" elapsed="0.625512">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:27:28.953272" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:28.952555" elapsed="0.000767"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:28.956671" 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-04-17T03:27:28.953573" elapsed="0.003141"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:27:28.960780" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:29.162240" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:29.564619" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:29.567266" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:27:28.957025" elapsed="0.615737">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:29.573558" elapsed="0.000087"/>
</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="NOT RUN" start="2026-04-17T03:27:29.574067" elapsed="0.000050"/>
</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-04-17T03:27:28.951443" elapsed="0.622801">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:27:29.574357" level="FAIL">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:27:21.704044" elapsed="7.870414">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:27:29.574602" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:27:29.574649" level="INFO">${value} = Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/...</msg>
<var>${status}</var>
<var>${value}</var>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:21.703527" elapsed="7.871147"/>
</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-04-17T03:27:29.575785" level="INFO">[?2004l03:27:21 | 3244   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
03:27:21 | 3244   | [01;34mversion      [0m | [1m4.2.17  [0m
03:27:21 | 3244   | [01;34minterpreter  [0m | [1m3.10.12 (main, Aug 15 2025, 14:32:43) [GCC 11.4.0][0m
03:27:21 | 3244   | [01;34mos           [0m | [1mLinux releng-26932-188-1-mininet-ovs-217-0 5.15.0-153-generic #163-Ubuntu SMP Thu Aug 7 16:37:18 UTC 2025 x86_64[0m
03:27:21 | 3244   | [01;34minstallation [0m | [1m        [0m
03:27:21 | 3244   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
03:27:21 | 3244   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
03:27:21 | 3244   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
03:27:21 | 3244   | [01;31mcli control  [0m | [1m - /run/1001/[0m
03:27:21 | 3244   | [01;31mcli control  [0m | [1m - /run/[0m
03:27:21 | 3244   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
03:27:21 | 3244   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
03:27:21 | 3244   | [01;31mcli control  [0m | [1m - /var/run/[0m
03:27:21 | 3244   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
03:27:21 | 3244   | [01;31mcli control  [0m | [1m - /run/1001/[0m
03:27:21 | 3244   | [01;31mcli control  [0m | [1m - /run/[0m
03:27:21 | 3244   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
03:27:21 | 3244   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
03:27:21 | 3244   | [01;31mcli control  [0m | [1m - /var/run/[0m
03:27:21 | 3244   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
03:27:21 | 3244   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
03:27:21 | 3244   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
03:27:21 | 3244   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
03:27:21 | 3244   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
03:27:21 | 3244   | configuration[0m | &gt; neighbor         | '10.30.170.120'[0m
03:27:21 | 3244   | configuration[0m | . router-id        | '10.30.171.238'[0m
03:27:21 | 3244   | configuration[0m | . local-address    | '10.30.171.238'[0m
03:27:21 | 3244   | configuration[0m | . local-as         | '64496'[0m
03:27:21 | 3244   | configuration[0m | . peer-as          | '64496'[0m
03:27:21 | 3244   | configuration[0m | &gt; capability       | [0m
03:27:21 | 3244   | configuration[0m | . route-refresh    | 'enable'[0m
03:27:21 | 3244   | configuration[0m | . add-path         | 'disable'[0m
03:27:21 | 3244   | configuration[0m | &lt; capability       | [0m
03:27:21 | 3244   | configuration[0m | &gt; family           | [0m
03:27:21 | 3244   | configuration[0m | . ipv4             | 'unicast'[0m
03:27:21 | 3244   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
03:27:21 | 3244   | configuration[0m | &lt; family           | [0m
03:27:21 | 3244   | configuration[0m | &gt; process          | 'exarpcserver'[0m
03:27:21 | 3244   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
03:27:21 | 3244   | [01;31mconfiguration[0m | [1m        [0m
03:27:21 | 3244   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
03:27:21 | 3244   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
03:27:21 | 3244   | [01;31mconfiguration[0m | [1m        [0m
03:27:21 | 3244   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-188-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-04-17T03:27:29.576048" level="INFO">${output} = [?2004l03:27:21 | 3244   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
03:27:21 | 3244   | [01;34mversion      [0m | [1m4.2.17  [0m
03:27:21 | 3244   | [01;34minterpreter  ...</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-04-17T03:27:29.575616" elapsed="0.000464"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:29.576589" level="INFO">[?2004l03:27:21 | 3244   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
03:27:21 | 3244   | [01;34mversion      [0m | [1m4.2.17  [0m
03:27:21 | 3244   | [01;34minterpreter  [0m | [1m3.10.12 (main, Aug 15 2025, 14:32:43) [GCC 11.4.0][0m
03:27:21 | 3244   | [01;34mos           [0m | [1mLinux releng-26932-188-1-mininet-ovs-217-0 5.15.0-153-generic #163-Ubuntu SMP Thu Aug 7 16:37:18 UTC 2025 x86_64[0m
03:27:21 | 3244   | [01;34minstallation [0m | [1m        [0m
03:27:21 | 3244   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
03:27:21 | 3244   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
03:27:21 | 3244   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
03:27:21 | 3244   | [01;31mcli control  [0m | [1m - /run/1001/[0m
03:27:21 | 3244   | [01;31mcli control  [0m | [1m - /run/[0m
03:27:21 | 3244   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
03:27:21 | 3244   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
03:27:21 | 3244   | [01;31mcli control  [0m | [1m - /var/run/[0m
03:27:21 | 3244   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
03:27:21 | 3244   | [01;31mcli control  [0m | [1m - /run/1001/[0m
03:27:21 | 3244   | [01;31mcli control  [0m | [1m - /run/[0m
03:27:21 | 3244   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
03:27:21 | 3244   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
03:27:21 | 3244   | [01;31mcli control  [0m | [1m - /var/run/[0m
03:27:21 | 3244   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
03:27:21 | 3244   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
03:27:21 | 3244   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
03:27:21 | 3244   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
03:27:21 | 3244   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
03:27:21 | 3244   | configuration[0m | &gt; neighbor         | '10.30.170.120'[0m
03:27:21 | 3244   | configuration[0m | . router-id        | '10.30.171.238'[0m
03:27:21 | 3244   | configuration[0m | . local-address    | '10.30.171.238'[0m
03:27:21 | 3244   | configuration[0m | . local-as         | '64496'[0m
03:27:21 | 3244   | configuration[0m | . peer-as          | '64496'[0m
03:27:21 | 3244   | configuration[0m | &gt; capability       | [0m
03:27:21 | 3244   | configuration[0m | . route-refresh    | 'enable'[0m
03:27:21 | 3244   | configuration[0m | . add-path         | 'disable'[0m
03:27:21 | 3244   | configuration[0m | &lt; capability       | [0m
03:27:21 | 3244   | configuration[0m | &gt; family           | [0m
03:27:21 | 3244   | configuration[0m | . ipv4             | 'unicast'[0m
03:27:21 | 3244   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
03:27:21 | 3244   | configuration[0m | &lt; family           | [0m
03:27:21 | 3244   | configuration[0m | &gt; process          | 'exarpcserver'[0m
03:27:21 | 3244   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
03:27:21 | 3244   | [01;31mconfiguration[0m | [1m        [0m
03:27:21 | 3244   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
03:27:21 | 3244   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
03:27:21 | 3244   | [01;31mconfiguration[0m | [1m        [0m
03:27:21 | 3244   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:27:29.576273" elapsed="0.000429"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:27:29.577585" 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-04-17T03:27:29.577242" elapsed="0.000371"/>
</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-04-17T03:27:29.577768" elapsed="0.000309"/>
</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-04-17T03:27:29.576959" elapsed="0.001197"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:27:29.580295" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-188-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-04-17T03:27:29.580389" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:27:29.578346" elapsed="0.002071"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:29.580867" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:27:29.580576" elapsed="0.000365"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:29.583277" 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-04-17T03:27:29.581960" elapsed="0.001375"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:27:29.584140" level="INFO">[?2004l[?2004h[jenkins@releng-26932-188-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-04-17T03:27:29.584232" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-188-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-04-17T03:27:29.583495" elapsed="0.000763"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:29.584917" level="INFO">[?2004l[?2004h[jenkins@releng-26932-188-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-04-17T03:27:29.584632" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:29.584336" elapsed="0.000675"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:29.584314" elapsed="0.000723"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-04-17T03:27:29.581487" elapsed="0.003599"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-04-17T03:27:29.575172" elapsed="0.009966"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:29.574810" elapsed="0.010355"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:29.574785" elapsed="0.010402"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="NOT RUN" start="2026-04-17T03:27:29.585361" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:29.585244" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:29.585227" elapsed="0.000199"/>
</if>
<var name="${idx}">0</var>
<status status="PASS" start="2026-04-17T03:27:21.690674" elapsed="7.894832"/>
</iter>
<iter>
<kw name="Start_ExaBgp" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:27:29.586773" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<var>${start_cmd}</var>
<arg>${CMD} ${cfg_file}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:29.586354" elapsed="0.000458"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:29.587390" 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-04-17T03:27:29.587056" elapsed="0.000398"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:29.590611" 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-04-17T03:27:29.588177" elapsed="0.002494"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:27:29.594203" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-04-17T03:27:29.594301" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:27:29.590836" elapsed="0.003492"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:29.595050" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:27:29.594755" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:29.594406" elapsed="0.000728"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:29.594383" elapsed="0.000778"/>
</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-04-17T03:27:29.587776" elapsed="0.007434"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:29.597034" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<msg time="2026-04-17T03:27:29.597134" 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-04-17T03:27:29.595364" elapsed="0.001799"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:29.597635" 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-04-17T03:27:29.597342" elapsed="0.000341"/>
</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-04-17T03:27:29.585899" elapsed="0.011841"/>
</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-04-17T03:27:29.599717" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:29.599368" elapsed="0.000389"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:29.601951" 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-04-17T03:27:29.599951" elapsed="0.002029"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:27:29.604678" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:29.806505" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:30.209614" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:30.212817" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:27:29.602143" elapsed="0.616616">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:30.219302" elapsed="0.000060"/>
</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="NOT RUN" start="2026-04-17T03:27:30.219597" elapsed="0.000031"/>
</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-04-17T03:27:29.598869" elapsed="0.620965">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:27:33.223045" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:33.222142" elapsed="0.001092"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:33.228096" 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-04-17T03:27:33.223624" elapsed="0.004534"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:27:33.234451" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:33.437207" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:33.840425" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:33.843200" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:27:33.228524" elapsed="0.619876">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:33.849041" elapsed="0.000068"/>
</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="NOT RUN" start="2026-04-17T03:27:33.849436" elapsed="0.000043"/>
</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-04-17T03:27:33.220754" elapsed="0.628933">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:27:36.851874" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:36.851230" elapsed="0.000716"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:36.857787" 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-04-17T03:27:36.852200" elapsed="0.005633"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:27:36.861593" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:37.063084" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:37.465857" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:37.468142" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:27:36.858122" elapsed="0.615877">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:37.474524" elapsed="0.000064"/>
</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="NOT RUN" start="2026-04-17T03:27:37.474977" elapsed="0.000051"/>
</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-04-17T03:27:36.850362" elapsed="0.624903">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:27:37.475615" level="FAIL">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:27:29.598329" elapsed="7.877504">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:27:37.476161" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:27:37.476263" level="INFO">${value} = Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/...</msg>
<var>${status}</var>
<var>${value}</var>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:29.597905" elapsed="7.878412"/>
</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-04-17T03:27:37.477903" level="INFO">[?2004l03:27:29 | 3248   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
03:27:29 | 3248   | [01;34mversion      [0m | [1m4.2.17  [0m
03:27:29 | 3248   | [01;34minterpreter  [0m | [1m3.10.12 (main, Aug 15 2025, 14:32:43) [GCC 11.4.0][0m
03:27:29 | 3248   | [01;34mos           [0m | [1mLinux releng-26932-188-1-mininet-ovs-217-0 5.15.0-153-generic #163-Ubuntu SMP Thu Aug 7 16:37:18 UTC 2025 x86_64[0m
03:27:29 | 3248   | [01;34minstallation [0m | [1m        [0m
03:27:29 | 3248   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
03:27:29 | 3248   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
03:27:29 | 3248   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
03:27:29 | 3248   | [01;31mcli control  [0m | [1m - /run/1001/[0m
03:27:29 | 3248   | [01;31mcli control  [0m | [1m - /run/[0m
03:27:29 | 3248   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
03:27:29 | 3248   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
03:27:29 | 3248   | [01;31mcli control  [0m | [1m - /var/run/[0m
03:27:29 | 3248   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
03:27:29 | 3248   | [01;31mcli control  [0m | [1m - /run/1001/[0m
03:27:29 | 3248   | [01;31mcli control  [0m | [1m - /run/[0m
03:27:29 | 3248   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
03:27:29 | 3248   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
03:27:29 | 3248   | [01;31mcli control  [0m | [1m - /var/run/[0m
03:27:29 | 3248   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
03:27:29 | 3248   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
03:27:29 | 3248   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
03:27:29 | 3248   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
03:27:29 | 3248   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
03:27:29 | 3248   | configuration[0m | &gt; neighbor         | '10.30.170.120'[0m
03:27:29 | 3248   | configuration[0m | . router-id        | '10.30.171.238'[0m
03:27:29 | 3248   | configuration[0m | . local-address    | '10.30.171.238'[0m
03:27:29 | 3248   | configuration[0m | . local-as         | '64496'[0m
03:27:29 | 3248   | configuration[0m | . peer-as          | '64496'[0m
03:27:29 | 3248   | configuration[0m | &gt; capability       | [0m
03:27:29 | 3248   | configuration[0m | . route-refresh    | 'enable'[0m
03:27:29 | 3248   | configuration[0m | . add-path         | 'disable'[0m
03:27:29 | 3248   | configuration[0m | &lt; capability       | [0m
03:27:29 | 3248   | configuration[0m | &gt; family           | [0m
03:27:29 | 3248   | configuration[0m | . ipv4             | 'unicast'[0m
03:27:29 | 3248   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
03:27:29 | 3248   | configuration[0m | &lt; family           | [0m
03:27:29 | 3248   | configuration[0m | &gt; process          | 'exarpcserver'[0m
03:27:29 | 3248   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
03:27:29 | 3248   | [01;31mconfiguration[0m | [1m        [0m
03:27:29 | 3248   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
03:27:29 | 3248   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
03:27:29 | 3248   | [01;31mconfiguration[0m | [1m        [0m
03:27:29 | 3248   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-188-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-04-17T03:27:37.478082" level="INFO">${output} = [?2004l03:27:29 | 3248   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
03:27:29 | 3248   | [01;34mversion      [0m | [1m4.2.17  [0m
03:27:29 | 3248   | [01;34minterpreter  ...</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-04-17T03:27:37.477751" elapsed="0.000361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:37.478600" level="INFO">[?2004l03:27:29 | 3248   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
03:27:29 | 3248   | [01;34mversion      [0m | [1m4.2.17  [0m
03:27:29 | 3248   | [01;34minterpreter  [0m | [1m3.10.12 (main, Aug 15 2025, 14:32:43) [GCC 11.4.0][0m
03:27:29 | 3248   | [01;34mos           [0m | [1mLinux releng-26932-188-1-mininet-ovs-217-0 5.15.0-153-generic #163-Ubuntu SMP Thu Aug 7 16:37:18 UTC 2025 x86_64[0m
03:27:29 | 3248   | [01;34minstallation [0m | [1m        [0m
03:27:29 | 3248   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
03:27:29 | 3248   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
03:27:29 | 3248   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
03:27:29 | 3248   | [01;31mcli control  [0m | [1m - /run/1001/[0m
03:27:29 | 3248   | [01;31mcli control  [0m | [1m - /run/[0m
03:27:29 | 3248   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
03:27:29 | 3248   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
03:27:29 | 3248   | [01;31mcli control  [0m | [1m - /var/run/[0m
03:27:29 | 3248   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
03:27:29 | 3248   | [01;31mcli control  [0m | [1m - /run/1001/[0m
03:27:29 | 3248   | [01;31mcli control  [0m | [1m - /run/[0m
03:27:29 | 3248   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
03:27:29 | 3248   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
03:27:29 | 3248   | [01;31mcli control  [0m | [1m - /var/run/[0m
03:27:29 | 3248   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
03:27:29 | 3248   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
03:27:29 | 3248   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
03:27:29 | 3248   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
03:27:29 | 3248   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
03:27:29 | 3248   | configuration[0m | &gt; neighbor         | '10.30.170.120'[0m
03:27:29 | 3248   | configuration[0m | . router-id        | '10.30.171.238'[0m
03:27:29 | 3248   | configuration[0m | . local-address    | '10.30.171.238'[0m
03:27:29 | 3248   | configuration[0m | . local-as         | '64496'[0m
03:27:29 | 3248   | configuration[0m | . peer-as          | '64496'[0m
03:27:29 | 3248   | configuration[0m | &gt; capability       | [0m
03:27:29 | 3248   | configuration[0m | . route-refresh    | 'enable'[0m
03:27:29 | 3248   | configuration[0m | . add-path         | 'disable'[0m
03:27:29 | 3248   | configuration[0m | &lt; capability       | [0m
03:27:29 | 3248   | configuration[0m | &gt; family           | [0m
03:27:29 | 3248   | configuration[0m | . ipv4             | 'unicast'[0m
03:27:29 | 3248   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
03:27:29 | 3248   | configuration[0m | &lt; family           | [0m
03:27:29 | 3248   | configuration[0m | &gt; process          | 'exarpcserver'[0m
03:27:29 | 3248   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
03:27:29 | 3248   | [01;31mconfiguration[0m | [1m        [0m
03:27:29 | 3248   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
03:27:29 | 3248   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
03:27:29 | 3248   | [01;31mconfiguration[0m | [1m        [0m
03:27:29 | 3248   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:27:37.478264" elapsed="0.000486"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:27:37.479749" 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-04-17T03:27:37.479326" elapsed="0.000456"/>
</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-04-17T03:27:37.479960" elapsed="0.000321"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-04-17T03:27:37.479011" elapsed="0.001345"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:27:37.482519" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-188-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-04-17T03:27:37.482618" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:27:37.480508" elapsed="0.002137"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:37.483096" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:27:37.482806" elapsed="0.000340"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:37.485201" 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-04-17T03:27:37.483805" elapsed="0.001455"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:27:37.486074" level="INFO">[?2004l[?2004h[jenkins@releng-26932-188-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-04-17T03:27:37.486162" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-188-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-04-17T03:27:37.485422" elapsed="0.000766"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:37.486857" level="INFO">[?2004l[?2004h[jenkins@releng-26932-188-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-04-17T03:27:37.486533" elapsed="0.000382"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:37.486266" elapsed="0.000714"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:37.486243" elapsed="0.000775"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-04-17T03:27:37.483420" elapsed="0.003663"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-04-17T03:27:37.477401" elapsed="0.009754"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:37.476543" elapsed="0.010642"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:37.476484" elapsed="0.010725"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="NOT RUN" start="2026-04-17T03:27:37.487393" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:37.487267" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:37.487250" elapsed="0.000214"/>
</if>
<var name="${idx}">1</var>
<status status="PASS" start="2026-04-17T03:27:29.585696" elapsed="7.901792"/>
</iter>
<iter>
<kw name="Start_ExaBgp" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:27:37.488630" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<var>${start_cmd}</var>
<arg>${CMD} ${cfg_file}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:37.488251" elapsed="0.000410"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:37.489097" 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-04-17T03:27:37.488820" elapsed="0.000324"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:37.491809" 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-04-17T03:27:37.490104" elapsed="0.001766"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:27:37.496749" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-04-17T03:27:37.496857" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:27:37.492058" elapsed="0.004826"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:37.497652" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:27:37.497329" elapsed="0.000372"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:37.496994" elapsed="0.000742"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:37.496968" elapsed="0.000795"/>
</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-04-17T03:27:37.489394" elapsed="0.008424"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:37.499438" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<msg time="2026-04-17T03:27:37.499529" 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-04-17T03:27:37.497994" elapsed="0.001561"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:37.500090" 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-04-17T03:27:37.499760" elapsed="0.000377"/>
</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-04-17T03:27:37.487893" elapsed="0.012303"/>
</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-04-17T03:27:37.502228" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:37.501858" elapsed="0.000411"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:37.504552" 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-04-17T03:27:37.502568" elapsed="0.002011"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:27:37.507208" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:37.708764" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:38.111814" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:38.113910" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:27:37.504742" elapsed="0.612802">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:38.117987" elapsed="0.000047"/>
</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="NOT RUN" start="2026-04-17T03:27:38.118339" elapsed="0.000035"/>
</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-04-17T03:27:37.501364" elapsed="0.617187">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:27:41.121670" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:41.120715" elapsed="0.001026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:41.126958" 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-04-17T03:27:41.122166" elapsed="0.004839"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:27:41.130953" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:41.332558" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:41.735094" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:41.737664" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:27:41.127272" elapsed="0.614436">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:41.742159" elapsed="0.000050"/>
</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="NOT RUN" start="2026-04-17T03:27:41.742475" elapsed="0.000044"/>
</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-04-17T03:27:41.119474" elapsed="0.623222">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:27:44.746484" level="INFO">${peer_check_url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</msg>
<var>${peer_check_url}</var>
<arg>${REST_API}/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:44.745410" elapsed="0.001153"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:44.750191" 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-04-17T03:27:44.746902" elapsed="0.003329"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:27:44.754232" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:44.955629" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:45.358265" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:45.360629" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:27:44.750479" elapsed="0.613731">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${rsp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:45.364715" elapsed="0.000060"/>
</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="NOT RUN" start="2026-04-17T03:27:45.365045" elapsed="0.000034"/>
</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-04-17T03:27:44.743630" elapsed="0.621626">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:27:45.365464" level="FAIL">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:27:37.500815" elapsed="7.864838">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:27:45.365899" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:27:45.366024" level="INFO">${value} = Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/...</msg>
<var>${status}</var>
<var>${value}</var>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3x</arg>
<arg>3s</arg>
<arg>Verify_ExaBgps_Connection</arg>
<arg>${session}</arg>
<arg>${exabgp_ip}</arg>
<arg>connected=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:37.500408" elapsed="7.865657"/>
</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-04-17T03:27:45.367541" level="INFO">[?2004l03:27:37 | 3252   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
03:27:37 | 3252   | [01;34mversion      [0m | [1m4.2.17  [0m
03:27:37 | 3252   | [01;34minterpreter  [0m | [1m3.10.12 (main, Aug 15 2025, 14:32:43) [GCC 11.4.0][0m
03:27:37 | 3252   | [01;34mos           [0m | [1mLinux releng-26932-188-1-mininet-ovs-217-0 5.15.0-153-generic #163-Ubuntu SMP Thu Aug 7 16:37:18 UTC 2025 x86_64[0m
03:27:37 | 3252   | [01;34minstallation [0m | [1m        [0m
03:27:37 | 3252   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
03:27:37 | 3252   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
03:27:37 | 3252   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
03:27:37 | 3252   | [01;31mcli control  [0m | [1m - /run/1001/[0m
03:27:37 | 3252   | [01;31mcli control  [0m | [1m - /run/[0m
03:27:37 | 3252   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
03:27:37 | 3252   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
03:27:37 | 3252   | [01;31mcli control  [0m | [1m - /var/run/[0m
03:27:37 | 3252   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
03:27:37 | 3252   | [01;31mcli control  [0m | [1m - /run/1001/[0m
03:27:37 | 3252   | [01;31mcli control  [0m | [1m - /run/[0m
03:27:37 | 3252   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
03:27:37 | 3252   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
03:27:37 | 3252   | [01;31mcli control  [0m | [1m - /var/run/[0m
03:27:37 | 3252   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
03:27:37 | 3252   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
03:27:37 | 3252   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
03:27:37 | 3252   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
03:27:37 | 3252   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
03:27:37 | 3252   | configuration[0m | &gt; neighbor         | '10.30.170.120'[0m
03:27:37 | 3252   | configuration[0m | . router-id        | '10.30.171.238'[0m
03:27:37 | 3252   | configuration[0m | . local-address    | '10.30.171.238'[0m
03:27:37 | 3252   | configuration[0m | . local-as         | '64496'[0m
03:27:37 | 3252   | configuration[0m | . peer-as          | '64496'[0m
03:27:37 | 3252   | configuration[0m | &gt; capability       | [0m
03:27:37 | 3252   | configuration[0m | . route-refresh    | 'enable'[0m
03:27:37 | 3252   | configuration[0m | . add-path         | 'disable'[0m
03:27:37 | 3252   | configuration[0m | &lt; capability       | [0m
03:27:37 | 3252   | configuration[0m | &gt; family           | [0m
03:27:37 | 3252   | configuration[0m | . ipv4             | 'unicast'[0m
03:27:37 | 3252   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
03:27:37 | 3252   | configuration[0m | &lt; family           | [0m
03:27:37 | 3252   | configuration[0m | &gt; process          | 'exarpcserver'[0m
03:27:37 | 3252   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
03:27:37 | 3252   | [01;31mconfiguration[0m | [1m        [0m
03:27:37 | 3252   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
03:27:37 | 3252   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
03:27:37 | 3252   | [01;31mconfiguration[0m | [1m        [0m
03:27:37 | 3252   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-188-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-04-17T03:27:45.367870" level="INFO">${output} = [?2004l03:27:37 | 3252   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
03:27:37 | 3252   | [01;34mversion      [0m | [1m4.2.17  [0m
03:27:37 | 3252   | [01;34minterpreter  ...</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-04-17T03:27:45.367326" elapsed="0.000592"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:45.369111" level="INFO">[?2004l03:27:37 | 3252   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
03:27:37 | 3252   | [01;34mversion      [0m | [1m4.2.17  [0m
03:27:37 | 3252   | [01;34minterpreter  [0m | [1m3.10.12 (main, Aug 15 2025, 14:32:43) [GCC 11.4.0][0m
03:27:37 | 3252   | [01;34mos           [0m | [1mLinux releng-26932-188-1-mininet-ovs-217-0 5.15.0-153-generic #163-Ubuntu SMP Thu Aug 7 16:37:18 UTC 2025 x86_64[0m
03:27:37 | 3252   | [01;34minstallation [0m | [1m        [0m
03:27:37 | 3252   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
03:27:37 | 3252   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
03:27:37 | 3252   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
03:27:37 | 3252   | [01;31mcli control  [0m | [1m - /run/1001/[0m
03:27:37 | 3252   | [01;31mcli control  [0m | [1m - /run/[0m
03:27:37 | 3252   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
03:27:37 | 3252   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
03:27:37 | 3252   | [01;31mcli control  [0m | [1m - /var/run/[0m
03:27:37 | 3252   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
03:27:37 | 3252   | [01;31mcli control  [0m | [1m - /run/1001/[0m
03:27:37 | 3252   | [01;31mcli control  [0m | [1m - /run/[0m
03:27:37 | 3252   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
03:27:37 | 3252   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
03:27:37 | 3252   | [01;31mcli control  [0m | [1m - /var/run/[0m
03:27:37 | 3252   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
03:27:37 | 3252   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
03:27:37 | 3252   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
03:27:37 | 3252   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
03:27:37 | 3252   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
03:27:37 | 3252   | configuration[0m | &gt; neighbor         | '10.30.170.120'[0m
03:27:37 | 3252   | configuration[0m | . router-id        | '10.30.171.238'[0m
03:27:37 | 3252   | configuration[0m | . local-address    | '10.30.171.238'[0m
03:27:37 | 3252   | configuration[0m | . local-as         | '64496'[0m
03:27:37 | 3252   | configuration[0m | . peer-as          | '64496'[0m
03:27:37 | 3252   | configuration[0m | &gt; capability       | [0m
03:27:37 | 3252   | configuration[0m | . route-refresh    | 'enable'[0m
03:27:37 | 3252   | configuration[0m | . add-path         | 'disable'[0m
03:27:37 | 3252   | configuration[0m | &lt; capability       | [0m
03:27:37 | 3252   | configuration[0m | &gt; family           | [0m
03:27:37 | 3252   | configuration[0m | . ipv4             | 'unicast'[0m
03:27:37 | 3252   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
03:27:37 | 3252   | configuration[0m | &lt; family           | [0m
03:27:37 | 3252   | configuration[0m | &gt; process          | 'exarpcserver'[0m
03:27:37 | 3252   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
03:27:37 | 3252   | [01;31mconfiguration[0m | [1m        [0m
03:27:37 | 3252   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
03:27:37 | 3252   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
03:27:37 | 3252   | [01;31mconfiguration[0m | [1m        [0m
03:27:37 | 3252   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:27:45.368216" elapsed="0.001067"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:27:45.370689" 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-04-17T03:27:45.370027" elapsed="0.000719"/>
</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-04-17T03:27:45.371099" elapsed="0.000495"/>
</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-04-17T03:27:45.369593" elapsed="0.002145"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:27:45.374045" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-188-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-04-17T03:27:45.374151" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:27:45.372084" elapsed="0.002097"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:45.374671" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:27:45.374389" elapsed="0.000333"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:45.377042" 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-04-17T03:27:45.375433" elapsed="0.001687"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:27:45.378178" level="INFO">[?2004l[?2004h[jenkins@releng-26932-188-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-04-17T03:27:45.378274" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-188-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-04-17T03:27:45.377346" elapsed="0.000954"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:45.378955" level="INFO">[?2004l[?2004h[jenkins@releng-26932-188-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-04-17T03:27:45.378653" elapsed="0.000356"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:45.378381" elapsed="0.000663"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:45.378357" elapsed="0.000713"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-04-17T03:27:45.375019" elapsed="0.004100"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-04-17T03:27:45.366705" elapsed="0.012466"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:45.366223" elapsed="0.012974"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:45.366186" elapsed="0.013034"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="NOT RUN" start="2026-04-17T03:27:45.379399" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:45.379278" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:45.379262" elapsed="0.000205"/>
</if>
<var name="${idx}">2</var>
<status status="PASS" start="2026-04-17T03:27:37.487687" elapsed="7.891861"/>
</iter>
<var>${idx}</var>
<value>${connection_retries}</value>
<status status="PASS" start="2026-04-17T03:27:21.690444" elapsed="23.689142"/>
</for>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:27:45.380131" level="FAIL">Unable to connect ExaBgp to ODL</msg>
<arg>Unable to connect ExaBgp to ODL</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:27:45.379745" elapsed="0.000463">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-04-17T03:27:21.688469" elapsed="23.691850">Unable to connect ExaBgp to ODL</status>
</kw>
<kw name="Stop_ExaBgp" owner="ExaBgpLib" type="TEARDOWN">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-04-17T03:27:45.381733" level="INFO">${output} =  </msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-04-17T03:27:45.381426" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:45.382642" level="INFO"> </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:45.382131" elapsed="0.000605"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:27:45.384185" 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-04-17T03:27:45.383554" elapsed="0.000674"/>
</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-04-17T03:27:45.384485" elapsed="0.000426"/>
</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-04-17T03:27:45.383094" elapsed="0.001939"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:27:45.387008" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-188-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-04-17T03:27:45.387149" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-188-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-04-17T03:27:45.385259" elapsed="0.001932"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:45.387814" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-188-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-04-17T03:27:45.387426" elapsed="0.000488"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:45.390893" 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-04-17T03:27:45.389080" elapsed="0.001921"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:27:45.468605" level="INFO">[?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-188-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-04-17T03:27:45.468850" level="INFO">${output} = [?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-188-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-04-17T03:27:45.391238" elapsed="0.077652"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:45.469821" level="INFO">[?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-188-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-04-17T03:27:45.469478" elapsed="0.000393"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:45.469061" elapsed="0.000844"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:45.469019" elapsed="0.000937"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-04-17T03:27:45.388372" elapsed="0.081655"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-04-17T03:27:45.380772" elapsed="0.089315"/>
</kw>
<doc>Sends route refresh request and checks if exabgp receives it</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:27:21.687568" elapsed="23.782581">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-04-17T03:27:45.474862" elapsed="0.000422"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:27:45.474497" elapsed="0.000851"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:45.476647" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:45.476498" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:45.476467" elapsed="0.000269"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:45.482709" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:45.482567" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:45.482539" elapsed="0.000268"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:45.484123" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:27:45.483530" elapsed="0.000632"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:27:45.484810" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:27:45.484391" elapsed="0.000455"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:27:45.484907" elapsed="0.000070"/>
</return>
<msg time="2026-04-17T03:27:45.485155" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:27:45.483101" elapsed="0.002088"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:45.493015" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:45.492815" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:45.492782" elapsed="0.000342"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:45.494883" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:45.494737" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:45.494711" elapsed="0.000308"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:45.495661" level="INFO">${karaf_connection_index} = 17</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:27:45.495225" elapsed="0.000472"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:45.496289" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:27:45.495985" elapsed="0.000340"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:45.497391" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:27:45.497049" elapsed="0.001461">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:27:45.498715" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:27:45.498764" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:45.496548" elapsed="0.002241"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:27:45.499888" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:27:45.499482" elapsed="0.001362">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:27:45.501111" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:27:45.501178" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:45.499021" elapsed="0.002191"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:27:45.502443" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.040 Bgp Functional Route Ref.Delete_Bgp_Peer_Configuration"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:27:45.501582" elapsed="0.000941">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.040 Bgp Functional Route Ref.Delete_Bgp_Peer_Configuration"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:27:45.501329" elapsed="0.001288">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.040 Bgp Functional Route Ref.Delete_Bgp_Peer_Configuration"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:27:45.501297" elapsed="0.001365">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.040 Bgp Functional Route Ref.Delete_Bgp_Peer_Configuration"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:45.502878" elapsed="0.000032"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:45.503217" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:45.503016" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:27:45.502991" elapsed="0.000334"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:27:45.503376" 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-04-17T03:27:45.506976" elapsed="0.000209"/>
</kw>
<msg time="2026-04-17T03:27:45.507277" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:45.505548" elapsed="0.001910"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:45.507889" elapsed="0.000226"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:45.508499" 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-04-17T03:27:45.504629" elapsed="0.004136"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:27:45.503815" elapsed="0.005043"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:27:45.494320" elapsed="0.014691">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.040 Bgp Functional Route Ref.Delete_Bgp_Peer_Configuration"</status>
</kw>
<msg time="2026-04-17T03:27:45.509170" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:27:45.509235" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.040 Bgp Functional Route Ref.Delete_Bgp_Peer_Configuration"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:45.493375" elapsed="0.016001"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:27:45.509680" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:45.509505" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:45.509471" elapsed="0.000319"/>
</if>
<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-04-17T03:27:45.511150" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:45.510979" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:45.510950" elapsed="0.000309"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:45.511741" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:27:45.511916" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:27:45.511503" elapsed="0.000519"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:45.512747" level="INFO">{1: 17}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:45.512290" elapsed="0.000533"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:45.513512" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:45.513109" elapsed="0.000460"/>
</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-04-17T03:27:45.514573" elapsed="0.000499"/>
</kw>
<msg time="2026-04-17T03:27:45.515251" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:27:45.515338" level="INFO">${old_connection_index} = 17</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:45.513858" elapsed="0.001525"/>
</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-04-17T03:27:45.517157" elapsed="0.000293"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:45.519337" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:27:45.518446" elapsed="0.002189">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:45.517754" elapsed="0.003015"/>
</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-04-17T03:27:45.521660" elapsed="0.000375"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:45.521032" elapsed="0.001110"/>
</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-04-17T03:27:45.516137" elapsed="0.006068"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:45.515518" elapsed="0.006753"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:45.515481" elapsed="0.006832"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:45.523516" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:27:45.523108" elapsed="0.000476"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:27:45.523653" elapsed="0.000052"/>
</return>
<msg time="2026-04-17T03:27:45.523871" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:27:45.522625" elapsed="0.001279"/>
</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-04-17T03:27:45.524154" elapsed="0.000561"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:45.525131" level="INFO">index=18
host=10.30.170.120
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-04-17T03:27:45.525266" level="INFO">${karaf_connection_object} = index=18
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:27:45.524965" elapsed="0.000338"/>
</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-04-17T03:27:45.525503" elapsed="0.003079"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:27:45.529168" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:27:45.530579" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:27:45.528809" elapsed="0.002468">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:27:45.552087" elapsed="0.000606"/>
</kw>
<msg time="2026-04-17T03:27:45.552840" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:45.549356" elapsed="0.003735"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:45.553339" elapsed="0.000033"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:45.553583" elapsed="0.000033"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:27:45.532895" elapsed="0.020821"/>
</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-04-17T03:27:45.531909" elapsed="0.021881"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:27:45.510469" elapsed="0.043453">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:45.554490" elapsed="0.000040"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:27:45.554603" 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="FAIL" start="2026-04-17T03:27:45.492244" elapsed="0.062526">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:27:45.554955" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:27:45.555012" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:45.485830" elapsed="0.069208"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:45.555555" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:45.555132" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:45.555109" elapsed="0.000559"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:27:45.485625" elapsed="0.070081"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:27:45.485362" elapsed="0.070395"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:27:45.482037" elapsed="0.073808"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:27:45.476114" elapsed="0.079933"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:45.475506" elapsed="0.080622"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:27:45.471431" elapsed="0.084771"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:27:45.557304" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | BGP_NAME=example-bgp-peer | IP=10.30.171.238 | 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-04-17T03:27:45.556447" elapsed="0.000900"/>
</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-04-17T03:27:45.615596" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:45.615008" elapsed="0.000629"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:27:45.616871" 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-04-17T03:27:45.616503" elapsed="0.000501">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-04-17T03:27:45.617128" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:27:45.616032" elapsed="0.001127"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:45.617830" 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-04-17T03:27:45.617371" elapsed="0.000604"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:27:45.618388" 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-04-17T03:27:45.618582" 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-04-17T03:27:45.618188" elapsed="0.000432"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:45.619240" 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-04-17T03:27:45.618840" elapsed="0.000467"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:45.620796" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.238', '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-04-17T03:27:45.620433" elapsed="0.000430"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:27:45.621490" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:27:45.621104" elapsed="0.000421"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:27:45.622486" 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-04-17T03:27:45.622062" elapsed="0.000460"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:27:45.623774" 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-04-17T03:27:45.623469" elapsed="0.000341"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:27:45.623882" elapsed="0.000077"/>
</return>
<msg time="2026-04-17T03:27:45.624142" 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-04-17T03:27:45.622806" 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-04-17T03:27:45.624418" elapsed="0.000341"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-04-17T03:27:45.621840" elapsed="0.002977"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:27:45.625624" 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-04-17T03:27:45.625196" elapsed="0.000463"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:27:45.626675" 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-04-17T03:27:45.626375" elapsed="0.000334"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:27:45.626779" elapsed="0.000363"/>
</return>
<msg time="2026-04-17T03:27:45.627330" 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-04-17T03:27:45.625909" elapsed="0.001456"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:27:45.627586" elapsed="0.000318"/>
</kw>
<var name="${key}">BGP_NAME</var>
<var name="${value}">example-bgp-peer</var>
<status status="PASS" start="2026-04-17T03:27:45.624999" elapsed="0.002981"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:27:45.628793" level="INFO">${value} = 10.30.171.238</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:27:45.628340" elapsed="0.000490"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:27:45.630013" level="INFO">${encoded} = 10.30.171.238</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:27:45.629653" elapsed="0.000400"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:27:45.630137" elapsed="0.000049"/>
</return>
<msg time="2026-04-17T03:27:45.630385" level="INFO">${encoded_value} = 10.30.171.238</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:27:45.629139" elapsed="0.001285"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:27:45.630664" elapsed="0.000429"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.238</var>
<status status="PASS" start="2026-04-17T03:27:45.628142" elapsed="0.003015"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:27:45.632031" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:27:45.631534" elapsed="0.000541"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:27:45.633327" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:27:45.632951" elapsed="0.000422"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:27:45.633546" elapsed="0.000056"/>
</return>
<msg time="2026-04-17T03:27:45.633823" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:27:45.632394" elapsed="0.001463"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:27:45.634111" elapsed="0.000378"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:27:45.631341" elapsed="0.003228"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:27:45.621593" elapsed="0.013042"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:27:45.634713" elapsed="0.000051"/>
</return>
<msg time="2026-04-17T03:27:45.635050" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.238', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:27:45.619943" elapsed="0.015154"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:45.619422" elapsed="0.015734"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:45.635473" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:45.635204" elapsed="0.000361"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:45.619385" elapsed="0.016221"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:27:45.637077" 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-04-17T03:27:45.635883" elapsed="0.001242"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:27:45.637216" elapsed="0.000048"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:27:45.614135" elapsed="0.023275"/>
</kw>
<msg time="2026-04-17T03:27:45.637511" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:45.599242" elapsed="0.038376"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:27:45.655407" elapsed="0.000074"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:27:45.674132" elapsed="0.000127"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:27:45.688317" elapsed="0.000070"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:45.688711" 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-04-17T03:27:45.688990" 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-04-17T03:27:45.689568" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:45.689358" elapsed="0.000288"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:27:45.689335" 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-04-17T03:27:45.689879" 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-04-17T03:27:45.690238" 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-04-17T03:27:45.690421" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:27:45.689285" elapsed="0.001192"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:27:45.689107" elapsed="0.001398"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:45.690699" elapsed="0.000027"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:27:45.690787" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:27:45.690982" 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-04-17T03:27:45.593135" elapsed="0.097877"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:45.692454" 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.238</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:45.692092" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:27:45.698630" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:27:45.900473" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:27:46.303315" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:27:46.306557" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:27:45.695328" elapsed="0.615652">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:27:45.692612" elapsed="0.618534">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:27:46.311632" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:46.311306" elapsed="0.000432"/>
</branch>
<status status="FAIL" start="2026-04-17T03:27:45.692589" elapsed="0.619186">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:27:46.312634" elapsed="0.000040"/>
</kw>
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:27:46.312850" elapsed="0.000031"/>
</return>
<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-04-17T03:27:45.691341" elapsed="0.621715">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:27:46.313158" elapsed="0.000023"/>
</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="FAIL" start="2026-04-17T03:27:45.557670" elapsed="0.755629">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="FAIL" start="2026-04-17T03:27:45.470487" elapsed="0.843060">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:27:46.318466" elapsed="0.000364"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:27:46.318055" elapsed="0.000862"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:46.320538" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:46.320352" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:46.320321" elapsed="0.000320"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:46.328227" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:46.328107" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:46.328087" elapsed="0.000214"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:46.329396" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:27:46.328967" elapsed="0.000458"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:27:46.329892" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:27:46.329590" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:27:46.329980" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:27:46.330145" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:27:46.328549" elapsed="0.001620"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:46.335650" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:46.335535" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:46.335516" elapsed="0.000204"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:46.336917" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:46.336803" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:46.336785" elapsed="0.000222"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:46.337463" level="INFO">${karaf_connection_index} = 18</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:27:46.337156" elapsed="0.000334"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:46.337867" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:27:46.337649" elapsed="0.000244"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:46.338675" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:27:46.338407" elapsed="0.000991">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:27:46.339608" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:27:46.339655" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:46.338068" elapsed="0.001611"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:27:46.340644" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:27:46.340394" elapsed="0.000912">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:27:46.341491" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:27:46.341538" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:46.340020" elapsed="0.001541"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:27:46.342664" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.040 Bgp Functional Route Ref.Deconfigure_App_Peer"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:27:46.341865" elapsed="0.000864">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.040 Bgp Functional Route Ref.Deconfigure_App_Peer"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:27:46.341639" elapsed="0.001174">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.040 Bgp Functional Route Ref.Deconfigure_App_Peer"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:27:46.341619" elapsed="0.001247">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.040 Bgp Functional Route Ref.Deconfigure_App_Peer"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:46.343110" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:46.343344" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:46.343202" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:27:46.343185" elapsed="0.000234"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:27:46.343453" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:27:46.345997" elapsed="0.000174"/>
</kw>
<msg time="2026-04-17T03:27:46.346257" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:46.344954" elapsed="0.001460"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:46.346710" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:46.347087" 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-04-17T03:27:46.344312" elapsed="0.002963"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:27:46.343745" elapsed="0.003595"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:27:46.336491" elapsed="0.010938">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.040 Bgp Functional Route Ref.Deconfigure_App_Peer"</status>
</kw>
<msg time="2026-04-17T03:27:46.347536" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:27:46.347580" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.040 Bgp Functional Route Ref.Deconfigure_App_Peer"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:46.335878" elapsed="0.011725"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:27:46.347808" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:46.347687" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:46.347665" elapsed="0.000212"/>
</if>
<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-04-17T03:27:46.348893" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:46.348780" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:46.348763" elapsed="0.000215"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:46.349278" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:27:46.349389" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:27:46.349142" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:46.350050" level="INFO">{1: 18}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:46.349621" elapsed="0.000483"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:46.350540" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:46.350270" elapsed="0.000319"/>
</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-04-17T03:27:46.351424" elapsed="0.000481"/>
</kw>
<msg time="2026-04-17T03:27:46.352229" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:27:46.352306" level="INFO">${old_connection_index} = 18</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:46.350767" elapsed="0.001576"/>
</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-04-17T03:27:46.353734" elapsed="0.000501"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:46.356092" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:27:46.355386" elapsed="0.002171">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:46.354525" elapsed="0.003233"/>
</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-04-17T03:27:46.358809" elapsed="0.000524"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:46.358093" elapsed="0.001368"/>
</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-04-17T03:27:46.352820" elapsed="0.006709"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:46.352469" elapsed="0.007135"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:46.352437" elapsed="0.007206"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:46.360597" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:27:46.360273" elapsed="0.000353"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:27:46.360678" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:27:46.360841" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:27:46.359896" elapsed="0.000970"/>
</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-04-17T03:27:46.361074" elapsed="0.000453"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:46.363768" level="INFO">index=19
host=10.30.170.120
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-04-17T03:27:46.363906" level="INFO">${karaf_connection_object} = index=19
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:27:46.361708" elapsed="0.002244"/>
</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-04-17T03:27:46.364120" elapsed="0.002283"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:27:46.366851" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:27:46.368401" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:27:46.366573" elapsed="0.002298">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:27:46.386153" elapsed="0.000420"/>
</kw>
<msg time="2026-04-17T03:27:46.386700" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:46.384543" elapsed="0.002356"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:46.387480" elapsed="0.000031"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:46.387686" elapsed="0.000037"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:27:46.369834" elapsed="0.017982"/>
</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-04-17T03:27:46.369229" elapsed="0.018641"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:27:46.348462" elapsed="0.039529">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:46.388505" elapsed="0.000044"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:27:46.388625" elapsed="0.000112"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:27:46.335182" elapsed="0.053695">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:27:46.389026" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:27:46.389072" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:46.330555" elapsed="0.058540"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:46.389480" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:46.389205" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:46.389179" elapsed="0.000413"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:27:46.330409" elapsed="0.059230"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:27:46.330225" elapsed="0.059463"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:27:46.327675" elapsed="0.062096"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:27:46.319881" elapsed="0.069952"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:46.319189" elapsed="0.070693"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:27:46.314757" elapsed="0.075201"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:27:46.390821" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | APP_PEER_NAME=example-bgp-peer-app | IP=10.30.170.120 | 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-04-17T03:27:46.390145" elapsed="0.000707"/>
</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-04-17T03:27:46.439343" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:46.438823" elapsed="0.000556"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:27:46.440407" 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-04-17T03:27:46.440035" elapsed="0.000479">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-04-17T03:27:46.440647" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:27:46.439563" elapsed="0.001121"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:46.441510" 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-04-17T03:27:46.440949" elapsed="0.000601"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:27:46.442019" 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-04-17T03:27:46.442247" 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-04-17T03:27:46.441787" elapsed="0.000502"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:46.442791" 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-04-17T03:27:46.442481" 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-04-17T03:27:46.444410" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'APP_PEER_NAME': 'example-bgp-peer-app', 'IP': '10.30.170.120', '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-04-17T03:27:46.444111" elapsed="0.000365"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:27:46.445058" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:27:46.444700" elapsed="0.000386"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:27:46.445790" 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-04-17T03:27:46.445467" elapsed="0.000433"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:27:46.446718" 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-04-17T03:27:46.446467" elapsed="0.000283"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:27:46.446823" elapsed="0.000053"/>
</return>
<msg time="2026-04-17T03:27:46.447080" 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-04-17T03:27:46.446135" elapsed="0.000982"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:27:46.447288" elapsed="0.000251"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-04-17T03:27:46.445326" elapsed="0.002255"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:27:46.448299" 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-04-17T03:27:46.447896" elapsed="0.000431"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:27:46.449159" 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-04-17T03:27:46.448912" elapsed="0.000273"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:27:46.449237" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:27:46.449392" 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-04-17T03:27:46.448524" 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-04-17T03:27:46.449569" elapsed="0.000233"/>
</kw>
<var name="${key}">APP_PEER_NAME</var>
<var name="${value}">example-bgp-peer-app</var>
<status status="PASS" start="2026-04-17T03:27:46.447734" elapsed="0.002108"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:27:46.450407" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:27:46.450104" elapsed="0.000328"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:27:46.451328" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:27:46.451035" elapsed="0.000323"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:27:46.451409" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:27:46.451566" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:27:46.450687" elapsed="0.000903"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:27:46.451783" elapsed="0.000253"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:27:46.449971" elapsed="0.002108"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:27:46.452703" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:27:46.452325" elapsed="0.000404"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:27:46.453495" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:27:46.453260" elapsed="0.000263"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:27:46.453575" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:27:46.453732" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:27:46.452918" elapsed="0.000841"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:27:46.453920" elapsed="0.000256"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:27:46.452191" elapsed="0.002039"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:27:46.445140" elapsed="0.009133"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:27:46.454319" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:27:46.454543" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'APP_PEER_NAME': 'example-bgp-peer-app', 'IP': '10.30.170.120', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:27:46.443363" elapsed="0.011209"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:46.442923" elapsed="0.011684"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:46.454795" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:46.454637" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:46.442898" elapsed="0.011975"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:27:46.455722" 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-04-17T03:27:46.455041" elapsed="0.000726"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:27:46.455884" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:27:46.437841" elapsed="0.018195"/>
</kw>
<msg time="2026-04-17T03:27:46.456094" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:46.422559" elapsed="0.033588"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:27:46.469576" elapsed="0.000053"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:27:46.482415" elapsed="0.000051"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:46.497074" elapsed="0.000065"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:46.497409" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:46.497602" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:46.498062" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:46.497884" elapsed="0.000236"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:27:46.497867" 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-04-17T03:27:46.498326" 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-04-17T03:27:46.498496" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:46.498662" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:27:46.497827" elapsed="0.000887"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:27:46.497688" elapsed="0.001057"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:46.498891" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:27:46.498990" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:27:46.499157" 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-04-17T03:27:46.417982" elapsed="0.081204"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:46.500532" 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.120</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:46.500227" elapsed="0.000357"/>
</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-04-17T03:27:46.506113" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:27:46.707792" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:27:47.110225" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:27:47.112647" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:27:46.503079" elapsed="0.614430">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:27:46.500652" elapsed="0.617065">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:27:47.118263" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:47.117808" elapsed="0.000594"/>
</branch>
<status status="FAIL" start="2026-04-17T03:27:46.500634" elapsed="0.617819">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:27:47.119421" elapsed="0.000065"/>
</kw>
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:27:47.119591" elapsed="0.000041"/>
</return>
<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-04-17T03:27:46.499484" elapsed="0.620349">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:27:47.120006" elapsed="0.000037"/>
</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="FAIL" start="2026-04-17T03:27:46.391275" elapsed="0.728952">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Revert the BGP configuration to the original state: without application peer</doc>
<status status="FAIL" start="2026-04-17T03:27:46.313876" elapsed="0.806695">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:27:47.131869" level="INFO">${cd_and_command} = cd '.' &amp;&amp; rm -rf /tmp/defaultvenv</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:47.131329" elapsed="0.000586"/>
</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-04-17T03:27:47.134146" level="INFO">Executing command 'cd '.' &amp;&amp; rm -rf /tmp/defaultvenv'.</msg>
<msg time="2026-04-17T03:27:47.167429" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:27:47.167811" level="INFO">${stdout} = </msg>
<msg time="2026-04-17T03:27:47.168019" level="INFO">${stderr} = </msg>
<msg time="2026-04-17T03:27:47.168137" 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-04-17T03:27:47.133847" elapsed="0.034349"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:27:47.170719" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-04-17T03:27:47.169801" elapsed="0.001107"/>
</kw>
<msg time="2026-04-17T03:27:47.171195" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-04-17T03:27:47.171303" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:47.168750" elapsed="0.002607"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:47.172417" 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-04-17T03:27:47.171765" elapsed="0.000690"/>
</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-04-17T03:27:47.174035" level="INFO"/>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:47.173649" elapsed="0.000448"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:47.174651" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:47.174311" elapsed="0.000400"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:47.175337" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:47.174993" elapsed="0.000408"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-04-17T03:27:47.173123" elapsed="0.002355"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:47.172577" elapsed="0.002953"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:47.172544" elapsed="0.003023"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-04-17T03:27:47.175794" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:47.175646" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:47.175623" elapsed="0.000266"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:27:47.176109" elapsed="0.000044"/>
</return>
<status status="PASS" start="2026-04-17T03:27:47.175983" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:47.175960" elapsed="0.000270"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:47.176434" elapsed="0.000030"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-04-17T03:27:47.133036" elapsed="0.043566"/>
</kw>
<msg time="2026-04-17T03:27:47.176674" 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-04-17T03:27:47.132184" elapsed="0.044584"/>
</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-04-17T03:27:47.130288" elapsed="0.046615"/>
</kw>
<msg time="2026-04-17T03:27:47.176999" 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-04-17T03:27:47.123555" elapsed="0.053523"/>
</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-04-17T03:27:47.122775" elapsed="0.054409"/>
</kw>
<doc>Deletes a directory with virtual env.</doc>
<status status="PASS" start="2026-04-17T03:27:47.122319" elapsed="0.054936"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-04-17T03:27:47.177457" elapsed="0.000401"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-17T03:27:47.178199" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-17T03:27:47.178092" elapsed="0.000220"/>
</kw>
<doc>Suite teardown keyword</doc>
<status status="PASS" start="2026-04-17T03:27:47.121781" elapsed="0.056604"/>
</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-04-17T03:27:06.916924" elapsed="40.261580"/>
</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-04-17T03:27:47.281787" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:27:47.277088" elapsed="0.004757"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-17T03:27:47.276828" elapsed="0.005094"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-17T03:27:47.287325" 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-04-17T03:27:47.283251" elapsed="0.004105"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-17T03:27:47.287580" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:47.287445" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:47.287420" elapsed="0.000232"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:27:47.288198" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:27:47.287812" elapsed="0.000429"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-17T03:27:47.288713" 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-04-17T03:27:47.288403" elapsed="0.000336"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Convert To Integer" owner="BuiltIn">
<arg>${cluster_size}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-17T03:27:47.289296" elapsed="0.000298"/>
</kw>
<msg time="2026-04-17T03:27:47.289692" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:27:47.289740" level="INFO">${possibly_int_of_members} = 1</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:47.288953" elapsed="0.000810"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:47.290400" 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-04-17T03:27:47.289967" elapsed="0.000461"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:27:47.291456" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:27:47.291174" elapsed="0.000308"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:27:47.291886" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:27:47.291631" elapsed="0.000281"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:27:47.292439" 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-04-17T03:27:47.292089" elapsed="0.000383"/>
</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-04-17T03:27:47.296128" elapsed="0.000274"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:27:47.297043" level="INFO">${member_ip} = 10.30.170.120</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:47.296608" 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-04-17T03:27:47.297293" elapsed="0.000302"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:27:47.298612" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:47.298294" elapsed="0.000345"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-17T03:27:47.298689" elapsed="0.000059"/>
</return>
<msg time="2026-04-17T03:27:47.298917" 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-04-17T03:27:47.297855" elapsed="0.001106"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:27:47.299587" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.120:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a4416c5bfd0&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-04-17T03:27:47.299131" elapsed="0.000612"/>
</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-04-17T03:27:47.299904" elapsed="0.000343"/>
</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-04-17T03:27:47.295516" elapsed="0.004790"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:27:47.295315" elapsed="0.005137"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-04-17T03:27:47.292543" elapsed="0.007944"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:27:47.301238" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:27:47.300651" elapsed="0.000631"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:27:47.301858" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.120'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:27:47.301445" elapsed="0.000476"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:27:47.302690" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:27:47.302159" elapsed="0.000587"/>
</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-04-17T03:27:47.290692" elapsed="0.012136"/>
</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-04-17T03:27:47.282789" elapsed="0.020123"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:47.303140" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:47.303012" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:47.302989" elapsed="0.000218"/>
</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-04-17T03:27:47.306592" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:27:47.306143" elapsed="0.000476"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:27:47.307241" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:27:47.306844" elapsed="0.000425"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:27:47.307315" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:27:47.307485" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:27:47.305788" elapsed="0.001722"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:47.308677" level="INFO">${member_ip} = 10.30.170.120</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-04-17T03:27:47.308301" elapsed="0.000411"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:47.309686" 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-04-17T03:27:47.309838" 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-04-17T03:27:47.309471" elapsed="0.000402"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:47.313992" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:47.313370" elapsed="0.000709"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:47.313348" elapsed="0.000771"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:47.314802" 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-04-17T03:27:47.315060" 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-04-17T03:27:47.314343" elapsed="0.000770"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:47.316163" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.120" 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-04-17T03:27:47.315433" elapsed="0.000837"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:47.317482" 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-04-17T03:27:47.316542" elapsed="0.000992"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-17T03:27:47.319496" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:27:47.319680" 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-04-17T03:27:47.319117" elapsed="0.000608"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:47.320107" elapsed="0.000473"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:27:47.321760" level="INFO">Logging into '10.30.170.120:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:27:47.763589" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 17 03:27:07 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:27:07 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:27:47.321419" elapsed="0.442364"/>
</kw>
<msg time="2026-04-17T03:27:47.763893" 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-04-17T03:27:47.320963" elapsed="0.443154"/>
</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-04-17T03:27:47.318141" elapsed="0.446242"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:47.765700" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-17T03:27:47.779297" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-17T03:27:47.779807" level="INFO">${stdout} = </msg>
<msg time="2026-04-17T03:27:47.780055" 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-04-17T03:27:47.764955" elapsed="0.015266"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:27:47.781057" elapsed="0.001221"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:47.784870" 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-04-17T03:27:47.783507" elapsed="0.001643"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-17T03:27:47.786047" elapsed="0.000102"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:47.785506" elapsed="0.000797"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:47.785454" elapsed="0.000930"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:27:47.787029" elapsed="0.000121"/>
</return>
<status status="PASS" start="2026-04-17T03:27:47.786554" elapsed="0.000754"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:47.786521" elapsed="0.000872"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-17T03:27:47.787520" elapsed="0.000032"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:47.794690" 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="PASS" start="2026-04-17T03:27:47.795891" elapsed="0.000502"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:27:47.796797" elapsed="0.000443"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:27:47.788550" elapsed="0.008795"/>
</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-04-17T03:27:47.312389" elapsed="0.485208"/>
</kw>
<msg time="2026-04-17T03:27:47.797705" 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-04-17T03:27:47.311488" elapsed="0.486321"/>
</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-04-17T03:27:47.310799" elapsed="0.487150"/>
</kw>
<msg time="2026-04-17T03:27:47.798015" 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-04-17T03:27:47.310093" elapsed="0.487989"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:47.802146" elapsed="0.000501"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-17T03:27:47.802879" elapsed="0.000251"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:27:47.803333" 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-04-17T03:27:47.798634" elapsed="0.004910"/>
</kw>
<msg time="2026-04-17T03:27:47.803674" 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-04-17T03:27:47.309011" elapsed="0.494696"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:47.804371" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:47.804030" elapsed="0.000398"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-17T03:27:47.804491" elapsed="0.000051"/>
</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-04-17T03:27:47.307881" elapsed="0.496788"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:27:47.307698" elapsed="0.497019"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:27:47.307564" elapsed="0.497199"/>
</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-04-17T03:27:47.303443" elapsed="0.501393"/>
</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-04-17T03:27:47.805017" elapsed="0.000221"/>
</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-04-17T03:27:47.820084" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:47.819895" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:47.819870" elapsed="0.000303"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:47.820526" 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-04-17T03:27:47.820669" 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-04-17T03:27:47.820347" elapsed="0.000349"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:47.821284" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:47.820862" elapsed="0.000471"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:47.821756" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:47.821490" elapsed="0.000313"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:47.822720" 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-04-17T03:27:47.822466" elapsed="0.000389">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-17T03:27:47.823024" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:27:47.823098" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:47.821979" elapsed="0.001159"/>
</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-04-17T03:27:47.823523" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:47.823226" elapsed="0.000403"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:47.823205" elapsed="0.000452"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:47.824587" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:27:47.824223" elapsed="0.000406"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:27:47.824692" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:27:47.824886" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:27:47.823878" elapsed="0.001073"/>
</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-04-17T03:27:47.825168" elapsed="0.000483"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:47.826004" level="INFO">index=4
host=10.30.170.120
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-04-17T03:27:47.826122" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.120
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-04-17T03:27:47.825855" elapsed="0.000583"/>
</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-04-17T03:27:47.826622" elapsed="0.002583"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:27:47.829663" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:27:47.830664" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:27:47.829373" elapsed="0.001842">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:47.835104" elapsed="0.000377"/>
</kw>
<kw name="Open 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-04-17T03:27:47.835663" elapsed="0.000217"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:27:47.836064" elapsed="0.000108"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:27:47.832373" elapsed="0.003868"/>
</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-04-17T03:27:47.831592" elapsed="0.004705"/>
</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="FAIL" start="2026-04-17T03:27:47.819547" elapsed="0.016843">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:27:48.857446" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:48.857298" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:48.857272" elapsed="0.000263"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:48.857958" 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-04-17T03:27:48.858081" 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-04-17T03:27:48.857750" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:48.858619" 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-04-17T03:27:48.858301" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:48.859108" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:48.858831" elapsed="0.000324"/>
</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-04-17T03:27:48.859836" elapsed="0.000244"/>
</kw>
<msg time="2026-04-17T03:27:48.860183" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:27:48.860230" level="INFO">${old_connection_index} = 4</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:48.859327" elapsed="0.000925"/>
</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-04-17T03:27:48.861148" elapsed="0.000142"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:48.862042" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:27:48.861821" elapsed="0.000745">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:48.861460" elapsed="0.001172"/>
</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-04-17T03:27:48.863338" elapsed="0.000103"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:48.862807" elapsed="0.000680"/>
</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-04-17T03:27:48.860557" elapsed="0.002975"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:48.860329" elapsed="0.003254"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:48.860311" elapsed="0.003383"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:48.864756" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:27:48.864474" elapsed="0.000309"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:27:48.864901" elapsed="0.000054"/>
</return>
<msg time="2026-04-17T03:27:48.865086" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:27:48.863962" elapsed="0.001149"/>
</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-04-17T03:27:48.865268" elapsed="0.000417"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:48.866011" level="INFO">index=6
host=10.30.170.120
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-04-17T03:27:48.866115" level="INFO">${karaf_connection_object} = index=6
host=10.30.170.120
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-04-17T03:27:48.865878" elapsed="0.000263"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:27:48.866301" elapsed="0.002540"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:27:48.869312" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:27:48.870809" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:27:48.869042" elapsed="0.002187">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:48.874353" elapsed="0.000360"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-17T03:27:48.874882" elapsed="0.000170"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:27:48.875202" elapsed="0.000099"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:27:48.872140" elapsed="0.003212"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:27:48.871537" elapsed="0.003859"/>
</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="FAIL" start="2026-04-17T03:27:48.856830" elapsed="0.018650">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:27:49.899390" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:49.899241" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:49.899212" elapsed="0.000268"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:49.899986" 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-04-17T03:27:49.900108" 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-04-17T03:27:49.899714" elapsed="0.000421"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:49.900613" level="INFO">{1: 6}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:49.900296" elapsed="0.000363"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:49.901071" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:49.900811" elapsed="0.000303"/>
</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-04-17T03:27:49.901704" elapsed="0.000190"/>
</kw>
<msg time="2026-04-17T03:27:49.902010" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:27:49.902056" level="INFO">${old_connection_index} = 6</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:49.901278" elapsed="0.000800"/>
</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-04-17T03:27:49.902915" elapsed="0.000156"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:49.903831" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:27:49.903628" elapsed="0.000786">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:49.903238" elapsed="0.001242"/>
</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-04-17T03:27:49.905014" elapsed="0.000101"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:49.904654" elapsed="0.000574"/>
</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-04-17T03:27:49.902394" elapsed="0.002881"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:49.902153" elapsed="0.003172"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:49.902136" elapsed="0.003219"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:49.906156" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:27:49.905864" elapsed="0.000318"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:27:49.906232" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:27:49.906388" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:27:49.905577" elapsed="0.000837"/>
</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-04-17T03:27:49.906572" elapsed="0.000464"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:49.907308" level="INFO">index=8
host=10.30.170.120
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-04-17T03:27:49.907415" level="INFO">${karaf_connection_object} = index=8
host=10.30.170.120
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-04-17T03:27:49.907203" elapsed="0.000248"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:27:49.907636" elapsed="0.004379"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:27:49.912494" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:27:49.913993" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:27:49.912196" elapsed="0.002218">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:49.917821" 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-04-17T03:27:49.918430" elapsed="0.000160"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:27:49.918740" elapsed="0.000102"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:27:49.915526" elapsed="0.003370"/>
</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-04-17T03:27:49.914789" elapsed="0.004182"/>
</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="FAIL" start="2026-04-17T03:27:49.898662" elapsed="0.020538">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:27:50.939535" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:50.939333" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:50.939293" elapsed="0.000358"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:50.940120" 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-04-17T03:27:50.940244" 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-04-17T03:27:50.939900" elapsed="0.000371"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:50.940864" level="INFO">{1: 8}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:50.940488" elapsed="0.000423"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:50.941393" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:50.941118" elapsed="0.000324"/>
</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-04-17T03:27:50.942058" elapsed="0.000195"/>
</kw>
<msg time="2026-04-17T03:27:50.942356" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:27:50.942412" level="INFO">${old_connection_index} = 8</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:50.941613" elapsed="0.000822"/>
</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-04-17T03:27:50.943486" elapsed="0.000148"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:50.944348" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:27:50.944169" elapsed="0.000721">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:50.943806" elapsed="0.001165"/>
</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-04-17T03:27:50.945498" elapsed="0.000102"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:50.945164" elapsed="0.000483"/>
</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-04-17T03:27:50.942886" elapsed="0.002806"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:50.942603" elapsed="0.003140"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:50.942583" elapsed="0.003186"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:50.946692" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:27:50.946371" elapsed="0.000348"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:27:50.946771" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:27:50.946950" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:27:50.946044" elapsed="0.000939"/>
</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-04-17T03:27:50.947185" elapsed="0.000471"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:50.947968" level="INFO">index=10
host=10.30.170.120
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-04-17T03:27:50.948074" level="INFO">${karaf_connection_object} = index=10
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:27:50.947836" elapsed="0.000265"/>
</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-04-17T03:27:50.948251" elapsed="0.158054"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:27:51.106864" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:27:51.108344" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:27:51.106544" elapsed="0.002272">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:51.112298" elapsed="0.000361"/>
</kw>
<kw name="Open 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-04-17T03:27:51.112826" elapsed="0.000178"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:27:51.113156" elapsed="0.000100"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:27:51.110018" elapsed="0.003290"/>
</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-04-17T03:27:51.109240" elapsed="0.004116"/>
</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="FAIL" start="2026-04-17T03:27:50.938848" elapsed="0.174593">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:27:51.113531" level="FAIL">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<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="FAIL" start="2026-04-17T03:27:47.806040" elapsed="3.307585">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:47.805600" elapsed="3.308091"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:27:47.805458" elapsed="3.308274"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-04-17T03:27:47.805298" elapsed="3.308528"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-17T03:27:47.282255" elapsed="3.831633"/>
</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-04-17T03:27:51.116610" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:51.116494" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:51.116472" elapsed="0.000210"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:51.122135" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:51.121999" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:51.121975" elapsed="0.000245"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:51.123447" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:27:51.122957" elapsed="0.000525"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:27:51.124110" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:27:51.123691" elapsed="0.000452"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:27:51.124200" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:27:51.124401" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:27:51.122513" elapsed="0.001921"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:51.131070" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:51.130896" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:51.130877" 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-04-17T03:27:51.132425" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:51.132275" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:51.132254" elapsed="0.000257"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:51.133128" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:27:51.132703" elapsed="0.000457"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:51.133553" 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-04-17T03:27:51.133322" elapsed="0.000259"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:51.135182" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:27:51.134568" elapsed="0.001431">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:27:51.136144" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:27:51.136190" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:51.133774" elapsed="0.002439"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:27:51.137314" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:27:51.136887" elapsed="0.001232">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:27:51.138259" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:27:51.138306" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:51.136382" elapsed="0.001947"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:27:51.139366" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/020_bgp_functional_multipath.robot"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:27:51.138667" elapsed="0.000781">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/020_bgp_functional_multipath.robot"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:27:51.138405" elapsed="0.001199">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/020_bgp_functional_multipath.robot"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:27:51.138386" elapsed="0.001258">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/020_bgp_functional_multipath.robot"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:51.139848" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:51.140191" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:51.139956" elapsed="0.000412"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:27:51.139937" elapsed="0.000463"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:27:51.140441" elapsed="0.000018"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:51.142615" elapsed="0.000540"/>
</kw>
<kw name="Open 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-04-17T03:27:51.143504" elapsed="0.000320"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:27:51.144183" elapsed="0.000242"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:27:51.141651" elapsed="0.002864"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:27:51.140733" elapsed="0.003918"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:27:51.131952" elapsed="0.012788">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/020_bgp_functional_multipath.robot"</status>
</kw>
<msg time="2026-04-17T03:27:51.144845" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:27:51.144892" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/020_bgp_functional_multipath.robot"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:51.131298" elapsed="0.013620"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:27:51.145224" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:51.145115" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:51.145097" elapsed="0.000197"/>
</if>
<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-04-17T03:27:51.146332" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:51.146219" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:51.146047" elapsed="0.000354"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:51.146699" 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-04-17T03:27:51.146805" 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-04-17T03:27:51.146556" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:51.147270" level="INFO">{1: 10}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:51.147003" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:51.147715" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:51.147468" elapsed="0.000291"/>
</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-04-17T03:27:51.148410" elapsed="0.000351"/>
</kw>
<msg time="2026-04-17T03:27:51.148886" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:27:51.149041" level="INFO">${old_connection_index} = 10</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:51.147966" elapsed="0.001107"/>
</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-04-17T03:27:51.150283" elapsed="0.000275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:27:51.151980" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:27:51.151636" elapsed="0.000810">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:51.150797" elapsed="0.001740"/>
</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-04-17T03:27:51.153674" elapsed="0.000196"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:51.152785" elapsed="0.001179"/>
</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-04-17T03:27:51.149443" elapsed="0.004607"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:51.149169" elapsed="0.004931"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:51.149147" elapsed="0.004980"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:51.155120" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:27:51.154604" elapsed="0.000586"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:27:51.155241" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:27:51.155400" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:27:51.154331" elapsed="0.001093"/>
</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-04-17T03:27:51.155579" elapsed="0.000487"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:51.156346" level="INFO">index=13
host=10.30.170.120
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-04-17T03:27:51.156448" level="INFO">${karaf_connection_object} = index=13
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:27:51.156239" elapsed="0.000235"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:27:51.156626" elapsed="0.002378"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:27:51.159459" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:27:51.160883" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:27:51.159184" elapsed="0.002193">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:51.164866" elapsed="0.000732"/>
</kw>
<kw name="Open 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-04-17T03:27:51.165854" elapsed="0.000439"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:27:51.166510" elapsed="0.000183"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:27:51.162258" elapsed="0.004520"/>
</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-04-17T03:27:51.161689" elapsed="0.005137"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:27:51.145772" elapsed="0.021143">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:51.167293" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:27:51.167370" 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="FAIL" start="2026-04-17T03:27:51.130601" elapsed="0.036878">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:27:51.167591" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:27:51.167635" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:51.124944" elapsed="0.042714"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:51.168062" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:51.167776" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:51.167719" elapsed="0.000426"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:27:51.124720" elapsed="0.043449"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:27:51.124501" elapsed="0.043701"/>
</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-04-17T03:27:51.121614" elapsed="0.046646"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-17T03:27:51.114505" elapsed="0.053811"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:51.114066" elapsed="0.054291"/>
</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-04-17T03:27:47.276500" elapsed="3.891908"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:51.168910" level="INFO">${tools_system_conn_id} = 15</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-04-17T03:27:51.168560" elapsed="0.000399"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:27:51.169513" level="INFO">${tools_system_conn_id} = 15</msg>
<arg>${tools_system_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:27:51.169181" elapsed="0.000374"/>
</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-04-17T03:27:51.171330" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:27:51.171424" 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-04-17T03:27:51.171055" elapsed="0.000396"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:51.171612" elapsed="0.000415"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:27:51.172983" level="INFO">Logging into '10.30.171.238:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:27:51.489445" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 17 03:27:11 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:27:11 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:27:51.172582" elapsed="0.317008"/>
</kw>
<msg time="2026-04-17T03:27:51.489670" 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-04-17T03:27:51.172198" elapsed="0.317549"/>
</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-04-17T03:27:51.170598" elapsed="0.319259"/>
</kw>
<msg time="2026-04-17T03:27:51.489915" 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-04-17T03:27:51.170206" elapsed="0.319774"/>
</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-04-17T03:27:51.169766" elapsed="0.320296"/>
</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-04-17T03:27:51.496838" level="INFO">${cd_and_command} = cd '.' &amp;&amp; virtualenv /tmp/defaultvenv</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:51.496489" elapsed="0.000378"/>
</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-04-17T03:27:51.498601" level="INFO">Executing command 'cd '.' &amp;&amp; virtualenv /tmp/defaultvenv'.</msg>
<msg time="2026-04-17T03:27:51.763680" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:27:51.764156" level="INFO">${stdout} = created virtual environment CPython3.10.12.final.0-64 in 110ms
  creator CPython3Posix(dest=/tmp/defaultvenv, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=b...</msg>
<msg time="2026-04-17T03:27:51.764276" level="INFO">${stderr} = </msg>
<msg time="2026-04-17T03:27:51.764374" 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-04-17T03:27:51.498371" elapsed="0.266057"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:27:51.766819" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-04-17T03:27:51.765998" elapsed="0.000966"/>
</kw>
<msg time="2026-04-17T03:27:51.767191" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-04-17T03:27:51.767288" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:51.764995" elapsed="0.002343"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:51.769012" 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-04-17T03:27:51.767802" elapsed="0.001274"/>
</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-04-17T03:27:51.771500" level="INFO">created virtual environment CPython3.10.12.final.0-64 in 110ms
  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-04-17T03:27:51.771001" elapsed="0.000589"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:51.772170" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:51.771803" elapsed="0.000425"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:51.772875" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:51.772537" elapsed="0.000468"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-04-17T03:27:51.770199" elapsed="0.002891"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:51.769273" elapsed="0.003868"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:51.769217" elapsed="0.003962"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-04-17T03:27:51.773407" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:51.773258" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:51.773234" elapsed="0.000268"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:27:51.773697" elapsed="0.000044"/>
</return>
<status status="PASS" start="2026-04-17T03:27:51.773571" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:51.773551" elapsed="0.000268"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:51.774221" elapsed="0.000032"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-04-17T03:27:51.497600" elapsed="0.276794"/>
</kw>
<msg time="2026-04-17T03:27:51.774476" 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-04-17T03:27:51.497045" elapsed="0.277502"/>
</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-04-17T03:27:51.495844" elapsed="0.278861"/>
</kw>
<msg time="2026-04-17T03:27:51.774781" 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-04-17T03:27:51.491423" elapsed="0.283418"/>
</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-04-17T03:27:51.490891" elapsed="0.284283"/>
</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-04-17T03:27:51.785013" level="INFO">${cd_and_command} = cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install --upgrade pip; deactivate</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:51.784582" elapsed="0.000462"/>
</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-04-17T03:27:51.787122" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install --upgrade pip; deactivate'.</msg>
<msg time="2026-04-17T03:27:53.985052" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:27:53.985810" level="INFO">${stdout} = Requirement already satisfied: pip in /tmp/defaultvenv/lib/python3.10/site-packages (22.0.2)
Collecting pip
  Using cached pip-26.0.1-py3-none-any.whl (1.8 MB)
Installing collected packages: pip
  Att...</msg>
<msg time="2026-04-17T03:27:53.986048" level="INFO">${stderr} = </msg>
<msg time="2026-04-17T03:27:53.986217" 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-04-17T03:27:51.786698" elapsed="2.199612"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:27:53.992316" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-04-17T03:27:53.991203" elapsed="0.001498"/>
</kw>
<msg time="2026-04-17T03:27:53.993061" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-04-17T03:27:53.993167" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:53.987325" elapsed="0.005895"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:53.995268" 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-04-17T03:27:53.993599" elapsed="0.001727"/>
</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-04-17T03:27:53.999244" level="INFO">Requirement already satisfied: pip in /tmp/defaultvenv/lib/python3.10/site-packages (22.0.2)
Collecting pip
  Using cached pip-26.0.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.0.1</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:53.998527" elapsed="0.000860"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:54.000433" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:53.999897" elapsed="0.000888"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:54.001963" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:54.001399" elapsed="0.000711"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-04-17T03:27:53.997141" elapsed="0.005107"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:53.995620" elapsed="0.006837"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:53.995550" elapsed="0.006962"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-04-17T03:27:54.002876" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:54.002603" elapsed="0.000608"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:54.002578" elapsed="0.000674"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:27:54.003633" elapsed="0.000062"/>
</return>
<status status="PASS" start="2026-04-17T03:27:54.003332" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:54.003308" elapsed="0.000582"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:54.004135" elapsed="0.000034"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-04-17T03:27:51.785897" elapsed="2.218514"/>
</kw>
<msg time="2026-04-17T03:27:54.004535" 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-04-17T03:27:51.785215" elapsed="2.219410"/>
</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-04-17T03:27:51.783885" elapsed="2.220863"/>
</kw>
<msg time="2026-04-17T03:27:54.004825" 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-04-17T03:27:51.778348" elapsed="2.226543"/>
</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-04-17T03:27:51.777330" elapsed="2.227696"/>
</kw>
<msg time="2026-04-17T03:27:54.005096" 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-04-17T03:27:51.776677" elapsed="2.228482"/>
</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-04-17T03:27:51.776181" elapsed="2.229089"/>
</kw>
<msg time="2026-04-17T03:27:54.005330" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${upgrade_pip}</arg>
<arg>Virtual_Env_Run_Cmd_At_Cwd</arg>
<arg>pip install --upgrade pip</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:51.775419" elapsed="2.229976"/>
</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-04-17T03:27:51.490401" elapsed="2.515099"/>
</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-04-17T03:27:54.015040" level="INFO">${cd_and_command} = cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install setuptools==44.0.0; deactivate</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:54.014566" elapsed="0.000512"/>
</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-04-17T03:27:54.017204" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install setuptools==44.0.0; deactivate'.</msg>
<msg time="2026-04-17T03:27:54.846128" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:27:54.846556" 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-04-17T03:27:54.846648" level="INFO">${stderr} = </msg>
<msg time="2026-04-17T03:27:54.846709" 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-04-17T03:27:54.016769" elapsed="0.830037"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:27:54.850469" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-04-17T03:27:54.849408" elapsed="0.001236"/>
</kw>
<msg time="2026-04-17T03:27:54.851098" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-04-17T03:27:54.851189" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:54.847365" elapsed="0.003870"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:54.853102" 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-04-17T03:27:54.851644" elapsed="0.001498"/>
</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-04-17T03:27:54.856609" 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-04-17T03:27:54.856126" elapsed="0.000591"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:54.857788" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:54.857317" elapsed="0.000565"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:54.858791" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:54.858319" elapsed="0.000599"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-04-17T03:27:54.854512" elapsed="0.004581"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:54.853347" elapsed="0.005882"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:54.853308" elapsed="0.005963"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-04-17T03:27:54.859576" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:54.859356" elapsed="0.000358"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:54.859331" elapsed="0.000418"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:27:54.860132" elapsed="0.000049"/>
</return>
<status status="PASS" start="2026-04-17T03:27:54.859826" elapsed="0.000471"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:54.859804" elapsed="0.000531"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:54.860543" elapsed="0.000032"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-04-17T03:27:54.016069" elapsed="0.844677"/>
</kw>
<msg time="2026-04-17T03:27:54.860826" 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-04-17T03:27:54.015255" elapsed="0.845662"/>
</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-04-17T03:27:54.013790" elapsed="0.847459"/>
</kw>
<msg time="2026-04-17T03:27:54.861328" 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-04-17T03:27:54.009192" elapsed="0.852202"/>
</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-04-17T03:27:54.008262" elapsed="0.853271"/>
</kw>
<msg time="2026-04-17T03:27:54.861602" 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-04-17T03:27:54.007677" elapsed="0.853985"/>
</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-04-17T03:27:54.006922" elapsed="0.854859"/>
</kw>
<msg time="2026-04-17T03:27:54.861846" 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-04-17T03:27:54.006330" elapsed="0.855580"/>
</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-04-17T03:27:54.005837" elapsed="0.856213"/>
</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-04-17T03:27:54.870106" level="INFO">${cd_and_command} = cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install exabgp==3.4.16; deactivate</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:54.869723" elapsed="0.000497"/>
</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-04-17T03:27:54.872085" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install exabgp==3.4.16; deactivate'.</msg>
<msg time="2026-04-17T03:27:56.447190" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:27:56.447997" 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-04-17T03:27:56.448131" 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-04-17T03:27:56.448244" 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-04-17T03:27:54.871692" elapsed="1.576608"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:27:56.453689" level="INFO">Length is 1821.</msg>
<msg time="2026-04-17T03:27:56.454792" 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-e5k4d7on/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-e5k4d7on/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-e5k4d7on/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-e5k4d7on/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())
        File "&lt;string&gt;", line 40
          print """\
          ^^^^^^^^^
      SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed to build 'exabgp' when getting requirements to build wheel' should be empty.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="FAIL" start="2026-04-17T03:27:56.452388" elapsed="0.002999">'  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-e5k4d7on/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-e5k4d7on/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-e5k4d7on/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-e5k4d7on/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())
        File "&lt;string&gt;", line 40
          print """\
          ^^^^^^^^^
      SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed to build 'exabgp' when getting requirements to build wheel' should be empty.</status>
</kw>
<msg time="2026-04-17T03:27:56.455854" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-04-17T03:27:56.456012" level="INFO">${result} = '  error: subprocess-exited-with-error
  
  × Getting requirements to build wheel did not run successfully.
  │ exit code: 1
  ╰─&gt; [19 lines of output]
      Traceback (most recent call last):
       ...</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:56.449174" elapsed="0.006896"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:56.457277" 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-04-17T03:27:56.456327" elapsed="0.000978"/>
</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-04-17T03:27:56.459680" 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-04-17T03:27:56.459336" elapsed="0.000416"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:56.460424" 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-e5k4d7on/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-e5k4d7on/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-e5k4d7on/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-e5k4d7on/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())
        File "&lt;string&gt;", line 40
          print """\
          ^^^^^^^^^
      SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed to build 'exabgp' when getting requirements to build wheel</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:56.460097" elapsed="0.000503"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:56.461242" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:56.460903" elapsed="0.000408"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-04-17T03:27:56.458383" elapsed="0.003004"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:56.457476" elapsed="0.004012"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:56.457438" elapsed="0.004084"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-04-17T03:27:56.461735" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:56.461582" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:56.461565" elapsed="0.000298"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:27:56.462165" elapsed="0.000044"/>
</return>
<status status="PASS" start="2026-04-17T03:27:56.461917" elapsed="0.000419"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:56.461900" elapsed="0.000475"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:56.462553" elapsed="0.000026"/>
</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-04-17T03:27:54.871072" elapsed="1.591639"/>
</kw>
<msg time="2026-04-17T03:27:56.462803" 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-04-17T03:27:54.870394" elapsed="1.592470"/>
</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-04-17T03:27:54.869103" elapsed="1.593934"/>
</kw>
<msg time="2026-04-17T03:27:56.463121" 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-04-17T03:27:54.864738" elapsed="1.598449"/>
</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-04-17T03:27:54.864147" elapsed="1.599140"/>
</kw>
<msg time="2026-04-17T03:27:56.463339" 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-04-17T03:27:54.863710" elapsed="1.599675"/>
</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-04-17T03:27:54.863329" elapsed="1.600147"/>
</kw>
<msg time="2026-04-17T03:27:56.463520" 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-04-17T03:27:54.862897" elapsed="1.600668"/>
</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-04-17T03:27:54.862456" elapsed="1.601195"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:27:56.464693" level="INFO">Creating Session using : alias=config-session, url=http://10.30.170.120:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a4416ff2dd0&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-04-17T03:27:56.463842" elapsed="0.001486"/>
</kw>
<kw name="Upload_Config_Files">
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-04-17T03:27:56.494710" level="INFO">[chan 5] Opened sftp connection (server version 3)</msg>
<msg time="2026-04-17T03:27:56.504739" 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-04-17T03:27:56.466965" elapsed="0.038001"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-04-17T03:27:56.513406" 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-04-17T03:27:56.505439" elapsed="0.008107"/>
</kw>
<kw name="List Files In Directory" owner="SSHLibrary">
<msg time="2026-04-17T03:27:56.524623" 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-04-17T03:27:56.524894" 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-04-17T03:27:56.513888" elapsed="0.011111"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:56.526587" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.238/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-04-17T03:27:56.540625" 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-04-17T03:27:56.526189" elapsed="0.014642"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:56.541738" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.120/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-04-17T03:27:56.590199" 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-04-17T03:27:56.541292" elapsed="0.049142"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:56.591202" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-04-17T03:27:56.642219" 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-04-17T03:27:56.590852" elapsed="0.051597"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:56.643627" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-04-17T03:27:56.693702" 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-04-17T03:27:56.643089" elapsed="0.050810"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:56.694666" level="INFO">Executing command 'cat bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-04-17T03:27:56.745425" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:27:56.745770" level="INFO">${stdout} = neighbor 10.30.170.120 {
router-id 10.30.171.238;
local-address 10.30.171.238;
local-as 64496;
peer-as 64496;
family {
  ipv4 flow;
}
flow {
    route flow1 {
        match {
            source 10.0.0...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-17T03:27:56.694353" elapsed="0.051451"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:56.746640" level="INFO">neighbor 10.30.170.120 {
router-id 10.30.171.238;
local-address 10.30.171.238;
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-04-17T03:27:56.746232" elapsed="0.000462"/>
</kw>
<var name="${cfgfile}">bgp-flowspec-redirect.cfg</var>
<status status="PASS" start="2026-04-17T03:27:56.525781" elapsed="0.220949"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:56.747252" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.238/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-04-17T03:27:56.801255" 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-04-17T03:27:56.747068" elapsed="0.054513"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:56.803028" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.120/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-04-17T03:27:56.853595" 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-04-17T03:27:56.802336" elapsed="0.051464"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:56.854690" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-04-17T03:27:56.904838" 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-04-17T03:27:56.854299" elapsed="0.050725"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:56.905697" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-04-17T03:27:56.953314" 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-04-17T03:27:56.905375" elapsed="0.048143"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:56.954471" level="INFO">Executing command 'cat bgp-flowspec.cfg'.</msg>
<msg time="2026-04-17T03:27:57.004885" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:27:57.005281" level="INFO">${stdout} = neighbor 10.30.170.120 {
router-id 10.30.171.238;
local-address 10.30.171.238;
local-as 64496;
peer-as 64496;
family {
  ipv4 flow;
}
flow {
    route flow1 {
        match {
            source 10.0.0...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-17T03:27:56.954050" elapsed="0.051316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:57.006924" level="INFO">neighbor 10.30.170.120 {
router-id 10.30.171.238;
local-address 10.30.171.238;
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-04-17T03:27:57.005920" elapsed="0.001227"/>
</kw>
<var name="${cfgfile}">bgp-flowspec.cfg</var>
<status status="PASS" start="2026-04-17T03:27:56.746881" elapsed="0.260374"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:57.008399" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.238/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-04-17T03:27:57.057208" 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-04-17T03:27:57.008006" elapsed="0.049388"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:57.058367" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.120/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-04-17T03:27:57.109443" 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-04-17T03:27:57.057820" elapsed="0.051792"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:57.110310" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-04-17T03:27:57.160982" 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-04-17T03:27:57.110003" elapsed="0.051190"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:57.162138" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-04-17T03:27:57.213131" 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-04-17T03:27:57.161664" elapsed="0.051673"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:57.214109" level="INFO">Executing command 'cat bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-04-17T03:27:57.260763" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:27:57.261182" level="INFO">${stdout} = neighbor 10.30.170.120 {
router-id 10.30.171.238;
local-address 10.30.171.238;
local-as 64496;
peer-as 64496;
  family {
    ipv4 mpls-vpn;
  }
  static {
    route 1.1.1.0/24 {
      next-hop 10.0.25...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-17T03:27:57.213775" elapsed="0.047500"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:57.262664" level="INFO">neighbor 10.30.170.120 {
router-id 10.30.171.238;
local-address 10.30.171.238;
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-04-17T03:27:57.261816" elapsed="0.000998"/>
</kw>
<var name="${cfgfile}">bgp-l3vpn-ipv4.cfg</var>
<status status="PASS" start="2026-04-17T03:27:57.007623" elapsed="0.255297"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:57.264061" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.238/g' exa-md5.cfg'.</msg>
<msg time="2026-04-17T03:27:57.308446" 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-04-17T03:27:57.263634" elapsed="0.044953"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:57.309176" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.120/g' exa-md5.cfg'.</msg>
<msg time="2026-04-17T03:27:57.356749" 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-04-17T03:27:57.308869" elapsed="0.048040"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:57.357591" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exa-md5.cfg'.</msg>
<msg time="2026-04-17T03:27:57.405213" 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-04-17T03:27:57.357279" elapsed="0.048145"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:57.406466" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exa-md5.cfg'.</msg>
<msg time="2026-04-17T03:27:57.457401" 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-04-17T03:27:57.405904" elapsed="0.051703"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:57.458582" level="INFO">Executing command 'cat exa-md5.cfg'.</msg>
<msg time="2026-04-17T03:27:57.504887" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:27:57.505294" level="INFO">${stdout} = neighbor 10.30.170.120 {
  router-id 10.30.171.238;
  local-address 10.30.171.238;
  local-as 64496;
  peer-as 64496;
  md5-password topsecret;

  capability {
    route-refresh disable;
    add-path ...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-17T03:27:57.458180" elapsed="0.047177"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:57.506654" level="INFO">neighbor 10.30.170.120 {
  router-id 10.30.171.238;
  local-address 10.30.171.238;
  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-04-17T03:27:57.505875" elapsed="0.000890"/>
</kw>
<var name="${cfgfile}">exa-md5.cfg</var>
<status status="PASS" start="2026-04-17T03:27:57.263291" elapsed="0.243554"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:57.507900" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.238/g' exa.cfg'.</msg>
<msg time="2026-04-17T03:27:57.552610" 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-04-17T03:27:57.507513" elapsed="0.045293"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:57.553516" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.120/g' exa.cfg'.</msg>
<msg time="2026-04-17T03:27:57.600501" 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-04-17T03:27:57.553188" elapsed="0.047472"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:57.601333" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exa.cfg'.</msg>
<msg time="2026-04-17T03:27:57.648683" 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-04-17T03:27:57.601043" elapsed="0.047816"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:57.649575" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exa.cfg'.</msg>
<msg time="2026-04-17T03:27:57.696423" 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-04-17T03:27:57.649249" elapsed="0.047305"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:57.697047" level="INFO">Executing command 'cat exa.cfg'.</msg>
<msg time="2026-04-17T03:27:57.744611" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:27:57.744974" level="INFO">${stdout} = neighbor 10.30.170.120 {
router-id 10.30.171.238;
local-address 10.30.171.238;
local-as 64496;
peer-as 64496;
  capability {
    route-refresh disable;
    add-path disable;
  }

  family {
    ipv4 u...</msg>
<var>${stdout}</var>
<arg>cat ${cfgfile}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-17T03:27:57.696815" elapsed="0.048225"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:57.746270" level="INFO">neighbor 10.30.170.120 {
router-id 10.30.171.238;
local-address 10.30.171.238;
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.238;
    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-04-17T03:27:57.745536" elapsed="0.000842"/>
</kw>
<var name="${cfgfile}">exa.cfg</var>
<status status="PASS" start="2026-04-17T03:27:57.507170" elapsed="0.239284"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:57.747456" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.238/g' gobgp.cfg'.</msg>
<msg time="2026-04-17T03:27:57.796591" 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-04-17T03:27:57.747080" elapsed="0.049709"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:57.797771" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.120/g' gobgp.cfg'.</msg>
<msg time="2026-04-17T03:27:57.845421" 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-04-17T03:27:57.797278" elapsed="0.048399"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:57.846647" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' gobgp.cfg'.</msg>
<msg time="2026-04-17T03:27:57.896786" 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-04-17T03:27:57.846233" elapsed="0.050781"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:57.897978" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' gobgp.cfg'.</msg>
<msg time="2026-04-17T03:27:57.949022" 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-04-17T03:27:57.897512" elapsed="0.051735"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:57.950219" level="INFO">Executing command 'cat gobgp.cfg'.</msg>
<msg time="2026-04-17T03:27:58.001664" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:27:58.002047" level="INFO">${stdout} = [global.config]
    as = 64496
    router-id = "10.30.171.238"
    port = 17900
[[neighbors]]
    [neighbors.config]
        peer-as = 64496
        neighbor-address = "10.30.170.120"
        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-04-17T03:27:57.949795" elapsed="0.052317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:58.003444" level="INFO">[global.config]
    as = 64496
    router-id = "10.30.171.238"
    port = 17900
[[neighbors]]
    [neighbors.config]
        peer-as = 64496
        neighbor-address = "10.30.170.120"
        local-as = 64496
    [neighbors.transport.config]
        local-address = "10.30.171.238"
        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-04-17T03:27:58.002620" elapsed="0.000938"/>
</kw>
<var name="${cfgfile}">gobgp.cfg</var>
<status status="PASS" start="2026-04-17T03:27:57.746723" elapsed="0.256915"/>
</iter>
<var>${cfgfile}</var>
<value>@{cfgfiles}</value>
<status status="PASS" start="2026-04-17T03:27:56.525338" elapsed="1.478375"/>
</for>
<doc>Uploads exabgp config files</doc>
<status status="PASS" start="2026-04-17T03:27:56.466106" elapsed="1.537759"/>
</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-04-17T03:27:58.073369" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_config.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:58.072734" elapsed="0.000674"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:27:58.074275" 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-04-17T03:27:58.073984" elapsed="0.000392">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-04-17T03:27:58.074480" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:27:58.073597" elapsed="0.000909"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:58.075108" 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-04-17T03:27:58.074676" elapsed="0.000466"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:27:58.075459" 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-04-17T03:27:58.075656" 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-04-17T03:27:58.075309" elapsed="0.000429"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:58.076187" 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-04-17T03:27:58.075906" 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-04-17T03:27:58.077306" level="INFO">mapping: {'ODLIP': '10.30.170.120', 'EXAIP': '10.30.171.238', 'NPATHS': '2'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:58.076995" elapsed="0.000358"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:27:58.077799" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:27:58.077515" elapsed="0.000312"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:27:58.078909" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:27:58.078222" elapsed="0.000740"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:27:58.079994" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:27:58.079532" elapsed="0.000574"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:27:58.080383" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:27:58.080582" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:27:58.079170" elapsed="0.001440"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:27:58.080769" elapsed="0.000541"/>
</kw>
<var name="${key}">ODLIP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:27:58.078082" elapsed="0.003275"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:27:58.082079" level="INFO">${value} = 10.30.171.238</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:27:58.081616" elapsed="0.000490"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:27:58.083247" level="INFO">${encoded} = 10.30.171.238</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:27:58.082805" elapsed="0.000553"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:27:58.083635" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:27:58.083818" level="INFO">${encoded_value} = 10.30.171.238</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:27:58.082301" elapsed="0.001543"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:27:58.084021" elapsed="0.000441"/>
</kw>
<var name="${key}">EXAIP</var>
<var name="${value}">10.30.171.238</var>
<status status="PASS" start="2026-04-17T03:27:58.081479" elapsed="0.003027"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:27:58.085232" 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-04-17T03:27:58.084758" elapsed="0.000502"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:27:58.086251" 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-04-17T03:27:58.085809" elapsed="0.000554"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:27:58.086641" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:27:58.086824" 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-04-17T03:27:58.085453" 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-04-17T03:27:58.087021" elapsed="0.000448"/>
</kw>
<var name="${key}">NPATHS</var>
<var name="${value}">2</var>
<status status="PASS" start="2026-04-17T03:27:58.084624" elapsed="0.002888"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:27:58.077880" elapsed="0.009668"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:27:58.087592" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:27:58.087760" level="INFO">${mapping_to_use} = {'ODLIP': '10.30.170.120', 'EXAIP': '10.30.171.238', 'NPATHS': '2'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:27:58.076690" elapsed="0.011097"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:58.076319" elapsed="0.011502"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:58.088077" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:58.087848" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:58.076294" elapsed="0.011864"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:27:58.088799" 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-04-17T03:27:58.088308" elapsed="0.000522"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:27:58.088880" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_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-04-17T03:27:58.071546" elapsed="0.017483"/>
</kw>
<msg time="2026-04-17T03:27:58.089135" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:58.055706" elapsed="0.033508"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:27:58.102661" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_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-04-17T03:27:58.115292" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/multipaths/rib_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-04-17T03:27:58.127790" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:58.128004" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:58.128188" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:58.128562" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:58.128417" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:27:58.128402" 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-04-17T03:27:58.128779" 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-04-17T03:27:58.128958" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:58.129150" elapsed="0.000025"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:27:58.128371" elapsed="0.000843"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:27:58.128266" elapsed="0.000974"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:58.129386" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:27:58.129460" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:27:58.129589" 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-04-17T03:27:58.050116" elapsed="0.079500"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:27:58.130913" 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-04-17T03:27:58.130638" elapsed="0.000365">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-04-17T03:27:58.131100" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:27:58.130241" elapsed="0.000883"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:58.131447" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:58.131194" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:27:58.132035" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:58.131720" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:58.131527" elapsed="0.000571"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:58.131177" elapsed="0.000942"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:58.134525" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:27:58.132269" elapsed="0.002283"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:27:58.134603" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:27:58.134758" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:27:58.129960" elapsed="0.004822"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:27:58.135970" 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-04-17T03:27:58.135716" elapsed="0.000319">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-04-17T03:27:58.136133" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:27:58.135383" elapsed="0.000775"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:27:58.136362" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-17T03:27:58.136227" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:58.136210" 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-04-17T03:27:58.136587" 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-04-17T03:27:58.136754" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:27:58.136818" elapsed="0.000014"/>
</return>
<msg time="2026-04-17T03:27:58.140089" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:27:58.135104" elapsed="0.005012"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:58.141502" 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-04-17T03:27:58.141248" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:58.141963" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:58.141703" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:27:58.147351" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:27:58.348889" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:27:58.751776" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:27:58.754705" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:27:58.144187" elapsed="0.615113">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:27:58.142073" elapsed="0.617419">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:27:58.760054" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:58.759579" elapsed="0.000615"/>
</branch>
<status status="FAIL" start="2026-04-17T03:27:58.142055" elapsed="0.618235">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:27:58.761089" elapsed="0.000042"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:27:58.761300" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:58.761244" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:27:58.761215" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:58.761604" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:27:58.761702" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:27:58.140434" elapsed="0.621445">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:27:58.762018" elapsed="0.000024"/>
</return>
<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="FAIL" start="2026-04-17T03:27:58.013714" elapsed="0.748451">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>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-04-17T03:27:58.762562" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:58.762299" elapsed="0.000369"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:27:58.762274" elapsed="0.000430"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:27:58.762752" elapsed="0.000022"/>
</return>
<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="FAIL" start="2026-04-17T03:27:58.005046" elapsed="0.757862">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${rib_old}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:58.763204" elapsed="0.000032"/>
</kw>
<doc>Stores rib configuration</doc>
<status status="FAIL" start="2026-04-17T03:27:58.004246" elapsed="0.759114">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Suite setup keyword.</doc>
<status status="FAIL" start="2026-04-17T03:27:47.276099" elapsed="11.487385">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<test id="s1-s15-t1" name="Reconfigure_ODL_To_Accept_Connection" line="58">
<doc>Configures BGP peer module with initiate-connection set to false.</doc>
<status status="FAIL" start="2026-04-17T03:27:58.763646" elapsed="0.000831">Parent suite setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s15-t2" name="Odl Allpaths Exa SendReceived" line="71">
<doc>all-paths selected policy selected</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:27:58.764998" elapsed="0.000597">Parent suite setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s15-t3" name="Odl Npaths Exa SendReceived" line="81">
<doc>n-paths policy selected on odl</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:27:58.766087" elapsed="0.000581">Parent suite setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</test>
<test id="s1-s15-t4" name="Delete_Bgp_Peer_Configuration" line="91">
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="FAIL" start="2026-04-17T03:27:58.767118" elapsed="0.000672">Parent suite setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:27:58.775092" level="INFO">${cd_and_command} = cd '.' &amp;&amp; rm -rf /tmp/defaultvenv</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:58.774726" elapsed="0.000396"/>
</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-04-17T03:27:58.776616" level="INFO">Executing command 'cd '.' &amp;&amp; rm -rf /tmp/defaultvenv'.</msg>
<msg time="2026-04-17T03:27:58.809716" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:27:58.810069" level="INFO">${stdout} = </msg>
<msg time="2026-04-17T03:27:58.810181" level="INFO">${stderr} = </msg>
<msg time="2026-04-17T03:27:58.810281" 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-04-17T03:27:58.776418" elapsed="0.033917"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:27:58.812712" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-04-17T03:27:58.811847" elapsed="0.000980"/>
</kw>
<msg time="2026-04-17T03:27:58.813124" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-04-17T03:27:58.813240" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:58.810802" elapsed="0.002495"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:58.814799" 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-04-17T03:27:58.813714" elapsed="0.001146"/>
</kw>
<if>
<branch type="IF" condition="(${log_on_success} and ${success}) or (${log_on_failure} and not ${success})">
<kw name="Log_Command_Results" owner="SSHKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:58.817412" level="INFO"/>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:58.816794" elapsed="0.000717"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:58.818437" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:58.817853" elapsed="0.000679"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:58.819452" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:58.818872" elapsed="0.000716"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-04-17T03:27:58.815889" elapsed="0.003848"/>
</kw>
<status status="PASS" start="2026-04-17T03:27:58.815095" elapsed="0.004728"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:58.815041" elapsed="0.004841"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-04-17T03:27:58.820372" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:58.820045" elapsed="0.000437"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:58.820005" elapsed="0.000526"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:27:58.820855" elapsed="0.000107"/>
</return>
<status status="PASS" start="2026-04-17T03:27:58.820652" elapsed="0.000394"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:58.820617" elapsed="0.000486"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:58.821276" elapsed="0.000021"/>
</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-04-17T03:27:58.775818" elapsed="0.045642"/>
</kw>
<msg time="2026-04-17T03:27:58.821515" 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-04-17T03:27:58.775287" elapsed="0.046296"/>
</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-04-17T03:27:58.774099" elapsed="0.047567"/>
</kw>
<msg time="2026-04-17T03:27:58.821719" 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-04-17T03:27:58.770083" elapsed="0.051694"/>
</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-04-17T03:27:58.769682" elapsed="0.052173"/>
</kw>
<doc>Deletes a directory with virtual env.</doc>
<status status="PASS" start="2026-04-17T03:27:58.769061" elapsed="0.052850"/>
</kw>
<kw name="Put_As_Xml_To_Uri" owner="TemplatedRequests">
<msg time="2026-04-17T03:27:58.826186" level="FAIL">Variable '${rib_old}' not found.</msg>
<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="FAIL" start="2026-04-17T03:27:58.822142" elapsed="0.004080">Variable '${rib_old}' not found.</status>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-04-17T03:27:58.826393" elapsed="0.000305"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-17T03:27:58.826940" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-17T03:27:58.826852" elapsed="0.000173"/>
</kw>
<doc>Suite teardown keyword with old rib restoration</doc>
<status status="FAIL" start="2026-04-17T03:27:58.768583" elapsed="0.058551">Variable '${rib_old}' not found.</status>
</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-04-17T03:27:47.179682" elapsed="11.647523">Suite setup failed:
ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))

Also suite teardown failed:
Variable '${rib_old}' not found.</status>
</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-04-17T03:27:58.924751" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:27:58.920321" elapsed="0.004488"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-17T03:27:58.920066" elapsed="0.004816"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-17T03:27:58.929759" 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-04-17T03:27:58.926016" elapsed="0.003784"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-17T03:27:58.930044" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:58.929892" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:58.929865" elapsed="0.000254"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:27:58.930646" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:27:58.930280" elapsed="0.000411"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-17T03:27:58.931194" 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-04-17T03:27:58.930858" elapsed="0.000362"/>
</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-04-17T03:27:58.931739" elapsed="0.000334"/>
</kw>
<msg time="2026-04-17T03:27:58.932176" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:27:58.932224" level="INFO">${possibly_int_of_members} = 1</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:58.931392" elapsed="0.000855"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:27:58.932830" 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-04-17T03:27:58.932424" elapsed="0.000537"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:27:58.934035" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:27:58.933716" elapsed="0.000348"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:27:58.934564" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:27:58.934258" elapsed="0.000337"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:27:58.935152" 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-04-17T03:27:58.934813" elapsed="0.000370"/>
</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-04-17T03:27:58.938393" elapsed="0.000215"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:27:58.939116" level="INFO">${member_ip} = 10.30.170.120</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:58.938772" elapsed="0.000371"/>
</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-04-17T03:27:58.939334" elapsed="0.000248"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:27:58.940440" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:27:58.940142" elapsed="0.000324"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-17T03:27:58.940513" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:27:58.940676" 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-04-17T03:27:58.939783" elapsed="0.000918"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:27:58.941487" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.120:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a4417314750&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-04-17T03:27:58.940862" elapsed="0.000768"/>
</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-04-17T03:27:58.941797" elapsed="0.000236"/>
</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-04-17T03:27:58.937806" elapsed="0.004299"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:27:58.937609" elapsed="0.004542"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-04-17T03:27:58.935242" elapsed="0.006941"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:27:58.942763" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:27:58.942354" elapsed="0.000453"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:27:58.943435" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.120'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:27:58.942990" elapsed="0.000490"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:27:58.944081" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:27:58.943649" elapsed="0.000477"/>
</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-04-17T03:27:58.933235" elapsed="0.010949"/>
</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-04-17T03:27:58.925657" elapsed="0.018583"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:27:58.944453" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:58.944328" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:58.944304" elapsed="0.000218"/>
</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-04-17T03:27:58.948696" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:27:58.948127" elapsed="0.000606"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:27:58.949407" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:27:58.948983" elapsed="0.000460"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:27:58.949504" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:27:58.949718" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:27:58.947623" elapsed="0.002129"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:58.951257" level="INFO">${member_ip} = 10.30.170.120</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-04-17T03:27:58.950856" elapsed="0.000438"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:58.952462" 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-04-17T03:27:58.952606" 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-04-17T03:27:58.952213" elapsed="0.000429"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:27:58.956357" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:58.955678" elapsed="0.000770"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:58.955658" elapsed="0.000830"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:58.957194" 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-04-17T03:27:58.957459" 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-04-17T03:27:58.956694" elapsed="0.000818"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:58.958664" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.120" 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-04-17T03:27:58.957824" elapsed="0.000968"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:58.960095" 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-04-17T03:27:58.959145" elapsed="0.001002"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-17T03:27:58.962153" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:27:58.962332" 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-04-17T03:27:58.961555" elapsed="0.000821"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:58.962756" elapsed="0.000492"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:27:58.964613" level="INFO">Logging into '10.30.170.120:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:27:59.412308" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 17 03:27:07 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:27:47 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:27:58.964242" elapsed="0.448221"/>
</kw>
<msg time="2026-04-17T03:27:59.412546" 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-04-17T03:27:58.963602" elapsed="0.449136"/>
</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-04-17T03:27:58.960588" elapsed="0.452326"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:27:59.413844" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-17T03:27:59.426952" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-17T03:27:59.427196" level="INFO">${stdout} = </msg>
<msg time="2026-04-17T03:27:59.427392" 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-04-17T03:27:59.413345" elapsed="0.014127"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:27:59.428068" elapsed="0.000703"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:59.430607" 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-04-17T03:27:59.429753" elapsed="0.001029"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-17T03:27:59.431471" elapsed="0.000074"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:59.431051" elapsed="0.000617"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:59.431012" elapsed="0.000717"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:27:59.432257" elapsed="0.000104"/>
</return>
<status status="PASS" start="2026-04-17T03:27:59.431877" elapsed="0.000603"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:59.431846" elapsed="0.000695"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-17T03:27:59.432641" elapsed="0.000036"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:59.437521" elapsed="0.000731"/>
</kw>
<kw name="Open 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-04-17T03:27:59.438652" elapsed="0.000468"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:27:59.439527" elapsed="0.000343"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:27:59.433396" elapsed="0.006723"/>
</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-04-17T03:27:58.954709" elapsed="0.485664"/>
</kw>
<msg time="2026-04-17T03:27:59.440453" 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-04-17T03:27:58.953974" elapsed="0.486558"/>
</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-04-17T03:27:58.953476" elapsed="0.487170"/>
</kw>
<msg time="2026-04-17T03:27:59.440704" 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-04-17T03:27:58.952863" elapsed="0.487907"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:59.445129" 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-04-17T03:27:59.445614" elapsed="0.000147"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:27:59.445910" elapsed="0.000115"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:27:59.441220" elapsed="0.004856"/>
</kw>
<msg time="2026-04-17T03:27:59.446175" 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-04-17T03:27:58.951598" elapsed="0.494603"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:59.446646" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:59.446397" elapsed="0.000291"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-17T03:27:59.446730" elapsed="0.000030"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-17T03:27:58.950353" elapsed="0.496503"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:27:58.950103" elapsed="0.496791"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:27:58.949892" elapsed="0.497054"/>
</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-04-17T03:27:58.944745" elapsed="0.502264"/>
</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-04-17T03:27:59.447167" elapsed="0.000241"/>
</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-04-17T03:27:59.461624" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:27:59.461512" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:59.461492" elapsed="0.000201"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:59.462007" 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-04-17T03:27:59.462115" 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-04-17T03:27:59.461851" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:59.462612" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:59.462351" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:27:59.463076" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:27:59.462812" elapsed="0.000307"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:59.463921" 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-04-17T03:27:59.463691" elapsed="0.000358">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-17T03:27:59.464156" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:27:59.464201" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:59.463315" elapsed="0.000909"/>
</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-04-17T03:27:59.464523" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:27:59.464298" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-17T03:27:59.464281" elapsed="0.000340"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:27:59.465391" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:27:59.465120" elapsed="0.000297"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:27:59.465464" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:27:59.465616" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:27:59.464825" elapsed="0.000814"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-17T03:27:59.465794" elapsed="0.000453"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:27:59.466555" level="INFO">index=4
host=10.30.170.120
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-04-17T03:27:59.466660" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.120
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-04-17T03:27:59.466439" elapsed="0.000247"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:27:59.466842" elapsed="0.002245"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:27:59.469538" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:27:59.470597" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:27:59.469259" elapsed="0.001842">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:59.474356" elapsed="0.000354"/>
</kw>
<kw name="Open 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-04-17T03:27:59.474879" elapsed="0.000172"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:27:59.475202" elapsed="0.000118"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:27:59.472014" elapsed="0.003357"/>
</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-04-17T03:27:59.471448" elapsed="0.003969"/>
</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="FAIL" start="2026-04-17T03:27:59.461229" elapsed="0.014274">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:28:00.494710" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:00.494562" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:00.494534" elapsed="0.000279"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:00.495257" 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-04-17T03:28:00.495381" 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-04-17T03:28:00.495062" elapsed="0.000446"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:00.496061" 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-04-17T03:28:00.495680" elapsed="0.000448"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:00.496686" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:00.496350" elapsed="0.000395"/>
</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-04-17T03:28:00.497588" elapsed="0.000263"/>
</kw>
<msg time="2026-04-17T03:28:00.498020" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:28:00.498072" level="INFO">${old_connection_index} = 4</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:00.496997" elapsed="0.001099"/>
</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-04-17T03:28:00.499001" elapsed="0.000148"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:28:00.499901" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:28:00.499701" elapsed="0.000790">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:00.499328" elapsed="0.001230"/>
</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-04-17T03:28:00.501114" elapsed="0.000107"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:00.500736" elapsed="0.000533"/>
</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-04-17T03:28:00.498437" elapsed="0.002878"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:00.498181" elapsed="0.003184"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:00.498160" elapsed="0.003233"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:00.502280" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:28:00.501965" elapsed="0.000342"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:28:00.502360" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:28:00.502528" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:28:00.501627" elapsed="0.000926"/>
</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-04-17T03:28:00.502717" elapsed="0.000468"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:00.503483" level="INFO">index=6
host=10.30.170.120
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-04-17T03:28:00.503588" level="INFO">${karaf_connection_object} = index=6
host=10.30.170.120
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-04-17T03:28:00.503365" elapsed="0.000250"/>
</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-04-17T03:28:00.503776" elapsed="0.002530"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:28:00.506750" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:28:00.508328" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:28:00.506480" elapsed="0.002274">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:00.511958" elapsed="0.000380"/>
</kw>
<kw name="Open 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-04-17T03:28:00.512509" elapsed="0.000161"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:28:00.512824" elapsed="0.000121"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:28:00.509688" elapsed="0.003315"/>
</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-04-17T03:28:00.509122" elapsed="0.003928"/>
</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="FAIL" start="2026-04-17T03:28:00.494109" elapsed="0.019029">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:28:01.532842" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:01.532701" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:01.532674" elapsed="0.000260"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:01.533337" 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-04-17T03:28:01.533458" 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-04-17T03:28:01.533148" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:01.533968" level="INFO">{1: 6}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:01.533648" elapsed="0.000369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:01.534427" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:01.534176" elapsed="0.000297"/>
</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-04-17T03:28:01.535125" elapsed="0.000202"/>
</kw>
<msg time="2026-04-17T03:28:01.535431" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:28:01.535478" level="INFO">${old_connection_index} = 6</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:01.534641" elapsed="0.000859"/>
</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-04-17T03:28:01.536429" elapsed="0.000141"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:28:01.537309" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:28:01.537127" elapsed="0.000927">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:01.536742" elapsed="0.001376"/>
</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-04-17T03:28:01.538626" elapsed="0.000103"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:01.538291" elapsed="0.000484"/>
</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-04-17T03:28:01.535880" elapsed="0.002938"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:01.535577" elapsed="0.003292"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:01.535558" elapsed="0.003346"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:01.539899" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:28:01.539590" elapsed="0.000336"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:28:01.539992" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:28:01.540157" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:28:01.539167" elapsed="0.001015"/>
</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-04-17T03:28:01.540343" elapsed="0.000416"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:01.541057" level="INFO">index=8
host=10.30.170.120
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-04-17T03:28:01.541160" level="INFO">${karaf_connection_object} = index=8
host=10.30.170.120
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-04-17T03:28:01.540935" elapsed="0.000251"/>
</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-04-17T03:28:01.541336" elapsed="0.002449"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:28:01.544329" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:28:01.545754" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:28:01.544057" elapsed="0.002105">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:01.549276" elapsed="0.000362"/>
</kw>
<kw name="Open 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-04-17T03:28:01.549894" elapsed="0.000171"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:28:01.550219" elapsed="0.000099"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:28:01.547019" elapsed="0.003351"/>
</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-04-17T03:28:01.546453" elapsed="0.003963"/>
</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="FAIL" start="2026-04-17T03:28:01.532294" elapsed="0.018206">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:28:02.568143" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:02.567993" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:02.567964" elapsed="0.000271"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:02.568640" 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-04-17T03:28:02.568811" 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-04-17T03:28:02.568447" elapsed="0.000394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:02.569363" level="INFO">{1: 8}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:02.569023" elapsed="0.000390"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:02.569913" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:02.569595" elapsed="0.000406"/>
</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-04-17T03:28:02.570807" elapsed="0.000285"/>
</kw>
<msg time="2026-04-17T03:28:02.571235" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:28:02.571301" level="INFO">${old_connection_index} = 8</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:02.570236" elapsed="0.001091"/>
</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-04-17T03:28:02.572191" elapsed="0.000143"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:28:02.573084" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:28:02.572878" elapsed="0.000771">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:02.572505" elapsed="0.001209"/>
</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-04-17T03:28:02.574309" elapsed="0.000109"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:02.573907" elapsed="0.000559"/>
</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-04-17T03:28:02.571648" elapsed="0.002862"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:02.571410" elapsed="0.003148"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:02.571389" elapsed="0.003201"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:02.575441" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:28:02.575157" elapsed="0.000315"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:28:02.575528" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:28:02.575695" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:28:02.574828" elapsed="0.000891"/>
</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-04-17T03:28:02.575892" elapsed="0.000467"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:02.576655" level="INFO">index=10
host=10.30.170.120
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-04-17T03:28:02.576759" level="INFO">${karaf_connection_object} = index=10
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:28:02.576543" elapsed="0.000242"/>
</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-04-17T03:28:02.577029" elapsed="0.004004"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:28:02.581557" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:28:02.583030" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:28:02.581282" elapsed="0.002183">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:02.586645" elapsed="0.000388"/>
</kw>
<kw name="Open 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-04-17T03:28:02.587201" elapsed="0.000157"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:28:02.587511" elapsed="0.000099"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:28:02.584407" elapsed="0.003257"/>
</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-04-17T03:28:02.583817" elapsed="0.003894"/>
</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="FAIL" start="2026-04-17T03:28:02.567547" elapsed="0.020249">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:28:02.587886" level="FAIL">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<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="FAIL" start="2026-04-17T03:27:59.448207" elapsed="3.139792">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:27:59.447758" elapsed="3.140308"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:27:59.447613" elapsed="3.140495"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-04-17T03:27:59.447462" elapsed="3.140681"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-17T03:27:58.925206" elapsed="3.662994"/>
</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-04-17T03:28:02.590897" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:02.590780" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:02.590758" 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-04-17T03:28:02.596187" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:02.596078" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:02.596059" elapsed="0.000198"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:02.597255" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:28:02.596835" elapsed="0.000448"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:28:02.597775" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:28:02.597471" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:28:02.597845" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:28:02.598024" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:28:02.596493" elapsed="0.001557"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:02.603688" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:02.603577" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:02.603557" 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-04-17T03:28:02.605010" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:02.604858" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:02.604841" elapsed="0.000236"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:02.605621" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:28:02.605226" elapsed="0.000424"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:02.606130" 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-04-17T03:28:02.605877" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:28:02.607284" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:28:02.606824" elapsed="0.001216">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:28:02.608183" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:28:02.608230" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:02.606321" elapsed="0.001933"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:28:02.609342" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:28:02.608934" elapsed="0.001279">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:28:02.610379" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:28:02.610434" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:02.608431" elapsed="0.002026"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:28:02.611520" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/060_bgp_functional_mvpn.robot"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:28:02.610777" elapsed="0.000824">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/060_bgp_functional_mvpn.robot"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:02.610532" elapsed="0.001206">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/060_bgp_functional_mvpn.robot"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:28:02.610513" elapsed="0.001260">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/060_bgp_functional_mvpn.robot"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:02.611980" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:02.612213" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:02.612070" elapsed="0.000292"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:02.612053" elapsed="0.000335"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:28:02.612563" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:02.614670" elapsed="0.000485"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-17T03:28:02.615654" elapsed="0.000374"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:28:02.616364" elapsed="0.000239"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:28:02.613871" elapsed="0.002827"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:28:02.612901" elapsed="0.003934"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:28:02.604569" elapsed="0.012363">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/060_bgp_functional_mvpn.robot"</status>
</kw>
<msg time="2026-04-17T03:28:02.617136" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:28:02.617183" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/060_bgp_functional_mvpn.robot"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:02.603914" elapsed="0.013294"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:28:02.617405" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:02.617292" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:02.617271" elapsed="0.000204"/>
</if>
<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-04-17T03:28:02.618317" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:02.618210" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:02.618191" elapsed="0.000195"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:02.618872" 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-04-17T03:28:02.619004" 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-04-17T03:28:02.618547" elapsed="0.000527"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:02.619510" level="INFO">{1: 10}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:02.619236" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:02.619987" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:02.619715" elapsed="0.000317"/>
</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-04-17T03:28:02.620574" elapsed="0.000305"/>
</kw>
<msg time="2026-04-17T03:28:02.621086" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:28:02.621136" level="INFO">${old_connection_index} = 10</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:02.620195" elapsed="0.000965"/>
</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-04-17T03:28:02.622534" elapsed="0.000265"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:28:02.624238" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:28:02.623969" elapsed="0.000741">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:02.623132" elapsed="0.001672"/>
</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-04-17T03:28:02.625901" elapsed="0.000225"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:02.625114" elapsed="0.001088"/>
</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-04-17T03:28:02.621504" elapsed="0.004782"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:02.621239" elapsed="0.005098"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:02.621220" elapsed="0.005144"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:02.627345" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:28:02.626866" elapsed="0.000508"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:28:02.627424" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:28:02.627584" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:28:02.626580" elapsed="0.001029"/>
</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-04-17T03:28:02.627768" elapsed="0.000435"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:02.628487" level="INFO">index=13
host=10.30.170.120
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-04-17T03:28:02.628589" level="INFO">${karaf_connection_object} = index=13
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:28:02.628379" elapsed="0.000238"/>
</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-04-17T03:28:02.628769" elapsed="0.002369"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:28:02.631574" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:28:02.632936" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:28:02.631307" elapsed="0.002162">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:02.637279" elapsed="0.000681"/>
</kw>
<kw name="Open 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-04-17T03:28:02.638285" elapsed="0.000422"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:28:02.638930" elapsed="0.000203"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:28:02.634429" elapsed="0.004788"/>
</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-04-17T03:28:02.633781" elapsed="0.005486"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:28:02.617957" elapsed="0.021397">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:02.639776" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:28:02.639853" 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="FAIL" start="2026-04-17T03:28:02.603276" elapsed="0.036711">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:28:02.640103" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:28:02.640152" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:02.598430" elapsed="0.041748"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:02.640533" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:02.640264" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:02.640243" elapsed="0.000373"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:28:02.598281" elapsed="0.042360"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:28:02.598104" elapsed="0.042571"/>
</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-04-17T03:28:02.595759" elapsed="0.044977"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-17T03:28:02.588801" elapsed="0.051998"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:02.588359" elapsed="0.052485"/>
</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-04-17T03:27:58.919700" elapsed="3.721201"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:02.641532" level="INFO">${mininet_conn_id} = 15</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-04-17T03:28:02.641093" elapsed="0.000467"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:02.642213" level="INFO">${mininet_conn_id} = 15</msg>
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:28:02.641737" elapsed="0.000541"/>
</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-04-17T03:28:02.644042" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:28:02.644121" 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-04-17T03:28:02.643744" elapsed="0.000401"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:02.644309" elapsed="0.000327"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:28:02.645528" level="INFO">Logging into '10.30.171.238:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:28:02.982140" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 17 03:27:11 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:27:51 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:28:02.645207" elapsed="0.337114"/>
</kw>
<msg time="2026-04-17T03:28:02.982421" 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-04-17T03:28:02.644810" elapsed="0.337697"/>
</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-04-17T03:28:02.643298" elapsed="0.339327"/>
</kw>
<msg time="2026-04-17T03:28:02.982679" 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-04-17T03:28:02.642874" elapsed="0.339851"/>
</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-04-17T03:28:02.642502" elapsed="0.340304"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:28:02.983630" level="INFO">Creating Session using : alias=config-session, url=http://10.30.170.120:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a4424db0610&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-04-17T03:28:02.983199" elapsed="0.000608"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-04-17T03:28:02.991616" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-04-17T03:28:03.002626" 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-04-17T03:28:02.984008" elapsed="0.018703"/>
</kw>
<kw name="Assure_Library_Ipaddr" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:28:03.005206" level="INFO">Executing command 'bash -c 'cd "." &amp;&amp; python -c "import ipaddr"''.</msg>
<msg time="2026-04-17T03:28:03.037902" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:28:03.038223" level="INFO">${stdout} = </msg>
<msg time="2026-04-17T03:28:03.038339" level="INFO">${stderr} = </msg>
<msg time="2026-04-17T03:28:03.038448" 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-04-17T03:28:03.004848" elapsed="0.033653"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:28:03.040587" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-04-17T03:28:03.039898" elapsed="0.000796"/>
</kw>
<msg time="2026-04-17T03:28:03.040916" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-04-17T03:28:03.041063" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:03.038981" elapsed="0.002138"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:03.042631" 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-04-17T03:28:03.041517" elapsed="0.001176"/>
</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-04-17T03:28:03.043718" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:03.042879" elapsed="0.000983"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:03.042831" elapsed="0.001091"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-04-17T03:28:03.044315" elapsed="0.000071"/>
</return>
<status status="PASS" start="2026-04-17T03:28:03.044088" elapsed="0.000373"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:03.044052" elapsed="0.000465"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-04-17T03:28:03.044717" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:03.044641" elapsed="0.000165"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:03.044607" elapsed="0.000247"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:03.045253" elapsed="0.000058"/>
</kw>
<msg time="2026-04-17T03:28:03.045614" 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-04-17T03:28:03.004299" elapsed="0.041375"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-04-17T03:28:03.046196" elapsed="0.000059"/>
</return>
<status status="PASS" start="2026-04-17T03:28:03.045921" elapsed="0.000394"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:03.045874" elapsed="0.000475"/>
</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-04-17T03:28:03.046567" elapsed="0.000030"/>
</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-04-17T03:28:03.003180" elapsed="0.043506"/>
</kw>
<doc>Initialize SetupUtils. Suite setup keyword.</doc>
<status status="PASS" start="2026-04-17T03:27:58.919325" elapsed="4.127439"/>
</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-04-17T03:28:03.051589" elapsed="0.000306"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:28:03.051161" 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-04-17T03:28:03.053452" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:03.053288" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:03.053259" elapsed="0.000290"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:03.059022" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:03.058892" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:03.058874" elapsed="0.000217"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:03.060145" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:28:03.059726" elapsed="0.000447"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:28:03.060731" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:28:03.060406" elapsed="0.000353"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:28:03.060806" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:28:03.060989" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:28:03.059331" elapsed="0.001684"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:03.066784" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:03.066659" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:03.066640" elapsed="0.000215"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:03.068107" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:03.067996" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:03.067977" elapsed="0.000199"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:03.068635" level="INFO">${karaf_connection_index} = 13</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:28:03.068328" elapsed="0.000334"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:03.069087" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:28:03.068837" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:28:03.069895" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:28:03.069620" elapsed="0.001021">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:28:03.070834" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:28:03.070890" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:03.069280" elapsed="0.001636"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:28:03.071713" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:28:03.071465" elapsed="0.000936">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:28:03.072591" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:28:03.072638" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:03.071113" elapsed="0.001550"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:28:03.073796" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Configure_App_Peer"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:28:03.073003" elapsed="0.000858">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Configure_App_Peer"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:03.072740" elapsed="0.001199">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Configure_App_Peer"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:28:03.072721" elapsed="0.001278">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Configure_App_Peer"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:03.074177" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:03.074460" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:03.074267" elapsed="0.000249"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:03.074250" elapsed="0.000290"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:28:03.074575" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:28:03.077268" elapsed="0.000154"/>
</kw>
<msg time="2026-04-17T03:28:03.077491" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:03.076125" 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-04-17T03:28:03.077908" elapsed="0.000100"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:03.078274" elapsed="0.000081"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:28:03.075459" elapsed="0.003065"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:28:03.074864" 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="FAIL" start="2026-04-17T03:28:03.067650" elapsed="0.011080">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Configure_App_Peer"</status>
</kw>
<msg time="2026-04-17T03:28:03.078847" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:28:03.078895" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Configure_App_Peer"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:03.067033" elapsed="0.011885"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:28:03.079132" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:03.079022" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:03.079003" elapsed="0.000197"/>
</if>
<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-04-17T03:28:03.080078" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:03.079893" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:03.079876" elapsed="0.000269"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:03.080424" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:28:03.080532" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:28:03.080300" elapsed="0.000260"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:03.080999" level="INFO">{1: 13}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:03.080715" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:03.081451" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:03.081200" elapsed="0.000295"/>
</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-04-17T03:28:03.082043" elapsed="0.000262"/>
</kw>
<msg time="2026-04-17T03:28:03.082403" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:28:03.082449" level="INFO">${old_connection_index} = 13</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:03.081656" elapsed="0.000818"/>
</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-04-17T03:28:03.083316" elapsed="0.000218"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:28:03.084702" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:28:03.084298" elapsed="0.001272">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:03.083702" elapsed="0.001966"/>
</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-04-17T03:28:03.086322" elapsed="0.000304"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:03.085840" elapsed="0.000869"/>
</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-04-17T03:28:03.082784" elapsed="0.003971"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:03.082563" elapsed="0.004242"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:03.082545" elapsed="0.004285"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:03.087694" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:28:03.087387" elapsed="0.000334"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:28:03.087769" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:28:03.087926" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:28:03.087058" elapsed="0.000907"/>
</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-04-17T03:28:03.088125" elapsed="0.000417"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:03.089026" level="INFO">index=16
host=10.30.170.120
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-04-17T03:28:03.089130" level="INFO">${karaf_connection_object} = index=16
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:28:03.088713" elapsed="0.000443"/>
</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-04-17T03:28:03.089349" elapsed="0.002308"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:28:03.092104" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:28:03.093370" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:28:03.091825" elapsed="0.001920">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:28:03.107506" elapsed="0.000395"/>
</kw>
<msg time="2026-04-17T03:28:03.108034" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:03.106052" elapsed="0.002139"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:03.108373" elapsed="0.000025"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:03.108542" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:28:03.094651" elapsed="0.013973"/>
</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-04-17T03:28:03.094129" elapsed="0.014542"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:28:03.079602" elapsed="0.029153">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:03.109224" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:28:03.109299" 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="FAIL" start="2026-04-17T03:28:03.066311" elapsed="0.043097">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:28:03.109518" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:28:03.109562" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:03.061404" elapsed="0.048181"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:03.109929" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:03.109666" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:03.109647" elapsed="0.000376"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:28:03.061255" elapsed="0.048792"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:28:03.061074" elapsed="0.049006"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:28:03.058522" elapsed="0.051616"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:28:03.052846" elapsed="0.057351"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:03.052222" elapsed="0.058022"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:28:03.047811" elapsed="0.062487"/>
</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-04-17T03:28:03.144629" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:03.144242" elapsed="0.000416"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:03.145436" 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-04-17T03:28:03.145184" elapsed="0.000322">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-04-17T03:28:03.145599" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:03.144824" elapsed="0.000846"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:03.146255" 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-04-17T03:28:03.145842" elapsed="0.000441"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:03.146584" 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-04-17T03:28:03.146742" 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-04-17T03:28:03.146446" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:03.147192" 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-04-17T03:28:03.146930" 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-04-17T03:28:03.148245" level="INFO">mapping: {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:03.147986" elapsed="0.000303"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:03.148725" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:28:03.148455" elapsed="0.000295"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:03.149427" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:03.149130" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:03.150200" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:03.149978" elapsed="0.000248"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:03.150277" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:28:03.150438" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:03.149641" elapsed="0.000821"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:03.150616" elapsed="0.000237"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:28:03.148991" elapsed="0.001901"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:03.151455" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:03.151157" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:03.152251" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:03.152038" elapsed="0.000239"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:03.152325" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:28:03.152477" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:03.151667" 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-04-17T03:28:03.152653" elapsed="0.000220"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:28:03.151023" elapsed="0.001891"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:28:03.148799" elapsed="0.004167"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:28:03.153009" elapsed="0.000027"/>
</return>
<msg time="2026-04-17T03:28:03.153166" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:28:03.147607" elapsed="0.005584"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:03.147304" elapsed="0.005919"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:03.153398" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:03.153248" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:03.147286" elapsed="0.006187"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:03.154225" 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-04-17T03:28:03.153620" elapsed="0.000634"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:28:03.154302" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:03.143598" elapsed="0.010829"/>
</kw>
<msg time="2026-04-17T03:28:03.154520" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:03.130566" elapsed="0.024002"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:03.167154" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:03.179561" 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/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-04-17T03:28:03.191973" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:03.192169" 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-04-17T03:28:03.192343" elapsed="0.000019"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:03.192748" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:03.192602" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:03.192588" 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-04-17T03:28:03.192986" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:03.193156" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:03.193335" elapsed="0.000024"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:28:03.192560" elapsed="0.000840"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:28:03.192457" elapsed="0.000975"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:03.193578" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:03.193652" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:28:03.193775" 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-04-17T03:28:03.126193" elapsed="0.067608"/>
</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-04-17T03:28:03.220258" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:03.219858" elapsed="0.000478"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:03.221121" 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-04-17T03:28:03.220851" elapsed="0.000340">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/app_peer.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-04-17T03:28:03.221286" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:03.220506" elapsed="0.000805"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:03.221864" 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-04-17T03:28:03.221476" elapsed="0.000415"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:03.222212" 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-04-17T03:28:03.222358" 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-04-17T03:28:03.222074" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:03.222793" 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-04-17T03:28:03.222547" 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-04-17T03:28:03.223234" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:03.222911" elapsed="0.000382"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:03.223759" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:03.223466" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:03.223318" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:03.222892" elapsed="0.000949"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:03.224579" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.120&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-04-17T03:28:03.224006" elapsed="0.000603"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:28:03.224659" 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/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-04-17T03:28:03.219229" elapsed="0.005559"/>
</kw>
<msg time="2026-04-17T03:28:03.224843" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:03.206473" elapsed="0.018416"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:03.237597" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:03.250178" 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/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-04-17T03:28:03.262642" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:03.262838" 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-04-17T03:28:03.263047" 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-04-17T03:28:03.263414" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:03.263269" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:03.263255" 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-04-17T03:28:03.263634" elapsed="0.000019"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:03.263801" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:03.263984" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:28:03.263226" elapsed="0.000811"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:28:03.263125" elapsed="0.000939"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:03.264210" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:03.264283" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:28:03.264407" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.120&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-04-17T03:28:03.203818" elapsed="0.060617"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:03.265738" 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-04-17T03:28:03.265458" elapsed="0.000345">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-04-17T03:28:03.265895" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:03.265117" elapsed="0.000802"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:03.266253" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:03.266007" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:03.266809" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:03.266520" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:03.266333" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:03.265989" elapsed="0.000901"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:03.269273" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:28:03.267060" elapsed="0.002239"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:28:03.269350" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:28:03.269503" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:28:03.264770" elapsed="0.004758"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:03.271135" 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.120</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:03.270721" elapsed="0.000500"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:03.271623" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.120&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-04-17T03:28:03.271382" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:03.272094" 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-04-17T03:28:03.271824" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:03.272535" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:03.272293" elapsed="0.000286"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:03.273410" 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-04-17T03:28:03.273211" elapsed="0.000225"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:28:03.273810" 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-04-17T03:28:03.273592" elapsed="0.000245"/>
</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-04-17T03:28:03.274007" elapsed="0.000207"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:03.274621" 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-04-17T03:28:03.274374" elapsed="0.000291"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:28:03.274708" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:28:03.274863" 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-04-17T03:28:03.272781" elapsed="0.002107"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:28:03.280466" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:28:03.482333" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:28:03.885824" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:28:03.888687" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:28:03.277213" elapsed="0.616600">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:03.274975" elapsed="0.619107">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:03.894643" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:03.894181" elapsed="0.000624"/>
</branch>
<status status="FAIL" start="2026-04-17T03:28:03.274957" elapsed="0.619902">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:03.895888" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:03.896565" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:03.896504" elapsed="0.000126"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:03.896472" 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-04-17T03:28:03.896877" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:28:03.896997" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:28:03.269872" elapsed="0.627289">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:03.897272" elapsed="0.000024"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:28:03.115193" elapsed="0.782224">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:03.897845" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:03.897576" elapsed="0.000395"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:03.897552" elapsed="0.000457"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:03.898059" elapsed="0.000021"/>
</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="FAIL" start="2026-04-17T03:28:03.110562" elapsed="0.787651">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Configures bgp application peer.</doc>
<status status="FAIL" start="2026-04-17T03:28:03.046853" elapsed="0.851619">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:28:03.903519" elapsed="0.000363"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:28:03.903082" elapsed="0.000908"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:03.905651" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:03.905523" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:03.905503" elapsed="0.000220"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:03.912898" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:03.912786" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:03.912768" elapsed="0.000218"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:03.914080" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:28:03.913637" elapsed="0.000473"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:28:03.914597" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:28:03.914279" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:28:03.914670" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:28:03.914872" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:28:03.913233" elapsed="0.001666"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:03.920879" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:03.920766" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:03.920747" elapsed="0.000223"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:03.922214" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:03.922103" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:03.922084" elapsed="0.000200"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:03.922749" level="INFO">${karaf_connection_index} = 16</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:28:03.922434" elapsed="0.000343"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:03.923197" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:28:03.922961" elapsed="0.000265"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:28:03.924069" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:28:03.923777" elapsed="0.001005">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:28:03.924999" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:28:03.925050" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:03.923400" elapsed="0.001676"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:28:03.925885" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:28:03.925629" elapsed="0.000946">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:28:03.926773" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:28:03.926821" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:03.925261" elapsed="0.001585"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:28:03.927824" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Reconfigure_ODL_To_Accept_Connection"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:28:03.927181" elapsed="0.000709">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Reconfigure_ODL_To_Accept_Connection"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:03.926930" elapsed="0.001050">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Reconfigure_ODL_To_Accept_Connection"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:28:03.926906" elapsed="0.001274">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Reconfigure_ODL_To_Accept_Connection"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:03.928352" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:03.928590" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:03.928442" elapsed="0.000262"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:03.928424" elapsed="0.000305"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:28:03.928764" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:28:03.931480" elapsed="0.000153"/>
</kw>
<msg time="2026-04-17T03:28:03.931704" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:03.930308" elapsed="0.001537"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:03.932190" elapsed="0.000084"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:03.932573" 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-04-17T03:28:03.929637" elapsed="0.003150"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:28:03.929080" elapsed="0.003774"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:28:03.921758" elapsed="0.011200">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Reconfigure_ODL_To_Accept_Connection"</status>
</kw>
<msg time="2026-04-17T03:28:03.933068" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:28:03.933140" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Reconfigure_ODL_To_Accept_Connection"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:03.921133" elapsed="0.012082"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:28:03.933416" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:03.933300" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:03.933279" elapsed="0.000207"/>
</if>
<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-04-17T03:28:03.934432" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:03.934323" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:03.934304" elapsed="0.000198"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:03.934792" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:28:03.934902" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:28:03.934662" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:03.935393" level="INFO">{1: 16}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:03.935109" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:03.935859" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:03.935601" elapsed="0.000304"/>
</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-04-17T03:28:03.936513" elapsed="0.000326"/>
</kw>
<msg time="2026-04-17T03:28:03.936963" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:28:03.937013" level="INFO">${old_connection_index} = 16</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:03.936096" elapsed="0.000941"/>
</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-04-17T03:28:03.937927" elapsed="0.000299"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:28:03.939364" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:28:03.938911" elapsed="0.001396">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:03.938412" elapsed="0.002009"/>
</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-04-17T03:28:03.941140" elapsed="0.000297"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:03.940603" elapsed="0.000922"/>
</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-04-17T03:28:03.937372" elapsed="0.004201"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:03.937115" elapsed="0.004508"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:03.937096" elapsed="0.004557"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:03.942599" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:28:03.942270" elapsed="0.000356"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:28:03.942676" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:28:03.942837" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:28:03.941876" elapsed="0.000985"/>
</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-04-17T03:28:03.943046" elapsed="0.000453"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:03.943794" level="INFO">index=17
host=10.30.170.120
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-04-17T03:28:03.943901" level="INFO">${karaf_connection_object} = index=17
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:28:03.943683" elapsed="0.000250"/>
</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-04-17T03:28:03.944104" elapsed="0.002559"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:28:03.947127" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:28:03.948446" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:28:03.946836" elapsed="0.002021">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:28:03.963109" elapsed="0.000405"/>
</kw>
<msg time="2026-04-17T03:28:03.963609" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:03.961653" elapsed="0.002113"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:03.963938" elapsed="0.000166"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:03.964256" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:28:03.949854" elapsed="0.014490"/>
</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-04-17T03:28:03.949257" elapsed="0.015137"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:28:03.933907" elapsed="0.030577">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:03.964858" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:28:03.964953" elapsed="0.000023"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:28:03.920345" elapsed="0.044733">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:28:03.965210" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:28:03.965297" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:03.915370" elapsed="0.049955"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:03.965693" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:03.965418" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:03.965396" elapsed="0.000378"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:28:03.915218" elapsed="0.050582"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:28:03.915026" elapsed="0.050809"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:28:03.912396" elapsed="0.053501"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:28:03.905085" elapsed="0.060891"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:03.904332" elapsed="0.061692"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:28:03.899845" elapsed="0.066235"/>
</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-04-17T03:28:04.001879" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:04.001358" elapsed="0.000560"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:04.002855" 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-04-17T03:28:04.002566" elapsed="0.000392">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-04-17T03:28:04.003062" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:04.002127" elapsed="0.000961"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:04.003928" 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-04-17T03:28:04.003264" elapsed="0.000712"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:04.004305" 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-04-17T03:28:04.004734" 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-04-17T03:28:04.004150" elapsed="0.000618"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:04.005287" 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-04-17T03:28:04.005000" elapsed="0.000337"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:04.006569" level="INFO">mapping: {'IP': '10.30.171.238', '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-04-17T03:28:04.006248" elapsed="0.000371"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:04.007093" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:28:04.006786" elapsed="0.000336"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:04.007848" level="INFO">${value} = 10.30.171.238</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:04.007522" elapsed="0.000353"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:04.008809" level="INFO">${encoded} = 10.30.171.238</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:04.008527" elapsed="0.000321"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:04.008913" elapsed="0.000068"/>
</return>
<msg time="2026-04-17T03:28:04.009125" level="INFO">${encoded_value} = 10.30.171.238</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:04.008097" elapsed="0.001053"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:04.009338" elapsed="0.000261"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.238</var>
<status status="PASS" start="2026-04-17T03:28:04.007378" elapsed="0.002263"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:04.010309" 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-04-17T03:28:04.009904" elapsed="0.000432"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:04.011195" 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-04-17T03:28:04.010962" elapsed="0.000261"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:04.011277" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:28:04.011449" 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-04-17T03:28:04.010576" 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-04-17T03:28:04.011634" elapsed="0.000287"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:28:04.009765" elapsed="0.002235"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:04.012632" 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-04-17T03:28:04.012277" elapsed="0.000382"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:04.013456" 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-04-17T03:28:04.013229" elapsed="0.000258"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:04.013544" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:28:04.013707" 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-04-17T03:28:04.012865" elapsed="0.000868"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:04.013904" elapsed="0.000324"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:28:04.012135" elapsed="0.002140"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:04.015198" 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-04-17T03:28:04.014556" elapsed="0.000672"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:04.016024" 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-04-17T03:28:04.015760" elapsed="0.000293"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:04.016104" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:28:04.016265" 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-04-17T03:28:04.015429" elapsed="0.000861"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:04.016448" elapsed="0.000234"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:28:04.014408" elapsed="0.002319"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:04.017538" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:04.017145" elapsed="0.000423"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:04.018517" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:04.018259" elapsed="0.000291"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:04.018606" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:28:04.018772" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:04.017775" elapsed="0.001022"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:04.018973" elapsed="0.000235"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:28:04.016963" elapsed="0.002287"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:04.019818" 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-04-17T03:28:04.019505" elapsed="0.000340"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:04.020608" 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-04-17T03:28:04.020389" elapsed="0.000245"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:04.020686" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:28:04.020846" 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-04-17T03:28:04.020059" elapsed="0.000812"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:04.021047" elapsed="0.000237"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:28:04.019367" elapsed="0.001962"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:28:04.007177" elapsed="0.014189"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:28:04.021414" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:28:04.021590" level="INFO">${mapping_to_use} = {'IP': '10.30.171.238', '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-04-17T03:28:04.005841" elapsed="0.015777"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:04.005425" elapsed="0.016229"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:04.021882" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:04.021686" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:04.005398" elapsed="0.016596"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:04.022974" 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-04-17T03:28:04.022156" elapsed="0.000860"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:28:04.023075" elapsed="0.000036"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer.vanadium/${file_name} exists. 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-04-17T03:28:04.000560" elapsed="0.022663"/>
</kw>
<msg time="2026-04-17T03:28:04.023285" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:03.986868" elapsed="0.036476"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:04.036739" elapsed="0.000041"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:28:04.050065" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:04.063901" elapsed="0.000051"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:04.064175" 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-04-17T03:28:04.064371" 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-04-17T03:28:04.064811" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:04.064648" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:04.064629" 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-04-17T03:28:04.065107" 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-04-17T03:28:04.065300" 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-04-17T03:28:04.065545" elapsed="0.000030"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:28:04.064588" elapsed="0.001032"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:28:04.064457" elapsed="0.001194"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:04.065811" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:04.065893" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:28:04.066084" 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-04-17T03:28:03.982410" elapsed="0.083712"/>
</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-04-17T03:28:04.095220" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:04.094723" elapsed="0.000531"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:04.096151" 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-04-17T03:28:04.095857" elapsed="0.000380">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-04-17T03:28:04.096340" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:04.095456" elapsed="0.000909"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:04.096977" 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-04-17T03:28:04.096544" elapsed="0.000463"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:04.097330" 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-04-17T03:28:04.097512" 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-04-17T03:28:04.097179" elapsed="0.000363"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:04.098081" 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-04-17T03:28:04.097708" elapsed="0.000504"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-17T03:28:04.098632" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:04.098294" elapsed="0.000399"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:04.099209" level="INFO">${mapping_to_use} = {'IP': '10.30.171.238', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:04.098873" elapsed="0.000365"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:04.098721" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:04.098271" elapsed="0.001026"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:04.100287" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.238&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/pee...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:28:04.099522" elapsed="0.000801"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:28:04.100381" 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/bgp_peer.vanadium/${file_name} exists. 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-04-17T03:28:04.094061" elapsed="0.006467"/>
</kw>
<msg time="2026-04-17T03:28:04.100614" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:04.080554" elapsed="0.020139"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:04.114629" elapsed="0.000033"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer.vanadium/${file_name} exists. 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-04-17T03:28:04.127373" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:04.140049" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:04.140295" 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-04-17T03:28:04.140490" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:04.140883" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:04.140735" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:04.140719" 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-04-17T03:28:04.141125" 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-04-17T03:28:04.141293" 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-04-17T03:28:04.141477" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:28:04.140685" elapsed="0.000844"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:28:04.140572" elapsed="0.000985"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:04.141765" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:04.141842" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:28:04.142001" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.238&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/pee...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:28:04.077505" elapsed="0.064527"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:04.143475" 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-04-17T03:28:04.143167" elapsed="0.000390">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-04-17T03:28:04.143672" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:04.142765" elapsed="0.000932"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:04.144047" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:04.143768" elapsed="0.000337"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:04.144664" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:04.144350" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:04.144130" elapsed="0.000595"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:04.143750" elapsed="0.000996"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:04.147177" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:28:04.144901" elapsed="0.002303"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:28:04.147255" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:28:04.147417" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:28:04.142401" elapsed="0.005040"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:04.148902" 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.238</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:04.148649" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:04.149377" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.238&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-04-17T03:28:04.149138" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:04.149821" 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-04-17T03:28:04.149578" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:04.150274" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:04.150032" elapsed="0.000285"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:04.151146" 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-04-17T03:28:04.150928" elapsed="0.000244"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:28:04.151502" 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-04-17T03:28:04.151327" 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-04-17T03:28:04.151679" elapsed="0.000208"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:04.152328" 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-04-17T03:28:04.152064" elapsed="0.000310"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:28:04.152415" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:28:04.152572" 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-04-17T03:28:04.150517" elapsed="0.002144"/>
</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-04-17T03:28:04.158271" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:28:04.360474" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:28:04.764171" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:28:04.767209" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:28:04.155039" elapsed="0.616869">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:04.152757" elapsed="0.619338">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:04.772472" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:04.772161" elapsed="0.000414"/>
</branch>
<status status="FAIL" start="2026-04-17T03:28:04.152737" elapsed="0.619873">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:04.773263" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:04.773495" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:04.773436" elapsed="0.000125"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:04.773404" elapsed="0.000187"/>
</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-04-17T03:28:04.773803" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:28:04.773899" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:28:04.147782" elapsed="0.626305">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:04.774198" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:28:03.971114" elapsed="0.803223">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:04.774830" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:04.774563" elapsed="0.000409"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:04.774537" elapsed="0.000474"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:04.775062" elapsed="0.000021"/>
</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="FAIL" start="2026-04-17T03:28:03.966375" elapsed="0.808836">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Configures BGP peer module with initiate-connection set to false.</doc>
<status status="FAIL" start="2026-04-17T03:28:03.898989" elapsed="0.876459">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:28:04.780122" elapsed="0.000265"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:28:04.779826" elapsed="0.000619"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:04.781560" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:04.781401" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:04.781381" elapsed="0.000251"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:04.786911" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:04.786802" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:04.786784" elapsed="0.000212"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:04.788034" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:28:04.787617" elapsed="0.000444"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:28:04.788524" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:28:04.788226" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:28:04.788596" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:28:04.788752" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:28:04.787227" elapsed="0.001549"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:04.794330" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:04.794212" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:04.794194" 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-04-17T03:28:04.795623" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:04.795515" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:04.795498" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:04.796169" level="INFO">${karaf_connection_index} = 17</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:28:04.795838" elapsed="0.000358"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:04.796581" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:28:04.796361" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:28:04.797390" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:28:04.797125" elapsed="0.000954">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:28:04.798273" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:28:04.798321" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:04.796767" elapsed="0.001578"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:28:04.799216" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:28:04.798872" elapsed="0.001012">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:28:04.800098" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:28:04.800147" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:04.798520" elapsed="0.001652"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:28:04.801298" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Start_Bgp_Peer"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:28:04.800483" elapsed="0.000881">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Start_Bgp_Peer"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:04.800250" elapsed="0.001185">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Start_Bgp_Peer"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:28:04.800230" elapsed="0.001238">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Start_Bgp_Peer"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:04.801637" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:04.801910" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:04.801727" elapsed="0.000258"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:04.801710" elapsed="0.000299"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:28:04.802043" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:28:04.804638" elapsed="0.000150"/>
</kw>
<msg time="2026-04-17T03:28:04.804857" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:04.803534" elapsed="0.001498"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:04.805314" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:04.805653" 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-04-17T03:28:04.802880" 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-04-17T03:28:04.802331" elapsed="0.003600"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:28:04.795212" elapsed="0.010824">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Start_Bgp_Peer"</status>
</kw>
<msg time="2026-04-17T03:28:04.806143" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:28:04.806188" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Start_Bgp_Peer"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:04.794589" elapsed="0.011622"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:28:04.806424" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:04.806290" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:04.806271" elapsed="0.000231"/>
</if>
<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-04-17T03:28:04.807367" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:04.807258" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:04.807239" elapsed="0.000195"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:04.807728" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:28:04.807838" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:28:04.807596" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:04.808313" level="INFO">{1: 17}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:04.808041" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:04.808767" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:04.808516" elapsed="0.000296"/>
</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-04-17T03:28:04.809438" elapsed="0.000269"/>
</kw>
<msg time="2026-04-17T03:28:04.809810" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:28:04.809857" level="INFO">${old_connection_index} = 17</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:04.809049" elapsed="0.000833"/>
</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-04-17T03:28:04.810806" elapsed="0.000220"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:28:04.812167" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:28:04.811727" elapsed="0.001435">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:04.811200" elapsed="0.002064"/>
</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-04-17T03:28:04.813919" elapsed="0.000345"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:04.813443" elapsed="0.000908"/>
</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-04-17T03:28:04.810291" elapsed="0.004109"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:04.810058" elapsed="0.004392"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:04.810039" elapsed="0.004436"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:04.815373" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:28:04.815056" elapsed="0.000346"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:28:04.815451" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:28:04.815610" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:28:04.814689" elapsed="0.000946"/>
</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-04-17T03:28:04.815795" elapsed="0.000446"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:04.816705" level="INFO">index=18
host=10.30.170.120
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-04-17T03:28:04.816811" level="INFO">${karaf_connection_object} = index=18
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:28:04.816416" elapsed="0.000422"/>
</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-04-17T03:28:04.817075" elapsed="0.002302"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:28:04.819815" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:28:04.821116" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:28:04.819547" elapsed="0.001952">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:28:04.835775" elapsed="0.000564"/>
</kw>
<msg time="2026-04-17T03:28:04.836442" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:04.834208" elapsed="0.002437"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:04.836825" elapsed="0.000025"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:04.837046" elapsed="0.000036"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:28:04.822424" elapsed="0.014750"/>
</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-04-17T03:28:04.821789" elapsed="0.015439"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:28:04.806913" elapsed="0.030411">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:04.837769" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:28:04.837851" elapsed="0.000023"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:28:04.793853" elapsed="0.044166">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:28:04.838215" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:28:04.838261" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:04.789169" elapsed="0.049117"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:04.838733" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:04.838405" elapsed="0.000403"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:04.838382" elapsed="0.000460"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:28:04.789024" elapsed="0.049852"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:28:04.788831" elapsed="0.050088"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:28:04.786435" elapsed="0.052608"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:28:04.781089" elapsed="0.058021"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:04.780608" elapsed="0.058551"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:28:04.777098" elapsed="0.062119"/>
</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-04-17T03:28:04.841447" level="INFO">${command} = python3 play.py --amount 0 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --peerport=1790 --debug --mvpn --wfr 1 &amp;&gt; play.py.out</msg>
<var>${command}</var>
<arg>python3 play.py ${arguments} &amp;&gt; ${BGPSpeaker__OUTPUT_LOG}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:04.841059" elapsed="0.000421"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:04.841932" level="INFO">python3 play.py --amount 0 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --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-04-17T03:28:04.841648" elapsed="0.000354"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:28:04.845657" level="INFO">python3 play.py --amount 0 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --peerport=1790 --debug --mvpn --wfr 1 &amp;&gt; play.py.out</msg>
<msg time="2026-04-17T03:28:04.845761" level="INFO">${output} =  python3 play.py --amount 0 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --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-04-17T03:28:04.842186" elapsed="0.003603"/>
</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-04-17T03:28:04.840582" elapsed="0.005273"/>
</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-04-17T03:28:10.848320" 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-04-17T03:28:04.847665" elapsed="6.001627">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-04-17T03:28:10.849748" elapsed="0.000041"/>
</kw>
<doc>Log text gathered by SSHLibrary.Read_Until_Prompt.
This needs to be a separate keyword just because how Read_And_Fail_If_Prompt_Is_Seen is implemented.</doc>
<status status="FAIL" start="2026-04-17T03:28:04.847381" elapsed="6.002572">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-04-17T03:28:04.846891" elapsed="6.003221"/>
</kw>
<msg time="2026-04-17T03:28:10.850240" 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-04-17T03:28:04.846489" elapsed="6.003780"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-04-17T03:28:10.850574" elapsed="0.000053"/>
</return>
<status status="PASS" start="2026-04-17T03:28:10.850392" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:10.850349" elapsed="0.000373"/>
</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-04-17T03:28:10.851109" elapsed="0.000487"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was seen but it was not expected yet</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:10.851769" elapsed="0.000022"/>
</kw>
<doc>Try to read SSH to see prompt, but expect to see no prompt within SSHLibrary's timeout.</doc>
<status status="PASS" start="2026-04-17T03:28:04.846155" elapsed="6.005699"/>
</kw>
<doc>Starts bgp peer and verifies that the peer runs.</doc>
<status status="PASS" start="2026-04-17T03:28:04.840192" elapsed="6.011731"/>
</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-04-17T03:28:04.839435" elapsed="6.012579"/>
</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-04-17T03:28:04.775894" elapsed="6.076434"/>
</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-04-17T03:28:10.856544" elapsed="0.000277"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:28:10.856258" elapsed="0.000636"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:10.858238" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:10.858103" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:10.858082" 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-04-17T03:28:10.863607" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:10.863484" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:10.863464" elapsed="0.000219"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:10.864804" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:28:10.864365" elapsed="0.000469"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:28:10.865405" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:28:10.865019" elapsed="0.000426"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:28:10.865512" elapsed="0.000051"/>
</return>
<msg time="2026-04-17T03:28:10.865714" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:28:10.863965" elapsed="0.001775"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:10.875518" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:10.875365" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:10.875343" elapsed="0.000286"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:10.877137" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:10.877024" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:10.877006" elapsed="0.000208"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:10.877905" level="INFO">${karaf_connection_index} = 18</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:28:10.877439" elapsed="0.000547"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:10.878422" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:28:10.878168" elapsed="0.000281"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:28:10.879524" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:28:10.879159" elapsed="0.001214">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:28:10.880646" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:28:10.880717" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:10.878623" elapsed="0.002131"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:28:10.881665" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:28:10.881403" elapsed="0.001169">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:28:10.882838" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:28:10.882905" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:10.881019" elapsed="0.001950"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:28:10.884091" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_intra_as_ipmsi_ad"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:28:10.883284" elapsed="0.000878">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_intra_as_ipmsi_ad"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:10.883052" elapsed="0.001194">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_intra_as_ipmsi_ad"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:28:10.883032" elapsed="0.001259">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_intra_as_ipmsi_ad"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:10.884537" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:10.884773" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:10.884627" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:10.884610" elapsed="0.000238"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:28:10.884882" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:28:10.888148" elapsed="0.000155"/>
</kw>
<msg time="2026-04-17T03:28:10.888382" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:10.886649" elapsed="0.001904"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:10.888858" elapsed="0.000106"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:10.889237" 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-04-17T03:28:10.885921" elapsed="0.003507"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:28:10.885259" elapsed="0.004237"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:28:10.876682" elapsed="0.012904">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_intra_as_ipmsi_ad"</status>
</kw>
<msg time="2026-04-17T03:28:10.889699" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:28:10.889763" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_intra_as_ipmsi_ad"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:10.875864" elapsed="0.013933"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:28:10.890079" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:10.889899" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:10.889872" elapsed="0.000291"/>
</if>
<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-04-17T03:28:10.891388" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:10.891273" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:10.891251" elapsed="0.000205"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:10.891749" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:28:10.891857" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:28:10.891616" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:10.892418" level="INFO">{1: 18}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:10.892085" elapsed="0.000379"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:10.892903" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:10.892626" elapsed="0.000359"/>
</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-04-17T03:28:10.893776" elapsed="0.000414"/>
</kw>
<msg time="2026-04-17T03:28:10.894331" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:28:10.894398" level="INFO">${old_connection_index} = 18</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:10.893222" elapsed="0.001211"/>
</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-04-17T03:28:10.895664" elapsed="0.000200"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:28:10.897301" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:28:10.896849" elapsed="0.001560">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:10.896115" elapsed="0.002398"/>
</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-04-17T03:28:10.899329" elapsed="0.000407"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:10.898692" elapsed="0.001163"/>
</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-04-17T03:28:10.894894" elapsed="0.005010"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:10.894542" elapsed="0.005517"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:10.894516" elapsed="0.005585"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:10.901242" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:28:10.900806" elapsed="0.000469"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:28:10.901341" elapsed="0.000047"/>
</return>
<msg time="2026-04-17T03:28:10.901531" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:28:10.900377" elapsed="0.001179"/>
</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-04-17T03:28:10.901719" elapsed="0.000546"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:10.902614" level="INFO">index=19
host=10.30.170.120
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-04-17T03:28:10.902730" level="INFO">${karaf_connection_object} = index=19
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:28:10.902481" elapsed="0.000277"/>
</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-04-17T03:28:10.903017" elapsed="0.002334"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:28:10.905784" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:28:10.907176" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:28:10.905520" elapsed="0.002061">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:28:10.924343" elapsed="0.000947"/>
</kw>
<msg time="2026-04-17T03:28:10.925418" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:10.921726" elapsed="0.003886"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:10.925831" elapsed="0.000032"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:10.926072" elapsed="0.000033"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:28:10.908517" elapsed="0.017672"/>
</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-04-17T03:28:10.907895" elapsed="0.018350"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:28:10.890642" elapsed="0.035719">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:10.926870" elapsed="0.000033"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:28:10.926991" elapsed="0.000029"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:28:10.874960" elapsed="0.052199">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:28:10.927299" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:28:10.927348" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:10.866163" elapsed="0.061211"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:10.927791" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:10.927477" elapsed="0.000375"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:10.927452" elapsed="0.000429"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:28:10.866008" elapsed="0.061902"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:28:10.865799" elapsed="0.062192"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:28:10.863068" elapsed="0.065002"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:28:10.857737" elapsed="0.070402"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:10.857150" elapsed="0.071126"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:28:10.853430" elapsed="0.074912"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:10.929519" 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-04-17T03:28:10.929736" 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-04-17T03:28:10.929296" elapsed="0.000466"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-17T03:28:10.930167" 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-04-17T03:28:10.929925" elapsed="0.000269"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:10.930541" 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-04-17T03:28:10.930679" 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-04-17T03:28:10.930352" elapsed="0.000352"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-17T03:28:10.931131" 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-04-17T03:28:10.930862" elapsed="0.000297"/>
</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-04-17T03:28:10.931453" elapsed="0.002701"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:10.931232" elapsed="0.002959"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:10.931213" elapsed="0.003004"/>
</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-04-17T03:28:10.970970" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:10.970559" elapsed="0.000445"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:10.971839" 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-04-17T03:28:10.971562" elapsed="0.000353">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-04-17T03:28:10.972030" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:10.971177" elapsed="0.000878"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:10.972620" 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-04-17T03:28:10.972227" elapsed="0.000420"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:10.972971" 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-04-17T03:28:10.973226" 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-04-17T03:28:10.972811" elapsed="0.000443"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:10.973674" 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-04-17T03:28:10.973420" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:10.974773" level="INFO">mapping: {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:10.974513" elapsed="0.000305"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:10.975272" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:28:10.974999" elapsed="0.000298"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:10.976080" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:10.975754" elapsed="0.000352"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:10.977106" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:10.976626" elapsed="0.000506"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:10.977186" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:28:10.977347" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:10.976300" elapsed="0.001072"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:10.977528" elapsed="0.000240"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:28:10.975612" elapsed="0.002197"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:10.978382" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:10.978077" elapsed="0.000331"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:10.979350" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:10.978920" elapsed="0.000457"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:10.979457" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:28:10.979613" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:10.978597" 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-04-17T03:28:10.979791" elapsed="0.000241"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:28:10.977923" elapsed="0.002150"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:28:10.975430" elapsed="0.004677"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:28:10.980150" elapsed="0.000027"/>
</return>
<msg time="2026-04-17T03:28:10.980309" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:28:10.974180" elapsed="0.006154"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:10.973796" elapsed="0.006570"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:10.980543" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:10.980391" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:10.973774" elapsed="0.006845"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:10.981387" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:28:10.980767" elapsed="0.000649"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:28:10.981464" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:28:10.969904" elapsed="0.011685"/>
</kw>
<msg time="2026-04-17T03:28:10.981645" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:10.957017" elapsed="0.024678"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:28:10.994694" elapsed="0.000054"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:28:11.007688" 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_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-04-17T03:28:11.021322" elapsed="0.000042"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:11.021631" 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-04-17T03:28:11.021832" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:11.022297" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:11.022138" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:11.022119" 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-04-17T03:28:11.022533" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:11.022706" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:11.022875" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:28:11.022078" elapsed="0.000867"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:28:11.021920" elapsed="0.001056"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:11.023128" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:11.023209" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:28:11.023378" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:28:10.952474" elapsed="0.070934"/>
</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-04-17T03:28:11.049970" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:11.049398" elapsed="0.000618"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:11.050888" 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-04-17T03:28:11.050562" elapsed="0.000454">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-04-17T03:28:11.051154" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:11.050209" elapsed="0.000971"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:11.051803" 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-04-17T03:28:11.051355" elapsed="0.000486"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:11.052229" 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-04-17T03:28:11.052414" 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-04-17T03:28:11.052077" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:11.052866" 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-04-17T03:28:11.052614" elapsed="0.000424"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-17T03:28:11.053528" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:11.053148" elapsed="0.000442"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:11.054266" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:11.053958" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:11.053618" elapsed="0.000712"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:11.053114" elapsed="0.001237"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:11.055281" 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-04-17T03:28:11.054558" elapsed="0.000755"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:28:11.055369" 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-04-17T03:28:11.048594" elapsed="0.006917"/>
</kw>
<msg time="2026-04-17T03:28:11.055584" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:11.034741" elapsed="0.020902"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:28:11.069179" elapsed="0.000043"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_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-04-17T03:28:11.083288" elapsed="0.000062"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:28:11.096575" elapsed="0.000053"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:11.096902" elapsed="0.000044"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:11.097121" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:11.097564" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:11.097405" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:11.097387" 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-04-17T03:28:11.097800" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:11.097989" 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-04-17T03:28:11.098194" elapsed="0.000026"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:28:11.097345" elapsed="0.000913"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:28:11.097208" elapsed="0.001181"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:11.098613" elapsed="0.000025"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:11.098716" elapsed="0.000022"/>
</return>
<msg time="2026-04-17T03:28:11.098904" 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-04-17T03:28:11.033787" elapsed="0.065170"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:11.100602" 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-04-17T03:28:11.100244" elapsed="0.000441">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-04-17T03:28:11.100786" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:11.099771" elapsed="0.001040"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:11.101181" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:11.100884" elapsed="0.000356"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:11.101761" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:11.101460" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:11.101265" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:11.100865" elapsed="0.000981"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:11.104403" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:28:11.102027" elapsed="0.002403"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:28:11.104484" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:28:11.104661" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:28:11.099366" elapsed="0.005325"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:11.106336" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:28:11.106069" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:11.106780" 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-04-17T03:28:11.106541" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:11.107253" 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-04-17T03:28:11.107007" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:11.107686" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:11.107448" elapsed="0.000281"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:11.108612" 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-04-17T03:28:11.108404" elapsed="0.000235"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:28:11.108990" 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-04-17T03:28:11.108794" elapsed="0.000223"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:11.109171" elapsed="0.000215"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:11.109870" 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-04-17T03:28:11.109615" elapsed="0.000302"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:28:11.110003" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:28:11.110202" 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-04-17T03:28:11.107948" elapsed="0.002281"/>
</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-04-17T03:28:11.116090" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:11.317984" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:11.720876" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:11.723366" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:28:11.112760" elapsed="0.614845">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:11.110304" elapsed="0.617499">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:28:11.728358" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:11.727887" elapsed="0.000612"/>
</branch>
<status status="FAIL" start="2026-04-17T03:28:11.110286" elapsed="0.618267">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:28:11.729518" elapsed="0.000050"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:11.729789" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:11.729712" elapsed="0.000162"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:11.729676" elapsed="0.000241"/>
</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-04-17T03:28:11.730260" elapsed="0.000042"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:28:11.730388" elapsed="0.000027"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>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="FAIL" start="2026-04-17T03:28:11.105057" elapsed="0.625549">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:11.730773" elapsed="0.000036"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>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="FAIL" start="2026-04-17T03:28:10.939053" elapsed="0.792005">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:11.731745" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:11.731395" elapsed="0.000482"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:11.731357" elapsed="0.000593"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:11.732027" elapsed="0.000029"/>
</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="FAIL" start="2026-04-17T03:28:10.934494" elapsed="0.797782">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:28:11.732666" elapsed="0.000039"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<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="NOT RUN" start="2026-04-17T03:28:11.733028" elapsed="0.000036"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:11.733292" elapsed="0.000029"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations">
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:11.733549" elapsed="0.000030"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:28:11.733812" elapsed="0.000033"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<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="NOT RUN" start="2026-04-17T03:28:11.734164" elapsed="0.000037"/>
</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-04-17T03:28:11.783493" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:11.783028" elapsed="0.000501"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:11.784546" 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-04-17T03:28:11.784107" elapsed="0.000542">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-04-17T03:28:11.784776" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:11.783717" elapsed="0.001090"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:11.785503" 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-04-17T03:28:11.785069" elapsed="0.000462"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:11.785896" 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-04-17T03:28:11.786095" 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-04-17T03:28:11.785743" elapsed="0.000380"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:11.786592" 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-04-17T03:28:11.786292" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:11.788044" level="INFO">mapping: {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:11.787704" elapsed="0.000389"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:11.788699" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:28:11.788340" elapsed="0.000388"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:11.789705" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:11.789138" elapsed="0.000595"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:11.790955" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:11.790461" elapsed="0.000539"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:11.791128" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:28:11.791411" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:11.789957" elapsed="0.001485"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:11.791654" elapsed="0.000677"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:28:11.788989" elapsed="0.003397"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:11.793260" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:11.792704" elapsed="0.000584"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:11.794671" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:11.794001" elapsed="0.000713"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:11.794838" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:28:11.795175" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:11.793485" 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-04-17T03:28:11.795397" elapsed="0.000513"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:28:11.792557" elapsed="0.003423"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:28:11.788783" elapsed="0.007235"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:28:11.796063" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:28:11.796233" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:28:11.787232" elapsed="0.009028"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:11.786761" elapsed="0.009535"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:11.796588" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:11.796348" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:11.786729" elapsed="0.009966"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:11.797565" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:28:11.796855" elapsed="0.000741"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:28:11.797659" 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_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-04-17T03:28:11.782156" elapsed="0.015656"/>
</kw>
<msg time="2026-04-17T03:28:11.797870" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:11.768684" elapsed="0.029272"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:28:11.811755" elapsed="0.000057"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/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-04-17T03:28:11.824822" elapsed="0.000046"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/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-04-17T03:28:11.839276" elapsed="0.000041"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:11.839595" 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-04-17T03:28:11.839853" 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-04-17T03:28:11.840429" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:11.840220" elapsed="0.000284"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:11.840197" 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-04-17T03:28:11.840739" 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-04-17T03:28:11.841036" elapsed="0.000029"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:11.841266" elapsed="0.000026"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:28:11.840146" elapsed="0.001188"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:28:11.839986" elapsed="0.001382"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:11.841529" elapsed="0.000024"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:11.841631" elapsed="0.000023"/>
</return>
<msg time="2026-04-17T03:28:11.841822" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:28:11.763398" elapsed="0.078454"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:11.843191" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:28:11.842855" elapsed="0.000392"/>
</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-04-17T03:28:11.848814" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:12.051194" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:12.453707" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:12.456191" level="INFO">${response} = None</msg>
<msg time="2026-04-17T03:28:12.456266" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:11.845577" elapsed="0.614119">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:11.843316" elapsed="0.616652">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:12.460410" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:12.460036" elapsed="0.000484"/>
</branch>
<status status="FAIL" start="2026-04-17T03:28:11.843297" elapsed="0.617265">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:12.466651" 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-04-17T03:28:12.462881" elapsed="0.003833">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:12.462513" elapsed="0.004307">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:28:12.462480" elapsed="0.004393">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-04-17T03:28:12.470719" 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-04-17T03:28:12.467318" elapsed="0.003454">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:12.466995" elapsed="0.003881">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:28:12.466971" elapsed="0.003979">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:12.471919" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:28:12.471293" elapsed="0.000690"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:12.472507" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:12.472097" elapsed="0.000501"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:12.473359" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:12.472893" elapsed="0.000507"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:12.472636" elapsed="0.000818"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:12.472067" elapsed="0.001422"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:12.474307" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:28:12.473747" elapsed="0.000602"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:12.474807" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:12.474453" elapsed="0.000445"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:12.475674" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:12.475234" elapsed="0.000477"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:12.474960" elapsed="0.000801"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:12.474428" elapsed="0.001364"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:12.476053" elapsed="0.000545"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-17T03:28:12.477324" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:28:12.476842" elapsed="0.000524"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-04-17T03:28:12.481061" 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-04-17T03:28:12.477614" elapsed="0.003504">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-04-17T03:28:12.461714" elapsed="0.019734">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-04-17T03:28:12.481556" elapsed="0.000053"/>
</return>
<msg time="2026-04-17T03:28:12.485272" level="INFO">${response_text} = None</msg>
<msg time="2026-04-17T03:28:12.485315" 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-04-17T03:28:11.842167" elapsed="0.643190">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-04-17T03:28:12.485458" elapsed="0.000041"/>
</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-04-17T03:28:11.735888" elapsed="0.749887">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:11.735199" elapsed="0.750845"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-04-17T03:28:11.734549" elapsed="0.751589"/>
</kw>
<arg>intra_as_ipmsi_ad</arg>
<arg>${MVPN_DIR}</arg>
<status status="FAIL" start="2026-04-17T03:28:10.928714" elapsed="1.557531">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:10.852823" elapsed="1.633650">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:28:12.491253" elapsed="0.000388"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:28:12.490778" 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-04-17T03:28:12.493532" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:12.493340" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:12.493306" elapsed="0.000335"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:12.501098" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:12.500902" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:12.500868" elapsed="0.000341"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:12.502871" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:28:12.502241" elapsed="0.000671"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:28:12.503621" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:28:12.503169" elapsed="0.000487"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:28:12.503716" elapsed="0.000047"/>
</return>
<msg time="2026-04-17T03:28:12.503963" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:28:12.501608" elapsed="0.002396"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:12.512815" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:12.512567" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:12.512534" 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-04-17T03:28:12.514855" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:12.514698" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:12.514671" elapsed="0.000324"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:12.515709" level="INFO">${karaf_connection_index} = 19</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:28:12.515235" elapsed="0.000521"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:12.516466" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:28:12.516138" elapsed="0.000367"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:28:12.517743" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:28:12.517351" elapsed="0.001362">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:28:12.519003" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:28:12.519074" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:12.516792" elapsed="0.002320"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:28:12.520297" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:28:12.519909" elapsed="0.001462">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:28:12.521631" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:28:12.521699" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:12.519374" elapsed="0.002361"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:28:12.523115" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_intra_as_ipmsi_ad"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:28:12.522237" elapsed="0.000966">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_intra_as_ipmsi_ad"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:12.521853" elapsed="0.001451">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_intra_as_ipmsi_ad"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:28:12.521821" elapsed="0.001535">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_intra_as_ipmsi_ad"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:12.523579" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:12.523911" elapsed="0.000068"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:12.523690" elapsed="0.000347"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:12.523668" elapsed="0.000410"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:28:12.524139" 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-04-17T03:28:12.528140" elapsed="0.000212"/>
</kw>
<msg time="2026-04-17T03:28:12.528445" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:12.526560" elapsed="0.002076"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:12.529133" elapsed="0.000105"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:12.529642" elapsed="0.000114"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:28:12.525562" elapsed="0.004529"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:28:12.524616" elapsed="0.005615"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:28:12.514231" elapsed="0.016132">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_intra_as_ipmsi_ad"</status>
</kw>
<msg time="2026-04-17T03:28:12.530539" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:28:12.530609" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_intra_as_ipmsi_ad"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:12.513219" elapsed="0.017425"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:28:12.530965" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:12.530775" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:12.530743" elapsed="0.000329"/>
</if>
<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-04-17T03:28:12.535473" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:12.535285" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:12.535250" elapsed="0.000347"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:12.536335" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:28:12.536590" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:28:12.535910" elapsed="0.000720"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:12.537368" level="INFO">{1: 19}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:12.536916" elapsed="0.000521"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:12.538045" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:12.537670" elapsed="0.000439"/>
</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-04-17T03:28:12.538997" elapsed="0.000428"/>
</kw>
<msg time="2026-04-17T03:28:12.539575" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:28:12.539646" level="INFO">${old_connection_index} = 19</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:12.538362" elapsed="0.001321"/>
</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-04-17T03:28:12.541046" elapsed="0.000268"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:28:12.542799" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:28:12.542229" elapsed="0.001947">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:12.541549" elapsed="0.002777"/>
</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-04-17T03:28:12.545418" elapsed="0.000404"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:12.544597" elapsed="0.001369"/>
</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-04-17T03:28:12.540228" elapsed="0.005807"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:12.539805" elapsed="0.006307"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:12.539773" elapsed="0.006381"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:12.547455" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:28:12.546980" elapsed="0.000517"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:28:12.547580" elapsed="0.000057"/>
</return>
<msg time="2026-04-17T03:28:12.547835" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:28:12.546466" elapsed="0.001409"/>
</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-04-17T03:28:12.548136" elapsed="0.000642"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:12.549287" level="INFO">index=20
host=10.30.170.120
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-04-17T03:28:12.549434" level="INFO">${karaf_connection_object} = index=20
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:28:12.549107" elapsed="0.000366"/>
</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-04-17T03:28:12.549707" elapsed="0.003679"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:28:12.554151" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:28:12.555710" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:28:12.553664" elapsed="0.002686">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:28:12.577350" elapsed="0.000628"/>
</kw>
<msg time="2026-04-17T03:28:12.578124" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:12.574730" elapsed="0.003613"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:12.578594" elapsed="0.000033"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:12.578824" elapsed="0.000027"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:28:12.557823" elapsed="0.021142"/>
</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-04-17T03:28:12.556860" elapsed="0.022276"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:28:12.534734" elapsed="0.044541">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:12.579877" elapsed="0.000041"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:28:12.580011" 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="FAIL" start="2026-04-17T03:28:12.511994" elapsed="0.068187">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:28:12.580336" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:28:12.580394" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:12.504574" elapsed="0.075851"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:12.581209" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:12.580538" elapsed="0.000757"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:12.580509" elapsed="0.000828"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:28:12.504360" elapsed="0.077015"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:28:12.504087" elapsed="0.077334"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:28:12.500258" elapsed="0.081256"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:28:12.492850" elapsed="0.088767"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:12.491992" elapsed="0.089712"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:28:12.487478" elapsed="0.094328"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:12.583605" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:12.582817" elapsed="0.000832"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:12.584572" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:12.583894" elapsed="0.000718"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:12.585657" 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-04-17T03:28:12.584873" elapsed="0.000826"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:12.586356" 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-04-17T03:28:12.586605" 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-04-17T03:28:12.585979" elapsed="0.000666"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:12.587212" 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-04-17T03:28:12.587392" 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-04-17T03:28:12.586894" elapsed="0.000537"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-04-17T03:28:12.587666" elapsed="0.003709"/>
</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-04-17T03:28:12.591801" 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-04-17T03:28:12.655043" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:12.654451" elapsed="0.000630"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:12.655910" 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-04-17T03:28:12.655629" elapsed="0.000379">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-04-17T03:28:12.656107" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:12.655270" elapsed="0.000862"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:12.656695" 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-04-17T03:28:12.656302" elapsed="0.000420"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:12.657052" 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-04-17T03:28:12.657268" 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-04-17T03:28:12.656888" elapsed="0.000415"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:12.657860" 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-04-17T03:28:12.657572" elapsed="0.000338"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:12.659357" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:12.658970" elapsed="0.000433"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:12.659850" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:28:12.659569" elapsed="0.000317"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:12.660965" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:12.660429" elapsed="0.000566"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:12.662469" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:12.661827" elapsed="0.000748"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:12.662685" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:28:12.663090" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:12.661233" elapsed="0.001889"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:12.663300" elapsed="0.000493"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:28:12.660238" elapsed="0.003600"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:12.664642" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:12.664179" elapsed="0.000490"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:12.665971" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:12.665369" elapsed="0.000748"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:12.666218" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:28:12.666563" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:12.664868" 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-04-17T03:28:12.666810" elapsed="0.000444"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:28:12.663995" elapsed="0.003317"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:28:12.660003" elapsed="0.007356"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:28:12.667421" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:28:12.667657" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:28:12.658471" elapsed="0.009222"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:12.658015" elapsed="0.009725"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:12.668090" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:12.667856" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:12.657987" elapsed="0.010190"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:12.669037" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:28:12.668331" elapsed="0.000737"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:28:12.669119" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:28:12.653622" elapsed="0.015629"/>
</kw>
<msg time="2026-04-17T03:28:12.669311" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:12.640035" elapsed="0.029333"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:28:12.683656" elapsed="0.000056"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/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-04-17T03:28:12.697092" elapsed="0.000066"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</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-04-17T03:28:12.710129" elapsed="0.000062"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:12.710469" 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-04-17T03:28:12.710711" 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-04-17T03:28:12.711196" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:12.711037" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:12.711019" 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-04-17T03:28:12.711430" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:12.711602" elapsed="0.000038"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:12.711790" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:28:12.710976" elapsed="0.000867"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:28:12.710806" elapsed="0.001067"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:12.712043" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:12.712126" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:28:12.712374" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:28:12.634608" elapsed="0.077798"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:12.714008" 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-04-17T03:28:12.713647" elapsed="0.000438">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-04-17T03:28:12.714185" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:12.713223" 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-04-17T03:28:12.714570" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:12.714284" elapsed="0.000352"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:12.715304" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:12.714899" elapsed="0.000438"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:12.714668" elapsed="0.000715"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:12.714266" elapsed="0.001143"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:12.718191" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:28:12.715618" elapsed="0.002601"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:28:12.718273" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:28:12.718434" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:28:12.712803" elapsed="0.005655"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:12.719749" 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-04-17T03:28:12.719504" elapsed="0.000309">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-04-17T03:28:12.719908" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:12.719164" elapsed="0.000785"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:28:12.720160" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:28:12.720022" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:12.720003" elapsed="0.000243"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:12.720394" 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-04-17T03:28:12.720569" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:28:12.720633" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:28:12.722807" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:28:12.718813" elapsed="0.004021"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:12.724285" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:12.724025" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:12.724734" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:12.724488" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:28:12.730193" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:12.932220" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:13.335838" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:13.338732" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:28:12.726983" elapsed="0.617366">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:12.724843" elapsed="0.619750">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:13.345352" elapsed="0.000073"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:13.344695" elapsed="0.000848"/>
</branch>
<status status="FAIL" start="2026-04-17T03:28:12.724826" elapsed="0.620779">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:13.346320" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:13.346524" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:13.346467" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:13.346439" 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-04-17T03:28:13.346826" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:28:13.346929" elapsed="0.000040"/>
</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-04-17T03:28:12.723171" elapsed="0.623944">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:13.347226" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:28:12.610207" elapsed="0.737157">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:13.347757" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:13.347498" elapsed="0.000360"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:13.347473" elapsed="0.000418"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:13.347959" elapsed="0.000022"/>
</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-04-17T03:28:12.601923" elapsed="0.746180">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:15.417913" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:15.417394" elapsed="0.000581"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:15.418883" 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-04-17T03:28:15.418577" elapsed="0.000439">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-04-17T03:28:15.419157" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:15.418165" elapsed="0.001029"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:15.420282" 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-04-17T03:28:15.419497" elapsed="0.000835"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:15.420857" 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-04-17T03:28:15.421149" 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-04-17T03:28:15.420644" elapsed="0.000547"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:15.422008" 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-04-17T03:28:15.421501" 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-04-17T03:28:15.423878" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:15.423438" elapsed="0.000539"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:15.424600" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:28:15.424211" elapsed="0.000426"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:15.425782" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:15.425213" elapsed="0.000605"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:15.427601" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:15.426833" elapsed="0.000904"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:15.427843" elapsed="0.000055"/>
</return>
<msg time="2026-04-17T03:28:15.428303" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:15.426128" elapsed="0.002212"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:15.428544" elapsed="0.000454"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:28:15.425006" elapsed="0.004052"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:15.430369" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:15.429413" elapsed="0.000986"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:15.431689" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:15.431137" elapsed="0.000651"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:15.431867" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:28:15.432186" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:15.430634" elapsed="0.001578"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:15.432443" elapsed="0.000380"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:28:15.429228" elapsed="0.003640"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:28:15.424711" elapsed="0.008193"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:28:15.432977" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:28:15.433144" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:28:15.422960" elapsed="0.010209"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:15.422310" elapsed="0.010893"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:15.433391" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:15.433232" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:15.422263" elapsed="0.011204"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:15.434331" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:28:15.433615" elapsed="0.000747"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:28:15.434412" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:28:15.416525" elapsed="0.018014"/>
</kw>
<msg time="2026-04-17T03:28:15.434597" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:15.403091" elapsed="0.031561"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:28:15.447336" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:15.459619" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:15.472020" elapsed="0.000037"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:15.472268" 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-04-17T03:28:15.472455" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:15.472877" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:15.472723" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:15.472705" elapsed="0.000273"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:15.473125" 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-04-17T03:28:15.473294" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:15.473548" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:28:15.472667" elapsed="0.000937"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:28:15.472540" elapsed="0.001092"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:15.473788" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:15.473869" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:28:15.474044" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:28:15.397824" elapsed="0.076250"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:15.475533" 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-04-17T03:28:15.475241" elapsed="0.000368">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-04-17T03:28:15.475705" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:15.474820" elapsed="0.000909"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:15.476084" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:15.475800" elapsed="0.000342"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:15.476652" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:15.476354" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:15.476166" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:15.475782" elapsed="0.000952"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:15.479518" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:28:15.476885" elapsed="0.002660"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:28:15.479598" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:28:15.479765" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:28:15.474459" elapsed="0.005331"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:15.481053" 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-04-17T03:28:15.480796" elapsed="0.000322">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-04-17T03:28:15.481212" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:15.480456" elapsed="0.000780"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:28:15.481443" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-17T03:28:15.481306" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:15.481288" 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-04-17T03:28:15.481675" 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-04-17T03:28:15.481849" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:28:15.481914" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:28:15.484109" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:28:15.480121" elapsed="0.004015"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:15.485569" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:15.485312" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:15.486092" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:15.485825" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:28:15.491285" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:15.693396" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:16.097075" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:16.100049" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:28:15.488293" elapsed="0.615694">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:15.486202" elapsed="0.617948">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:16.104524" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:16.104213" elapsed="0.000411"/>
</branch>
<status status="FAIL" start="2026-04-17T03:28:15.486184" elapsed="0.618476">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:16.105387" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:16.105644" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:16.105583" elapsed="0.000129"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:16.105546" elapsed="0.000195"/>
</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-04-17T03:28:16.105900" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:28:16.105993" 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-04-17T03:28:15.484455" elapsed="0.621663">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:16.106198" 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-04-17T03:28:15.366232" elapsed="0.740069">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:16.106669" elapsed="0.000323"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:16.106462" elapsed="0.000585"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:16.106444" elapsed="0.000629"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:16.107110" elapsed="0.000016"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-04-17T03:28:15.358328" elapsed="0.748893">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:18.162525" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_as_ipmsi_ad/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:18.162116" elapsed="0.000445"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:18.163360" 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-04-17T03:28:18.163104" elapsed="0.000366">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-04-17T03:28:18.163569" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:18.162739" elapsed="0.000856"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:18.164177" 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-04-17T03:28:18.163766" elapsed="0.000439"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:18.164516" 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-04-17T03:28:18.164679" 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-04-17T03:28:18.164372" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:18.165137" 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-04-17T03:28:18.164867" 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-04-17T03:28:18.166257" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:18.165917" elapsed="0.000387"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:18.166808" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:28:18.166469" elapsed="0.000382"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:18.167750" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:18.167296" elapsed="0.000481"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:18.169023" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:18.168443" elapsed="0.000681"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:18.169203" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:28:18.169505" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:18.167988" elapsed="0.001543"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:18.169690" elapsed="0.000604"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:28:18.167154" elapsed="0.003183"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:18.171024" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:18.170591" elapsed="0.000521"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:18.172355" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:18.171788" elapsed="0.000670"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:18.172536" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:28:18.172828" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:18.171312" elapsed="0.001542"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:18.173028" elapsed="0.000370"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:28:18.170452" elapsed="0.002988"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:28:18.166954" elapsed="0.006522"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:28:18.173520" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:28:18.173678" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:28:18.165581" elapsed="0.008123"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:18.165263" elapsed="0.008473"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:18.173915" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:18.173761" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:18.165240" elapsed="0.008771"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:18.174758" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:28:18.174159" elapsed="0.000629"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:28:18.174837" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:28:18.161451" elapsed="0.013554"/>
</kw>
<msg time="2026-04-17T03:28:18.175076" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:18.148715" elapsed="0.026417"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:28:18.187879" elapsed="0.000085"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:28:18.200921" elapsed="0.000070"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</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-04-17T03:28:18.213856" elapsed="0.000045"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:18.214153" 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-04-17T03:28:18.214344" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:18.214914" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:18.214714" elapsed="0.000280"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:18.214696" 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-04-17T03:28:18.215172" 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-04-17T03:28:18.215344" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:18.215550" elapsed="0.000070"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:28:18.214653" elapsed="0.001012"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:28:18.214517" elapsed="0.001181"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:18.215921" elapsed="0.000047"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:18.216043" elapsed="0.000021"/>
</return>
<msg time="2026-04-17T03:28:18.216237" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:28:18.144458" elapsed="0.071813"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:18.217795" 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-04-17T03:28:18.217499" elapsed="0.000374">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-04-17T03:28:18.217986" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:18.217090" elapsed="0.000922"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:18.218364" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:18.218084" elapsed="0.000338"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:18.218949" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:18.218632" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:18.218447" elapsed="0.000564"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:18.218066" elapsed="0.000966"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:18.221726" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:28:18.219185" elapsed="0.002569"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:28:18.221811" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:28:18.221994" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:28:18.216685" elapsed="0.005336"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:18.223288" 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-04-17T03:28:18.223042" elapsed="0.000313">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-04-17T03:28:18.223450" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:18.222677" elapsed="0.000800"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:28:18.223740" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:28:18.223567" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:18.223544" elapsed="0.000283"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:18.223996" 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-04-17T03:28:18.224174" elapsed="0.000109"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:28:18.224342" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:28:18.226311" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:28:18.222336" elapsed="0.004002"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:18.228190" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:18.227750" elapsed="0.000489"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:18.228643" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:18.228398" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:28:18.233779" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:18.435534" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:18.838782" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:18.841778" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:28:18.230804" elapsed="0.615843">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:18.228753" elapsed="0.618052">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:18.847209" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:18.846871" elapsed="0.000466"/>
</branch>
<status status="FAIL" start="2026-04-17T03:28:18.228735" elapsed="0.618653">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:18.848099" elapsed="0.000043"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:18.848320" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:18.848258" elapsed="0.000131"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:18.848228" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:18.848643" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:28:18.848749" 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-04-17T03:28:18.226659" elapsed="0.622290">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:18.849148" 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-04-17T03:28:18.121619" elapsed="0.727716">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:18.850189" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:18.849483" elapsed="0.000817"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:18.849457" elapsed="0.000879"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:18.850386" elapsed="0.000022"/>
</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-04-17T03:28:18.115198" elapsed="0.735339">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:28:18.850697" level="FAIL">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-17T03:28:12.594379" elapsed="6.256469">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:28:18.851191" elapsed="0.000044"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:28:18.851511" elapsed="0.000031"/>
</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="NOT RUN" start="2026-04-17T03:28:18.851766" elapsed="0.000035"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:28:18.852065" elapsed="0.000029"/>
</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-04-17T03:28:18.852465" elapsed="0.003011"/>
</kw>
<arg>intra_as_ipmsi_ad</arg>
<arg>${MVPN_DIR}</arg>
<status status="FAIL" start="2026-04-17T03:28:12.582214" elapsed="6.273357">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:12.486791" elapsed="6.368985">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:28:18.859623" elapsed="0.000275"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:28:18.859341" elapsed="0.000640"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:18.861167" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:18.860951" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:18.860910" elapsed="0.000336"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:18.866459" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:18.866333" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:18.866313" elapsed="0.000219"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:18.867847" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:28:18.867351" elapsed="0.000527"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:28:18.868385" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:28:18.868066" elapsed="0.000346"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:28:18.868457" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:28:18.868628" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:28:18.866790" elapsed="0.001865"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:18.876701" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:18.876561" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:18.876535" 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-04-17T03:28:18.878251" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:18.878135" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:18.878115" elapsed="0.000208"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:18.878872" level="INFO">${karaf_connection_index} = 20</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:28:18.878501" elapsed="0.000400"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:18.879361" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:28:18.879119" elapsed="0.000270"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:28:18.880236" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:28:18.879924" elapsed="0.001041">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:28:18.881163" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:28:18.881222" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:18.879563" elapsed="0.001688"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:28:18.882155" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:28:18.881877" elapsed="0.000959">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:28:18.883046" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:28:18.883093" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:18.881487" elapsed="0.001629"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:28:18.884169" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_inter_as_ipmsi_ad"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:28:18.883456" elapsed="0.000779">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_inter_as_ipmsi_ad"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:18.883199" elapsed="0.001111">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_inter_as_ipmsi_ad"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:28:18.883176" elapsed="0.001170">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_inter_as_ipmsi_ad"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:18.884550" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:18.884798" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:18.884649" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:18.884631" elapsed="0.000245"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:28:18.884913" 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-04-17T03:28:18.887874" elapsed="0.000193"/>
</kw>
<msg time="2026-04-17T03:28:18.888141" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:18.886561" elapsed="0.001717"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:18.888558" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:18.888904" elapsed="0.000119"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:28:18.885870" elapsed="0.003269"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:28:18.885255" elapsed="0.003951"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:28:18.877758" elapsed="0.011541">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_inter_as_ipmsi_ad"</status>
</kw>
<msg time="2026-04-17T03:28:18.889452" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:28:18.889501" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_inter_as_ipmsi_ad"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:18.877007" elapsed="0.012524"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:28:18.889789" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:18.889642" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:18.889614" elapsed="0.000247"/>
</if>
<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-04-17T03:28:18.890980" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:18.890849" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:18.890826" elapsed="0.000224"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:18.891345" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:28:18.891453" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:28:18.891210" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:18.891912" level="INFO">{1: 20}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:18.891638" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:18.892409" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:18.892157" elapsed="0.000296"/>
</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-04-17T03:28:18.893075" elapsed="0.000270"/>
</kw>
<msg time="2026-04-17T03:28:18.893495" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:28:18.893546" level="INFO">${old_connection_index} = 20</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:18.892616" elapsed="0.000955"/>
</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-04-17T03:28:18.894424" elapsed="0.000195"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:28:18.895803" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:28:18.895361" elapsed="0.001385">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:18.894791" elapsed="0.002064"/>
</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-04-17T03:28:18.897714" elapsed="0.000300"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:18.897176" elapsed="0.000924"/>
</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-04-17T03:28:18.893885" elapsed="0.004261"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:18.893653" elapsed="0.004543"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:18.893633" elapsed="0.004590"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:18.899143" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:28:18.898798" elapsed="0.000372"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:28:18.899221" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:28:18.899383" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:28:18.898446" elapsed="0.001024"/>
</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-04-17T03:28:18.899637" elapsed="0.000455"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:18.900385" level="INFO">index=21
host=10.30.170.120
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-04-17T03:28:18.900487" level="INFO">${karaf_connection_object} = index=21
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:28:18.900267" elapsed="0.000247"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:18.900666" elapsed="0.002501"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:28:18.903605" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:28:18.905030" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:28:18.903340" elapsed="0.002161">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:28:18.920177" elapsed="0.000400"/>
</kw>
<msg time="2026-04-17T03:28:18.920674" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:18.918529" elapsed="0.002298"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:18.921010" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:18.921181" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:28:18.906437" elapsed="0.014827"/>
</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-04-17T03:28:18.905836" elapsed="0.015478"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:28:18.890315" elapsed="0.031124">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:18.921876" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:28:18.921971" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:28:18.876065" elapsed="0.046024">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:28:18.922205" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:28:18.922250" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:18.869070" elapsed="0.053204"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:18.922625" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:18.922359" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:18.922338" elapsed="0.000368"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:28:18.868901" elapsed="0.053829"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:28:18.868713" elapsed="0.054051"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:28:18.865913" elapsed="0.056911"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:28:18.860618" elapsed="0.062264"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:18.860142" elapsed="0.062804"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:28:18.856800" elapsed="0.066206"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:18.923895" 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-04-17T03:28:18.924316" 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-04-17T03:28:18.923686" elapsed="0.000658"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-17T03:28:18.924731" 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-04-17T03:28:18.924505" elapsed="0.000254"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:18.925136" 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-04-17T03:28:18.925269" 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-04-17T03:28:18.924922" elapsed="0.000373"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-17T03:28:18.925699" 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-04-17T03:28:18.925455" elapsed="0.000272"/>
</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-04-17T03:28:18.926068" elapsed="0.002653"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:18.925806" elapsed="0.002954"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:18.925781" elapsed="0.003005"/>
</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-04-17T03:28:18.967404" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:18.966822" elapsed="0.000616"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:18.968249" 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-04-17T03:28:18.967970" elapsed="0.000357">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-04-17T03:28:18.968423" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:18.967613" elapsed="0.000834"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:18.969025" 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-04-17T03:28:18.968614" elapsed="0.000438"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:18.969358" 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-04-17T03:28:18.969529" 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-04-17T03:28:18.969215" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:18.970145" 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-04-17T03:28:18.969833" elapsed="0.000360"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:18.971274" level="INFO">mapping: {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:18.971006" elapsed="0.000313"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:18.971759" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:28:18.971485" elapsed="0.000300"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:18.972632" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:18.972328" elapsed="0.000330"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:18.973670" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:18.973198" elapsed="0.000499"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:18.973752" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:28:18.973922" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:18.972852" elapsed="0.001133"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:18.974240" elapsed="0.000249"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:28:18.972186" elapsed="0.002345"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:18.975102" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:18.974782" elapsed="0.000345"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:18.976068" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:18.975640" elapsed="0.000455"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:18.976155" elapsed="0.000047"/>
</return>
<msg time="2026-04-17T03:28:18.976346" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:18.975317" elapsed="0.001055"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:18.976528" elapsed="0.000229"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:28:18.974646" elapsed="0.002151"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:28:18.971838" elapsed="0.004996"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:28:18.976879" elapsed="0.000027"/>
</return>
<msg time="2026-04-17T03:28:18.977061" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:28:18.970630" elapsed="0.006456"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:18.970276" elapsed="0.006845"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:18.977307" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:18.977149" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:18.970251" elapsed="0.007141"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:18.978281" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:28:18.977544" elapsed="0.000767"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:28:18.978362" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:28:18.966147" elapsed="0.012348"/>
</kw>
<msg time="2026-04-17T03:28:18.978554" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:18.953274" elapsed="0.025336"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:18.992130" elapsed="0.000044"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:28:19.004669" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/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-04-17T03:28:19.017364" elapsed="0.000032"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:19.017686" 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-04-17T03:28:19.017991" 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-04-17T03:28:19.018507" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:19.018293" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:19.018269" 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-04-17T03:28:19.018753" 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-04-17T03:28:19.018976" 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-04-17T03:28:19.019157" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:28:19.018206" elapsed="0.001006"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:28:19.018081" elapsed="0.001159"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:19.019391" elapsed="0.000027"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:19.019509" elapsed="0.000027"/>
</return>
<msg time="2026-04-17T03:28:19.019707" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:28:18.948030" elapsed="0.071708"/>
</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-04-17T03:28:19.052409" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:19.051957" elapsed="0.000487"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:19.053273" 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-04-17T03:28:19.053008" elapsed="0.000342">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-04-17T03:28:19.053450" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:19.052628" elapsed="0.000847"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:19.054132" 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-04-17T03:28:19.053647" elapsed="0.000513"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:19.054477" 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-04-17T03:28:19.054658" 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-04-17T03:28:19.054328" elapsed="0.000360"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:19.055167" 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-04-17T03:28:19.054871" elapsed="0.000354"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-17T03:28:19.055763" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:19.055378" elapsed="0.000448"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:19.056325" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:19.056022" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:19.055853" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:19.055351" elapsed="0.001060"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:19.057049" 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-04-17T03:28:19.056563" elapsed="0.000517"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:28:19.057134" 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/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-04-17T03:28:19.051132" elapsed="0.006146"/>
</kw>
<msg time="2026-04-17T03:28:19.057336" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:19.032569" elapsed="0.024818"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:19.072952" elapsed="0.000077"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:19.087476" elapsed="0.000074"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</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-04-17T03:28:19.101745" elapsed="0.000057"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:19.102134" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:19.102330" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:19.102772" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:19.102616" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:19.102599" 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-04-17T03:28:19.103025" 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-04-17T03:28:19.103198" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:19.103365" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:28:19.102558" elapsed="0.000860"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:28:19.102418" elapsed="0.001028"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:19.103680" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:19.103762" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:28:19.103947" 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-04-17T03:28:19.031461" elapsed="0.072521"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:19.105467" 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-04-17T03:28:19.105151" elapsed="0.000392">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-04-17T03:28:19.105639" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:19.104726" elapsed="0.000939"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:19.106038" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:19.105737" elapsed="0.000366"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:19.106618" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:19.106318" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:19.106128" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:19.105719" elapsed="0.000983"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:19.109090" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:28:19.106861" elapsed="0.002255"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:28:19.109169" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:28:19.109327" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:28:19.104364" elapsed="0.004988"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:19.110965" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:28:19.110685" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:19.111425" 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-04-17T03:28:19.111172" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:19.111885" 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-04-17T03:28:19.111635" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:19.112346" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:19.112102" elapsed="0.000288"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:19.113226" 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-04-17T03:28:19.113022" elapsed="0.000231"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:28:19.113582" 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-04-17T03:28:19.113408" 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-04-17T03:28:19.113759" elapsed="0.000257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:19.114426" 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-04-17T03:28:19.114178" elapsed="0.000341"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:28:19.114563" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:28:19.114722" 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-04-17T03:28:19.112595" elapsed="0.002152"/>
</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-04-17T03:28:19.120387" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:19.322085" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:19.725650" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:19.728546" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:28:19.117154" elapsed="0.616444">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:19.114818" elapsed="0.618961">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:28:19.734199" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:19.733847" elapsed="0.000464"/>
</branch>
<status status="FAIL" start="2026-04-17T03:28:19.114800" elapsed="0.619549">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:28:19.735054" elapsed="0.000044"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:19.735281" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:19.735221" elapsed="0.000128"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:19.735190" 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-04-17T03:28:19.735632" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:28:19.735733" elapsed="0.000024"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>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="FAIL" start="2026-04-17T03:28:19.109686" elapsed="0.626234">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:19.736081" elapsed="0.000027"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>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="FAIL" start="2026-04-17T03:28:18.935514" elapsed="0.800720">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:19.736866" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:19.736575" elapsed="0.000433"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:19.736544" elapsed="0.000504"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:19.737099" 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="FAIL" start="2026-04-17T03:28:18.929092" elapsed="0.808164">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:28:19.737544" elapsed="0.000032"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<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="NOT RUN" start="2026-04-17T03:28:19.737895" elapsed="0.000057"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:19.738183" elapsed="0.000030"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations">
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:19.738455" elapsed="0.000033"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:28:19.738726" elapsed="0.000031"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<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="NOT RUN" start="2026-04-17T03:28:19.739080" elapsed="0.000035"/>
</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-04-17T03:28:19.785815" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:19.785367" elapsed="0.000491"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:19.786808" 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-04-17T03:28:19.786494" elapsed="0.000393">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-04-17T03:28:19.787004" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:19.786088" elapsed="0.000941"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:19.787636" 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-04-17T03:28:19.787204" elapsed="0.000519"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:19.788080" 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-04-17T03:28:19.788246" 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-04-17T03:28:19.787911" elapsed="0.000361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:19.788690" 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-04-17T03:28:19.788433" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:19.789818" level="INFO">mapping: {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:19.789556" elapsed="0.000308"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:19.790388" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:28:19.790111" elapsed="0.000303"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:19.791343" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:19.790786" elapsed="0.000583"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:19.792564" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:19.792112" elapsed="0.000493"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:19.792725" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:28:19.792972" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:19.791564" elapsed="0.001434"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:19.793157" elapsed="0.000497"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:28:19.790645" elapsed="0.003050"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:19.794530" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:19.793995" elapsed="0.000563"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:19.795981" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:19.795292" elapsed="0.000733"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:19.796145" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:28:19.796373" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:19.794752" elapsed="0.001646"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:19.796557" elapsed="0.000513"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:28:19.793813" elapsed="0.003301"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:28:19.790467" elapsed="0.006683"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:28:19.797195" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:28:19.797356" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:28:19.789192" elapsed="0.008190"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:19.788816" elapsed="0.008599"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:19.797598" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:19.797441" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:19.788792" elapsed="0.008882"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:19.798484" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:28:19.797821" elapsed="0.000693"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:28:19.798565" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/app/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:28:19.784537" elapsed="0.014154"/>
</kw>
<msg time="2026-04-17T03:28:19.798747" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:19.771337" elapsed="0.027472"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:19.812071" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/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-04-17T03:28:19.825896" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/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-04-17T03:28:19.838565" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:19.838798" 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-04-17T03:28:19.839005" 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-04-17T03:28:19.839421" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:19.839265" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:19.839248" 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-04-17T03:28:19.839649" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:19.839864" 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-04-17T03:28:19.840064" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:28:19.839210" elapsed="0.000908"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:28:19.839091" elapsed="0.001055"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:19.840296" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:19.840376" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:28:19.840528" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:28:19.766643" elapsed="0.073913"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:19.841865" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:28:19.841505" elapsed="0.000414"/>
</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-04-17T03:28:19.846961" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:20.049400" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:20.451834" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:20.455055" level="INFO">${response} = None</msg>
<msg time="2026-04-17T03:28:20.455231" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:19.844158" elapsed="0.617468">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:19.842007" elapsed="0.619999">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:20.462814" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:20.462275" elapsed="0.000743"/>
</branch>
<status status="FAIL" start="2026-04-17T03:28:19.841989" elapsed="0.621091">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:20.469201" 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-04-17T03:28:20.466546" elapsed="0.002695">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:20.466285" elapsed="0.003065">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:28:20.466259" elapsed="0.003128">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-04-17T03:28:20.472001" 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-04-17T03:28:20.469703" elapsed="0.002332">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:20.469466" elapsed="0.002633">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:28:20.469447" elapsed="0.002684">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:20.472824" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:28:20.472352" elapsed="0.000499"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:20.473186" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:20.472921" elapsed="0.000324"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:20.473810" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:20.473494" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:20.473313" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:20.472903" elapsed="0.000991"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:20.474476" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:28:20.474074" elapsed="0.000429"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:20.474812" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:20.474572" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:20.475380" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:20.475076" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:20.474893" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:20.474554" elapsed="0.000910"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:20.475624" elapsed="0.000372"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-17T03:28:20.476476" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:28:20.476165" elapsed="0.000338"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-04-17T03:28:20.479007" 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-04-17T03:28:20.476661" elapsed="0.002382">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-04-17T03:28:20.464446" elapsed="0.014758">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-04-17T03:28:20.479276" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:28:20.481736" level="INFO">${response_text} = None</msg>
<msg time="2026-04-17T03:28:20.481768" 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-04-17T03:28:19.840842" elapsed="0.641023">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-04-17T03:28:20.481953" elapsed="0.000029"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="FAIL" start="2026-04-17T03:28:19.740658" elapsed="0.741477">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:19.740134" elapsed="0.742073"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-04-17T03:28:19.739488" elapsed="0.742785"/>
</kw>
<arg>inter_as_ipmsi_ad</arg>
<arg>${MVPN_DIR}</arg>
<status status="FAIL" start="2026-04-17T03:28:18.923302" elapsed="1.559053">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:18.856246" elapsed="1.626294">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:28:20.486445" elapsed="0.000310"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:28:20.486147" elapsed="0.000683"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:20.488361" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:20.488203" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:20.488170" elapsed="0.000277"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:20.493484" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:20.493364" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:20.493295" elapsed="0.000257"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:20.494620" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:28:20.494210" elapsed="0.000438"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:28:20.495316" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:28:20.494811" elapsed="0.000543"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:28:20.495401" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:28:20.495610" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:28:20.493794" elapsed="0.001852"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:20.501342" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:20.501212" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:20.501191" elapsed="0.000238"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:20.502688" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:20.502578" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:20.502560" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:20.503260" level="INFO">${karaf_connection_index} = 21</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:28:20.502914" elapsed="0.000373"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:20.503681" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:28:20.503454" elapsed="0.000253"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:28:20.504689" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:28:20.504243" elapsed="0.001351">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:28:20.505796" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:28:20.505843" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:20.503870" elapsed="0.002070"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:28:20.506726" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:28:20.506473" elapsed="0.000948">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:28:20.507610" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:28:20.507657" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:20.506123" elapsed="0.001558"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:28:20.508634" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_inter_as_ipmsi_ad"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:28:20.508009" elapsed="0.000689">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_inter_as_ipmsi_ad"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:20.507757" elapsed="0.001015">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_inter_as_ipmsi_ad"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:28:20.507738" elapsed="0.001068">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_inter_as_ipmsi_ad"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:20.508990" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:20.509241" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:20.509078" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:20.509062" elapsed="0.000255"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:28:20.509372" elapsed="0.000018"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:28:20.512032" elapsed="0.000160"/>
</kw>
<msg time="2026-04-17T03:28:20.512282" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:20.510943" 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-04-17T03:28:20.512849" elapsed="0.000122"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:20.513412" elapsed="0.000107"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:28:20.510257" elapsed="0.003426"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:28:20.509670" elapsed="0.004105"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:28:20.502273" elapsed="0.011621">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_inter_as_ipmsi_ad"</status>
</kw>
<msg time="2026-04-17T03:28:20.514186" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:28:20.514259" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_inter_as_ipmsi_ad"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:20.501592" elapsed="0.012700"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:28:20.514540" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:20.514395" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:20.514370" elapsed="0.000260"/>
</if>
<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-04-17T03:28:20.515702" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:20.515591" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:20.515560" elapsed="0.000209"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:20.516205" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:28:20.516315" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:28:20.516062" elapsed="0.000281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:20.516802" level="INFO">{1: 21}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:20.516499" elapsed="0.000361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:20.517289" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:20.517037" elapsed="0.000297"/>
</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-04-17T03:28:20.518116" elapsed="0.000421"/>
</kw>
<msg time="2026-04-17T03:28:20.518666" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:28:20.518731" level="INFO">${old_connection_index} = 21</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:20.517564" elapsed="0.001199"/>
</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-04-17T03:28:20.519697" elapsed="0.000228"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:28:20.523497" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:28:20.520688" elapsed="0.004220">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:20.520205" elapsed="0.004856"/>
</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-04-17T03:28:20.526079" elapsed="0.000356"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:20.525341" elapsed="0.001196"/>
</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-04-17T03:28:20.519172" elapsed="0.007423"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:20.518865" elapsed="0.007791"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:20.518840" elapsed="0.007857"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:20.527925" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:28:20.527501" elapsed="0.000490"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:28:20.528063" elapsed="0.000059"/>
</return>
<msg time="2026-04-17T03:28:20.528279" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:28:20.527032" elapsed="0.001272"/>
</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-04-17T03:28:20.528479" elapsed="0.000549"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:20.529349" level="INFO">index=22
host=10.30.170.120
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-04-17T03:28:20.529502" level="INFO">${karaf_connection_object} = index=22
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:28:20.529222" elapsed="0.000308"/>
</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-04-17T03:28:20.529721" elapsed="0.002811"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:28:20.533132" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:28:20.534805" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:28:20.532741" elapsed="0.002737">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:28:20.552064" elapsed="0.000543"/>
</kw>
<msg time="2026-04-17T03:28:20.552770" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:20.549981" elapsed="0.003022"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:20.553236" elapsed="0.000031"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:20.553512" elapsed="0.000030"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:28:20.536689" elapsed="0.016946"/>
</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-04-17T03:28:20.536012" elapsed="0.017698"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:28:20.515248" elapsed="0.038603">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:20.554823" elapsed="0.000039"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:28:20.555048" 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="FAIL" start="2026-04-17T03:28:20.500830" elapsed="0.054389">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:28:20.555381" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:28:20.555441" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:20.496097" elapsed="0.059377"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:20.555999" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:20.555596" elapsed="0.000481"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:20.555565" elapsed="0.000544"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:28:20.495919" elapsed="0.060226"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:28:20.495729" elapsed="0.060465"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:28:20.492947" elapsed="0.063335"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:28:20.487623" elapsed="0.068744"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:20.487080" elapsed="0.069355"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:28:20.483519" elapsed="0.072999"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:20.558327" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:20.557546" elapsed="0.000825"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:20.559488" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:20.558631" elapsed="0.000896"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:20.560353" 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-04-17T03:28:20.559763" elapsed="0.000627"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:20.560876" 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-04-17T03:28:20.561155" 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-04-17T03:28:20.560622" elapsed="0.000570"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:20.561732" 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-04-17T03:28:20.561877" 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-04-17T03:28:20.561432" elapsed="0.000471"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-04-17T03:28:20.562085" elapsed="0.003153"/>
</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-04-17T03:28:20.565596" elapsed="0.002209"/>
</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-04-17T03:28:20.628088" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:20.627623" elapsed="0.000502"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:20.628989" 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-04-17T03:28:20.628672" elapsed="0.000403">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-04-17T03:28:20.629272" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:20.628311" elapsed="0.000986"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:20.630021" 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-04-17T03:28:20.629469" elapsed="0.000588"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:20.630426" 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-04-17T03:28:20.630608" 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-04-17T03:28:20.630273" elapsed="0.000365"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:20.631190" 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-04-17T03:28:20.630840" elapsed="0.000415"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:20.632475" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:20.632147" elapsed="0.000376"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:20.633007" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:28:20.632689" elapsed="0.000345"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:20.633889" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:20.633420" elapsed="0.000500"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:20.635195" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:20.634611" elapsed="0.000687"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:20.635397" elapsed="0.000053"/>
</return>
<msg time="2026-04-17T03:28:20.635734" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:20.634143" elapsed="0.001618"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:20.635948" elapsed="0.000463"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:28:20.633278" elapsed="0.003177"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:20.637203" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:20.636739" elapsed="0.000491"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:20.639026" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:20.638380" elapsed="0.000757"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:20.639233" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:28:20.639572" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:20.637852" elapsed="0.001746"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:20.639773" elapsed="0.000421"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:28:20.636591" elapsed="0.003646"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:28:20.633092" elapsed="0.007182"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:28:20.640322" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:28:20.640489" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:28:20.631769" elapsed="0.008753"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:20.631366" elapsed="0.009193"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:20.640762" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:20.640589" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:20.631331" elapsed="0.009520"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:20.641722" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:28:20.641033" elapsed="0.000720"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:28:20.641802" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:28:20.626786" elapsed="0.015299"/>
</kw>
<msg time="2026-04-17T03:28:20.642147" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:20.613044" elapsed="0.029159"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:20.656437" elapsed="0.000073"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:20.672701" elapsed="0.000089"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</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-04-17T03:28:20.686147" elapsed="0.000077"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:20.686530" 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-04-17T03:28:20.686772" 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-04-17T03:28:20.687506" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:20.687209" elapsed="0.000396"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:20.687183" elapsed="0.000461"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:20.687868" elapsed="0.000030"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:20.688150" 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-04-17T03:28:20.688406" elapsed="0.000039"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:28:20.687125" elapsed="0.001383"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:28:20.686878" elapsed="0.001680"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:20.688800" elapsed="0.000031"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:20.688920" elapsed="0.000049"/>
</return>
<msg time="2026-04-17T03:28:20.689190" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:28:20.608377" elapsed="0.080857"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:20.691862" 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-04-17T03:28:20.691391" elapsed="0.000619">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-04-17T03:28:20.692197" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:20.690652" elapsed="0.001594"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:20.692899" elapsed="0.000070"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:20.692389" elapsed="0.000638"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:20.693914" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:20.693351" elapsed="0.000628"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:20.693066" elapsed="0.000969"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:20.692351" elapsed="0.001717"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:20.697367" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:28:20.694311" elapsed="0.003090"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:28:20.697463" elapsed="0.000047"/>
</return>
<msg time="2026-04-17T03:28:20.697654" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:28:20.689878" elapsed="0.007802"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:20.699328" 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-04-17T03:28:20.699008" elapsed="0.000399">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-04-17T03:28:20.699506" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:20.698595" elapsed="0.000935"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:28:20.699753" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:28:20.699605" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:20.699585" elapsed="0.000254"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:20.700006" elapsed="0.000024"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:20.700254" elapsed="0.000032"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:28:20.700352" elapsed="0.000023"/>
</return>
<msg time="2026-04-17T03:28:20.702604" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:28:20.698133" elapsed="0.004509"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:20.704246" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:20.703962" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:20.704860" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:20.704527" 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-04-17T03:28:20.712054" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:20.914221" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:21.318051" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:21.321571" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:28:20.708060" elapsed="0.619862">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:20.705057" elapsed="0.623087">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:21.328657" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:21.328225" elapsed="0.000539"/>
</branch>
<status status="FAIL" start="2026-04-17T03:28:20.705029" elapsed="0.623772">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:21.329610" elapsed="0.000046"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:21.329844" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:21.329778" elapsed="0.000136"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:21.329745" elapsed="0.000225"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:21.330195" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:28:21.330301" elapsed="0.000024"/>
</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-04-17T03:28:20.703030" elapsed="0.627456">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:21.330603" 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-04-17T03:28:20.582167" elapsed="0.748587">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:21.331245" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:21.330901" elapsed="0.000462"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:21.330871" elapsed="0.000530"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:21.331449" elapsed="0.000021"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-04-17T03:28:20.576400" elapsed="0.755199">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:23.391316" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:23.390840" elapsed="0.000511"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:23.392267" 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-04-17T03:28:23.392004" elapsed="0.000341">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-04-17T03:28:23.392443" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:23.391631" elapsed="0.000836"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:23.393047" 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-04-17T03:28:23.392636" elapsed="0.000438"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:23.393388" 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-04-17T03:28:23.393547" 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-04-17T03:28:23.393241" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:23.394015" 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-04-17T03:28:23.393736" elapsed="0.000328"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:23.395217" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:23.394828" elapsed="0.000436"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:23.395704" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:28:23.395430" elapsed="0.000300"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:23.396541" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:23.396132" elapsed="0.000436"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:23.397800" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:23.397246" elapsed="0.000656"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:23.398001" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:28:23.398306" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:23.396761" elapsed="0.001572"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:23.398496" elapsed="0.000389"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:28:23.395991" elapsed="0.002951"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:23.399979" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:23.399257" elapsed="0.000759"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:23.401296" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:23.400708" elapsed="0.000693"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:23.401482" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:28:23.401788" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:23.400232" elapsed="0.001583"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:23.401998" elapsed="0.000446"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:28:23.399114" elapsed="0.003377"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:28:23.395784" elapsed="0.006743"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:28:23.402572" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:28:23.402741" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:28:23.394498" elapsed="0.008270"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:23.394145" elapsed="0.008656"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:23.403057" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:23.402828" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:23.394120" elapsed="0.009073"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:23.404006" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:28:23.403353" elapsed="0.000684"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:28:23.404088" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:28:23.390182" elapsed="0.014039"/>
</kw>
<msg time="2026-04-17T03:28:23.404279" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:23.376873" elapsed="0.027459"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:23.417542" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/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-04-17T03:28:23.433898" elapsed="0.000062"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:28:23.446259" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:23.446493" 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-04-17T03:28:23.446680" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:23.447151" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:23.446966" elapsed="0.000244"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:23.446947" elapsed="0.000289"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:23.447384" 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-04-17T03:28:23.447551" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:23.447718" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:28:23.446885" elapsed="0.000887"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:28:23.446765" elapsed="0.001035"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:23.447969" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:23.448051" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:28:23.448213" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:28:23.372118" elapsed="0.076124"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:23.449789" 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-04-17T03:28:23.449449" elapsed="0.000422">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-04-17T03:28:23.449984" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:23.449041" elapsed="0.000968"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:23.450352" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:23.450081" elapsed="0.000329"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:23.450941" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:23.450625" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:23.450434" elapsed="0.000570"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:23.450063" elapsed="0.000962"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:23.453614" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:28:23.451206" elapsed="0.002435"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:28:23.453693" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:28:23.453852" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:28:23.448663" elapsed="0.005214"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:23.455237" 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-04-17T03:28:23.454920" elapsed="0.000384">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-04-17T03:28:23.455403" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:23.454538" elapsed="0.000890"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:28:23.455641" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:28:23.455500" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:23.455481" elapsed="0.000247"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:23.455881" 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-04-17T03:28:23.456079" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:28:23.456147" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:28:23.458088" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:28:23.454207" elapsed="0.003911"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:23.459629" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:23.459354" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:23.460141" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:23.459838" elapsed="0.000350"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:28:23.465354" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:23.667415" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:24.071184" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:24.074348" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:28:23.462355" elapsed="0.617373">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:23.460259" elapsed="0.619723">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:24.080573" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:24.080078" elapsed="0.000650"/>
</branch>
<status status="FAIL" start="2026-04-17T03:28:23.460239" elapsed="0.620562">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:24.081519" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:24.081719" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:24.081664" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:24.081638" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:24.082049" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:28:24.082149" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:28:23.458447" elapsed="0.623859">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:24.082416" 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-04-17T03:28:23.346635" elapsed="0.735918">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:24.082968" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:24.082688" elapsed="0.000385"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:24.082664" elapsed="0.000443"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:24.083152" elapsed="0.000020"/>
</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-04-17T03:28:23.341346" elapsed="0.741945">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:26.147740" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/inter_as_ipmsi_ad/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:26.147289" elapsed="0.000488"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:26.148685" 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-04-17T03:28:26.148404" elapsed="0.000360">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-04-17T03:28:26.148867" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:26.147981" elapsed="0.000912"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:26.149542" 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-04-17T03:28:26.149084" elapsed="0.000496"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:26.149994" 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-04-17T03:28:26.150223" 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-04-17T03:28:26.149777" elapsed="0.000474"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:26.150677" 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-04-17T03:28:26.150422" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:26.152179" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:26.151737" elapsed="0.000496"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:26.152816" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:28:26.152410" elapsed="0.000441"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:26.153976" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:26.153399" elapsed="0.000614"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:26.155654" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:26.154952" elapsed="0.000805"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:26.155841" elapsed="0.000048"/>
</return>
<msg time="2026-04-17T03:28:26.156215" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:26.154301" elapsed="0.001947"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:26.156456" elapsed="0.000401"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:28:26.153204" elapsed="0.003697"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:26.158084" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:26.157199" elapsed="0.000922"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:26.159755" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:26.159012" elapsed="0.000868"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:26.159980" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:28:26.160586" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:26.158380" elapsed="0.002235"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:26.160782" elapsed="0.000403"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:28:26.157035" elapsed="0.004334"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:28:26.152956" elapsed="0.008448"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:28:26.161448" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:28:26.161684" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:28:26.151309" elapsed="0.010401"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:26.150809" elapsed="0.010935"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:26.161962" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:26.161773" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:26.150783" elapsed="0.011260"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:26.162831" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:28:26.162191" elapsed="0.000669"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:28:26.162910" elapsed="0.000046"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/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-04-17T03:28:26.146421" elapsed="0.016635"/>
</kw>
<msg time="2026-04-17T03:28:26.163119" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:26.132829" elapsed="0.030415"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:26.177377" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/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-04-17T03:28:26.191328" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/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-04-17T03:28:26.204684" elapsed="0.000038"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:26.204952" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:26.205145" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:26.205564" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:26.205409" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:26.205391" 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-04-17T03:28:26.205803" 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-04-17T03:28:26.205995" 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-04-17T03:28:26.206172" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:28:26.205355" elapsed="0.000871"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:28:26.205232" elapsed="0.001020"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:26.206400" elapsed="0.000025"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:26.206550" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:28:26.206713" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:28:26.127828" elapsed="0.078914"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:26.208300" 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-04-17T03:28:26.207957" elapsed="0.000424">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-04-17T03:28:26.208478" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:26.207535" elapsed="0.000967"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:26.208841" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:26.208573" elapsed="0.000327"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:26.209521" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:26.209199" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:26.208944" elapsed="0.000642"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:26.208555" elapsed="0.001053"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:26.212357" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:28:26.209763" elapsed="0.002622"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:28:26.212438" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:28:26.212597" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:28:26.207123" elapsed="0.005498"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:26.213852" 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-04-17T03:28:26.213618" elapsed="0.000297">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-04-17T03:28:26.214027" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:26.213279" elapsed="0.000772"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:28:26.214256" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-17T03:28:26.214121" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:26.214104" elapsed="0.000235"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:26.214484" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:26.214656" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:28:26.214720" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:28:26.216678" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:28:26.212946" elapsed="0.003759"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:26.218341" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:26.218075" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:26.218786" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:26.218543" 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-04-17T03:28:26.224475" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:26.426527" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:26.829140" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:26.831588" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:28:26.221235" elapsed="0.613784">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:26.218895" elapsed="0.616287">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:26.835591" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:26.835258" elapsed="0.000444"/>
</branch>
<status status="FAIL" start="2026-04-17T03:28:26.218877" elapsed="0.616865">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:26.836518" elapsed="0.000044"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:26.836743" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:26.836679" elapsed="0.000139"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:26.836647" elapsed="0.000207"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:26.837127" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:28:26.837262" elapsed="0.000031"/>
</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-04-17T03:28:26.217046" elapsed="0.620403">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:26.837570" elapsed="0.000027"/>
</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-04-17T03:28:26.100102" elapsed="0.737631">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:26.838193" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:26.837885" elapsed="0.000487"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:26.837856" elapsed="0.000942"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:26.838860" elapsed="0.000025"/>
</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-04-17T03:28:26.093556" elapsed="0.745488">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:28:26.839203" level="FAIL">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-17T03:28:20.568110" elapsed="6.271249">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:28:26.839667" elapsed="0.000036"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:28:26.839988" elapsed="0.000061"/>
</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="NOT RUN" start="2026-04-17T03:28:26.840307" elapsed="0.000033"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:28:26.840578" elapsed="0.000033"/>
</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-04-17T03:28:26.840994" elapsed="0.003277"/>
</kw>
<arg>inter_as_ipmsi_ad</arg>
<arg>${MVPN_DIR}</arg>
<status status="FAIL" start="2026-04-17T03:28:20.556906" elapsed="6.287493">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:20.482982" elapsed="6.361705">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:28:26.849715" elapsed="0.000410"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:28:26.849291" 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-04-17T03:28:26.851785" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:26.851596" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:26.851561" elapsed="0.000329"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:26.858752" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:26.858631" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:26.858611" elapsed="0.000215"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:26.860066" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:28:26.859531" elapsed="0.000569"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:28:26.860622" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:28:26.860275" elapsed="0.000383"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:28:26.860796" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:28:26.860996" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:28:26.859122" elapsed="0.001901"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:26.868114" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:26.867947" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:26.867908" elapsed="0.000284"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:26.869585" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:26.869456" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:26.869438" elapsed="0.000243"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:26.870362" level="INFO">${karaf_connection_index} = 22</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:28:26.869882" elapsed="0.000523"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:26.871021" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:28:26.870662" elapsed="0.000401"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:28:26.872310" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:28:26.871858" elapsed="0.001243">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:28:26.873340" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:28:26.873391" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:26.871323" elapsed="0.002094"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:28:26.874297" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:28:26.874029" elapsed="0.001010">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:28:26.875279" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:28:26.875330" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:26.873598" elapsed="0.001757"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:28:26.876596" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_spmsi_ad"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:28:26.875678" elapsed="0.001012">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_spmsi_ad"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:26.875436" elapsed="0.001363">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_spmsi_ad"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:28:26.875416" elapsed="0.001436">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_spmsi_ad"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:26.877138" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:26.877502" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:26.877274" elapsed="0.000311"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:26.877247" elapsed="0.000376"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:28:26.877677" 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-04-17T03:28:26.880849" elapsed="0.000174"/>
</kw>
<msg time="2026-04-17T03:28:26.881095" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:26.879592" elapsed="0.001642"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:26.881525" elapsed="0.000081"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:26.881959" elapsed="0.000083"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:28:26.878915" 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-04-17T03:28:26.878151" elapsed="0.004080"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:28:26.869135" elapsed="0.013185">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_spmsi_ad"</status>
</kw>
<msg time="2026-04-17T03:28:26.882485" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:28:26.882531" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_spmsi_ad"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:26.868363" elapsed="0.014193"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:28:26.882765" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:26.882637" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:26.882617" elapsed="0.000242"/>
</if>
<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-04-17T03:28:26.886620" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:26.886454" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:26.886424" elapsed="0.000304"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:26.887207" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:28:26.887383" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:28:26.887002" elapsed="0.000423"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:26.888193" level="INFO">{1: 22}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:26.887666" elapsed="0.000598"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:26.888815" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:26.888504" elapsed="0.000358"/>
</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-04-17T03:28:26.889464" elapsed="0.000316"/>
</kw>
<msg time="2026-04-17T03:28:26.889886" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:28:26.889951" level="INFO">${old_connection_index} = 22</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:26.889053" elapsed="0.000925"/>
</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-04-17T03:28:26.890902" elapsed="0.000225"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:28:26.892521" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:28:26.891879" elapsed="0.001914">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:26.891306" elapsed="0.002656"/>
</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-04-17T03:28:26.894984" elapsed="0.000438"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:26.894234" elapsed="0.001319"/>
</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-04-17T03:28:26.890293" elapsed="0.005334"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:26.890055" elapsed="0.005649"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:26.890036" elapsed="0.005710"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:26.896922" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:28:26.896589" elapsed="0.000401"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:28:26.897046" elapsed="0.000055"/>
</return>
<msg time="2026-04-17T03:28:26.897285" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:28:26.896135" elapsed="0.001177"/>
</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-04-17T03:28:26.897480" elapsed="0.000496"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:26.898279" level="INFO">index=23
host=10.30.170.120
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-04-17T03:28:26.898386" level="INFO">${karaf_connection_object} = index=23
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:28:26.898162" elapsed="0.000251"/>
</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-04-17T03:28:26.898569" elapsed="0.002340"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:28:26.901480" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:28:26.902982" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:28:26.901196" elapsed="0.002228">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:28:26.918048" elapsed="0.000412"/>
</kw>
<msg time="2026-04-17T03:28:26.918558" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:26.916550" elapsed="0.002164"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:26.918903" elapsed="0.000042"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:26.919102" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:28:26.904354" elapsed="0.014837"/>
</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-04-17T03:28:26.903748" elapsed="0.015493"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:28:26.885963" elapsed="0.033370">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:26.919710" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:28:26.919787" 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="FAIL" start="2026-04-17T03:28:26.867503" elapsed="0.052400">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:28:26.920131" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:28:26.920184" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:26.861489" elapsed="0.058721"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:26.920579" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:26.920301" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:26.920279" elapsed="0.000385"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:28:26.861288" elapsed="0.059401"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:28:26.861084" elapsed="0.059641"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:28:26.858217" elapsed="0.062568"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:28:26.851160" elapsed="0.069686"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:26.850454" elapsed="0.070440"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:28:26.845978" elapsed="0.074989"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:26.921915" 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-04-17T03:28:26.922142" 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-04-17T03:28:26.921701" elapsed="0.000478"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-17T03:28:26.922579" 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-04-17T03:28:26.922352" elapsed="0.000254"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:26.922988" 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-04-17T03:28:26.923124" 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-04-17T03:28:26.922772" elapsed="0.000416"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-17T03:28:26.923569" 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-04-17T03:28:26.923352" elapsed="0.000244"/>
</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-04-17T03:28:26.923892" elapsed="0.002614"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:26.923671" elapsed="0.002874"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:26.923652" elapsed="0.002920"/>
</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-04-17T03:28:26.964897" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:26.964393" elapsed="0.000559"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:26.965808" 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-04-17T03:28:26.965532" elapsed="0.000356">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-04-17T03:28:26.966007" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:26.965161" elapsed="0.000873"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:26.966628" 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-04-17T03:28:26.966214" elapsed="0.000443"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:26.966991" 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-04-17T03:28:26.967192" 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-04-17T03:28:26.966828" elapsed="0.000396"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:26.967700" 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-04-17T03:28:26.967427" elapsed="0.000326"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:26.969026" level="INFO">mapping: {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:26.968729" elapsed="0.000344"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:26.969533" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:28:26.969247" elapsed="0.000313"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:26.970346" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:26.970000" elapsed="0.000376"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:26.971397" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:26.970914" elapsed="0.000518"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:26.971505" elapsed="0.000048"/>
</return>
<msg time="2026-04-17T03:28:26.971693" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:26.970576" elapsed="0.001145"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:26.971885" elapsed="0.000282"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:28:26.969820" elapsed="0.002429"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:26.972828" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:26.972516" elapsed="0.000338"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:26.973831" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:26.973403" elapsed="0.000456"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:26.973911" elapsed="0.000050"/>
</return>
<msg time="2026-04-17T03:28:26.974094" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:26.973067" elapsed="0.001053"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:26.974341" elapsed="0.000240"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:28:26.972375" elapsed="0.002249"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:28:26.969616" elapsed="0.005045"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:28:26.974707" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:28:26.974892" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:28:26.968307" elapsed="0.006612"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:26.967836" elapsed="0.007136"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:26.975165" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:26.975001" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:26.967811" elapsed="0.007445"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:26.976072" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:28:26.975414" elapsed="0.000690"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:28:26.976157" 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/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-04-17T03:28:26.963501" elapsed="0.012825"/>
</kw>
<msg time="2026-04-17T03:28:26.976388" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:26.950213" elapsed="0.026232"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:26.990703" elapsed="0.000063"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:28:27.004058" elapsed="0.000038"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/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-04-17T03:28:27.017134" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:27.017384" 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-04-17T03:28:27.017579" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:27.018036" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:27.017858" elapsed="0.000240"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:27.017837" elapsed="0.000289"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:27.018281" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:27.018456" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:27.018719" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:28:27.017796" elapsed="0.000981"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:28:27.017669" elapsed="0.001138"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:27.018978" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:27.019063" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:28:27.019238" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:28:26.945544" elapsed="0.073723"/>
</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-04-17T03:28:27.046244" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:27.045707" elapsed="0.000570"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:27.047118" 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-04-17T03:28:27.046828" elapsed="0.000377">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-04-17T03:28:27.047309" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:27.046457" elapsed="0.000879"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:27.047954" 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-04-17T03:28:27.047526" elapsed="0.000458"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:27.048337" 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-04-17T03:28:27.048531" 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-04-17T03:28:27.048163" elapsed="0.000398"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:27.048998" 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-04-17T03:28:27.048724" elapsed="0.000334"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-17T03:28:27.049508" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:27.049147" elapsed="0.000423"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:27.050137" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:27.049753" elapsed="0.000422"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:27.049598" elapsed="0.000625"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:27.049122" elapsed="0.001132"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:27.051073" 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-04-17T03:28:27.050468" elapsed="0.000639"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:28:27.051222" 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/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-04-17T03:28:27.044801" elapsed="0.006573"/>
</kw>
<msg time="2026-04-17T03:28:27.051452" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:27.030858" elapsed="0.020666"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:27.066413" elapsed="0.000066"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:28:27.081578" elapsed="0.000048"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:28:27.094797" elapsed="0.000053"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:27.095192" elapsed="0.000035"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:27.095422" 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-04-17T03:28:27.095959" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:27.095778" elapsed="0.000250"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:27.095756" elapsed="0.000303"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:27.096230" 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-04-17T03:28:27.096438" 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-04-17T03:28:27.096624" elapsed="0.000025"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:28:27.095706" elapsed="0.000978"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:28:27.095535" elapsed="0.001177"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:27.096864" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:27.096961" elapsed="0.000021"/>
</return>
<msg time="2026-04-17T03:28:27.097151" 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-04-17T03:28:27.029808" elapsed="0.067377"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:27.098841" 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-04-17T03:28:27.098485" elapsed="0.000435">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-04-17T03:28:27.099037" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:27.098063" elapsed="0.001001"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:27.099412" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:27.099137" elapsed="0.000334"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:27.100020" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:27.099694" elapsed="0.000354"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:27.099498" elapsed="0.000587"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:27.099119" elapsed="0.000988"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:27.102833" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:28:27.100270" elapsed="0.002593"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:28:27.102917" elapsed="0.000052"/>
</return>
<msg time="2026-04-17T03:28:27.103110" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:28:27.097661" elapsed="0.005476"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:27.104863" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:28:27.104588" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:27.105452" 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-04-17T03:28:27.105172" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:27.105945" 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-04-17T03:28:27.105672" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:27.106404" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:27.106154" elapsed="0.000296"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:27.107368" 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-04-17T03:28:27.107149" elapsed="0.000247"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:28:27.107783" 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-04-17T03:28:27.107557" elapsed="0.000259"/>
</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-04-17T03:28:27.107995" elapsed="0.000230"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:27.108757" 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-04-17T03:28:27.108444" elapsed="0.000372"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:28:27.108874" elapsed="0.000047"/>
</return>
<msg time="2026-04-17T03:28:27.109138" 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-04-17T03:28:27.106674" elapsed="0.002510"/>
</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-04-17T03:28:27.115069" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:27.316861" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:27.719532" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:27.721660" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:28:27.111954" elapsed="0.612635">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:27.109287" elapsed="0.615432">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:28:27.725044" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:27.724768" elapsed="0.000408"/>
</branch>
<status status="FAIL" start="2026-04-17T03:28:27.109264" elapsed="0.615939">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:28:27.725731" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:27.725890" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:27.725847" elapsed="0.000109"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:27.725826" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:27.726139" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:28:27.726211" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>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="FAIL" start="2026-04-17T03:28:27.103504" elapsed="0.622838">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:27.726431" elapsed="0.000017"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>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="FAIL" start="2026-04-17T03:28:26.931623" elapsed="0.794914">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:27.726867" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:27.726659" elapsed="0.000321"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:27.726641" elapsed="0.000368"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:27.727044" elapsed="0.000016"/>
</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="FAIL" start="2026-04-17T03:28:26.926858" elapsed="0.800295">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:28:27.727421" elapsed="0.000024"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<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="NOT RUN" start="2026-04-17T03:28:27.727668" elapsed="0.000025"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:27.727865" elapsed="0.000030"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations">
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:27.728150" elapsed="0.000042"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:28:27.728420" elapsed="0.000030"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<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="NOT RUN" start="2026-04-17T03:28:27.728725" elapsed="0.000033"/>
</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-04-17T03:28:27.779505" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:27.778954" elapsed="0.000588"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:27.780450" 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-04-17T03:28:27.780160" elapsed="0.000378">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-04-17T03:28:27.780675" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:27.779731" elapsed="0.000977"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:27.781558" 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-04-17T03:28:27.780899" elapsed="0.000696"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:27.781961" 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-04-17T03:28:27.782143" 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-04-17T03:28:27.781788" elapsed="0.000383"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:27.782597" 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-04-17T03:28:27.782340" 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-04-17T03:28:27.783811" level="INFO">mapping: {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:27.783542" elapsed="0.000315"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:27.784322" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:28:27.784039" elapsed="0.000309"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:27.785426" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:27.784734" elapsed="0.000721"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:27.786680" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:27.786203" elapsed="0.000521"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:27.786854" elapsed="0.000053"/>
</return>
<msg time="2026-04-17T03:28:27.787150" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:27.785658" elapsed="0.001519"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:27.787341" elapsed="0.000516"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:28:27.784590" elapsed="0.003311"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:27.788715" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:27.788183" elapsed="0.000564"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:27.790312" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:27.789638" elapsed="0.000716"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:27.790503" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:28:27.790726" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:27.789054" elapsed="0.001698"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:27.790908" elapsed="0.000526"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:28:27.788043" elapsed="0.003443"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:28:27.784404" elapsed="0.007117"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:28:27.791564" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:28:27.791722" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:28:27.783156" elapsed="0.008592"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:27.782732" elapsed="0.009047"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:27.791987" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:27.791806" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:27.782706" elapsed="0.009360"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:27.792846" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:28:27.792213" elapsed="0.000663"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:28:27.792954" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:28:27.777979" elapsed="0.015106"/>
</kw>
<msg time="2026-04-17T03:28:27.793142" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:27.764009" elapsed="0.029249"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:27.806117" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:27.818781" elapsed="0.000039"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/app.vanadium/${file_name} exists. 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-04-17T03:28:27.831287" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:27.831518" 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-04-17T03:28:27.831703" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:27.832145" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:27.831990" elapsed="0.000282"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:27.831971" elapsed="0.000330"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:27.832451" 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-04-17T03:28:27.832622" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:27.832797" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:28:27.831914" elapsed="0.000936"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:28:27.831785" elapsed="0.001093"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:27.833044" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:27.833124" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:28:27.833499" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:28:27.758609" elapsed="0.074918"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:27.834790" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:28:27.834484" elapsed="0.000357"/>
</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-04-17T03:28:27.839977" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:28.041726" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:28.444876" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:28.447826" level="INFO">${response} = None</msg>
<msg time="2026-04-17T03:28:28.448065" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:27.837132" elapsed="0.615546">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:27.834906" elapsed="0.617917">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:28.453203" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:28.452883" elapsed="0.000415"/>
</branch>
<status status="FAIL" start="2026-04-17T03:28:27.834888" elapsed="0.618445">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:28.458812" 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-04-17T03:28:28.455376" elapsed="0.003485">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:28.455044" elapsed="0.003995">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:28:28.455016" elapsed="0.004075">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-04-17T03:28:28.462658" 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-04-17T03:28:28.459556" elapsed="0.003136">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:28.459194" elapsed="0.003563">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:28:28.459169" elapsed="0.003619">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:28.463434" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:28:28.463009" elapsed="0.000452"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:28.463775" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:28.463531" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:28.464354" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:28.464039" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:28.463857" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:28.463513" elapsed="0.000924"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:28.465043" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:28:28.464599" elapsed="0.000478"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:28.465398" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:28.465156" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:28.465973" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:28.465640" elapsed="0.000360"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:28.465478" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:28.465138" elapsed="0.000919"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:28.466213" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-17T03:28:28.467046" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:28:28.466731" elapsed="0.000341"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-04-17T03:28:28.469658" 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-04-17T03:28:28.467236" elapsed="0.002458">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-04-17T03:28:28.453977" elapsed="0.015865">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-04-17T03:28:28.469910" elapsed="0.000111"/>
</return>
<msg time="2026-04-17T03:28:28.472397" level="INFO">${response_text} = None</msg>
<msg time="2026-04-17T03:28:28.472428" 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-04-17T03:28:27.833806" elapsed="0.638651">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-04-17T03:28:28.472526" elapsed="0.000027"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="FAIL" start="2026-04-17T03:28:27.730429" elapsed="0.742288">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:27.729754" elapsed="0.743031"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-04-17T03:28:27.729141" elapsed="0.743762"/>
</kw>
<arg>spmsi_ad</arg>
<arg>${MVPN_DIR}</arg>
<status status="FAIL" start="2026-04-17T03:28:26.921314" elapsed="1.551685">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:26.845234" elapsed="1.627955">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:28:28.476707" elapsed="0.000250"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:28:28.476411" elapsed="0.000604"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:28.478110" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:28.477989" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:28.477940" 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-04-17T03:28:28.483146" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:28.483029" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:28.483011" elapsed="0.000218"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:28.484280" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:28:28.483864" elapsed="0.000443"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:28:28.484764" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:28:28.484469" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:28:28.484834" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:28:28.485006" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:28:28.483477" elapsed="0.001553"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:28.490544" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:28.490436" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:28.490418" 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-04-17T03:28:28.491816" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:28.491710" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:28.491693" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:28.492391" level="INFO">${karaf_connection_index} = 23</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:28:28.492075" elapsed="0.000343"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:28.492801" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:28:28.492582" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:28:28.493742" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:28:28.493345" elapsed="0.001107">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:28:28.494646" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:28:28.494694" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:28.493005" elapsed="0.001712"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:28:28.495541" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:28:28.495293" elapsed="0.000949">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:28:28.496435" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:28:28.496482" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:28.494917" elapsed="0.001589"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:28:28.497454" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_spmsi_ad"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:28:28.496808" elapsed="0.000763">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_spmsi_ad"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:28.496581" elapsed="0.001062">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_spmsi_ad"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:28:28.496562" elapsed="0.001114">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_spmsi_ad"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:28.497842" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:28.498148" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:28.497947" elapsed="0.000256"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:28.497913" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:28:28.498260" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:28:28.500914" elapsed="0.000184"/>
</kw>
<msg time="2026-04-17T03:28:28.501167" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:28.499749" elapsed="0.001550"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:28.501581" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:28.501939" 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-04-17T03:28:28.499118" elapsed="0.003042"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:28:28.498555" elapsed="0.003696"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:28:28.491409" elapsed="0.010949">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_spmsi_ad"</status>
</kw>
<msg time="2026-04-17T03:28:28.502467" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:28:28.502512" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_spmsi_ad"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:28.490770" elapsed="0.011766"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:28:28.502723" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:28.502614" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:28.502595" elapsed="0.000193"/>
</if>
<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-04-17T03:28:28.503621" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:28.503515" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:28.503497" elapsed="0.000193"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:28.503996" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:28:28.504108" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:28:28.503844" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:28.504573" level="INFO">{1: 23}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:28.504304" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:28.505102" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:28.504773" elapsed="0.000374"/>
</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-04-17T03:28:28.505686" elapsed="0.000283"/>
</kw>
<msg time="2026-04-17T03:28:28.506168" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:28:28.506216" level="INFO">${old_connection_index} = 23</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:28.505307" elapsed="0.000938"/>
</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-04-17T03:28:28.507095" elapsed="0.000229"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:28:28.508558" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:28:28.507986" elapsed="0.001621">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:28.507494" elapsed="0.002256"/>
</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-04-17T03:28:28.510439" elapsed="0.000278"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:28.509943" elapsed="0.000859"/>
</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-04-17T03:28:28.506550" elapsed="0.004298"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:28.506323" elapsed="0.004574"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:28.506305" elapsed="0.004617"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:28.511785" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:28:28.511478" elapsed="0.000334"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:28:28.511860" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:28:28.512029" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:28:28.511150" elapsed="0.000904"/>
</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-04-17T03:28:28.512210" elapsed="0.000418"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:28.512908" level="INFO">index=24
host=10.30.170.120
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-04-17T03:28:28.513035" level="INFO">${karaf_connection_object} = index=24
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:28:28.512796" elapsed="0.000265"/>
</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-04-17T03:28:28.513213" elapsed="0.002201"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:28:28.515836" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:28:28.517106" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:28:28.515577" elapsed="0.001911">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:28:28.531905" elapsed="0.000421"/>
</kw>
<msg time="2026-04-17T03:28:28.532426" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:28.530546" elapsed="0.002048"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:28.532759" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:28.533256" elapsed="0.000023"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:28:28.518350" elapsed="0.014995"/>
</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-04-17T03:28:28.517784" elapsed="0.015608"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:28:28.503217" elapsed="0.030266">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:28.533864" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:28:28.533961" 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="FAIL" start="2026-04-17T03:28:28.490096" elapsed="0.044026">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:28:28.534236" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:28:28.534280" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:28.485409" elapsed="0.048894"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:28.534659" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:28.534388" elapsed="0.000413"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:28.534367" elapsed="0.000479"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:28:28.485263" elapsed="0.049618"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:28:28.485088" elapsed="0.049854"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:28:28.482651" elapsed="0.052375"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:28:28.477641" elapsed="0.057446"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:28.477175" elapsed="0.057961"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:28:28.473877" elapsed="0.061331"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:28.536703" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:28.536063" elapsed="0.000669"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:28.537602" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:28.536904" elapsed="0.000725"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:28.538214" 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-04-17T03:28:28.537796" elapsed="0.000445"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:28.538620" 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-04-17T03:28:28.538790" 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-04-17T03:28:28.538406" elapsed="0.000411"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:28.539189" 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-04-17T03:28:28.539311" 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-04-17T03:28:28.538992" elapsed="0.000345"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-04-17T03:28:28.539495" elapsed="0.002911"/>
</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-04-17T03:28:28.542596" elapsed="0.001882"/>
</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-04-17T03:28:28.600320" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:28.599830" elapsed="0.000525"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:28.601256" 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-04-17T03:28:28.600908" elapsed="0.000430">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-04-17T03:28:28.601435" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:28.600536" elapsed="0.000923"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:28.602049" 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-04-17T03:28:28.601632" elapsed="0.000445"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:28.602429" 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-04-17T03:28:28.602630" 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-04-17T03:28:28.602283" elapsed="0.000431"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:28.603167" 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-04-17T03:28:28.602883" 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-04-17T03:28:28.604330" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:28.604009" elapsed="0.000368"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:28.604822" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:28:28.604543" elapsed="0.000307"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:28.605664" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:28.605251" elapsed="0.000439"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:28.606979" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:28.606388" elapsed="0.000722"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:28.607216" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:28:28.607527" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:28.605884" elapsed="0.001669"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:28.607713" elapsed="0.000449"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:28:28.605107" elapsed="0.003110"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:28.608977" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:28.608500" elapsed="0.000509"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:28.610568" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:28.609916" elapsed="0.000759"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:28.610755" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:28:28.611075" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:28.609422" elapsed="0.001680"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:28.611261" elapsed="0.000377"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:28:28.608360" elapsed="0.003325"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:28:28.604903" elapsed="0.006830"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:28:28.611778" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:28:28.611976" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:28:28.603657" elapsed="0.008345"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:28.603316" elapsed="0.008720"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:28.612215" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:28.612062" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:28.603293" elapsed="0.008999"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:28.613051" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:28:28.612440" elapsed="0.000641"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:28:28.613131" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:28.599137" elapsed="0.014121"/>
</kw>
<msg time="2026-04-17T03:28:28.613314" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:28.586163" elapsed="0.027201"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:28.627180" 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/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-04-17T03:28:28.641659" elapsed="0.000063"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/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-04-17T03:28:28.656025" elapsed="0.000057"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:28.656331" 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-04-17T03:28:28.656519" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:28.656970" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:28.656798" elapsed="0.000258"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:28.656780" elapsed="0.000309"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:28.657256" 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-04-17T03:28:28.657433" 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-04-17T03:28:28.657623" elapsed="0.000024"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:28:28.656741" elapsed="0.000940"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:28:28.656605" elapsed="0.001103"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:28.657860" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:28.657956" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:28:28.658120" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:28:28.581631" elapsed="0.076576"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:28.659745" 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-04-17T03:28:28.659398" elapsed="0.000427">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-04-17T03:28:28.659922" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:28.658973" elapsed="0.000992"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:28.660316" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:28.660036" elapsed="0.000339"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:28.660914" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:28.660607" elapsed="0.000411"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:28.660399" elapsed="0.000658"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:28.660017" elapsed="0.001063"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:28.664036" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:28:28.661243" elapsed="0.002827"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:28:28.664129" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:28:28.664306" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:28:28.658588" elapsed="0.005744"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:28.665694" 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-04-17T03:28:28.665398" elapsed="0.000380">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-04-17T03:28:28.665898" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:28.665007" elapsed="0.000939"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:28:28.666258" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-17T03:28:28.666037" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:28.666014" elapsed="0.000354"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:28.666567" 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-04-17T03:28:28.666795" elapsed="0.000027"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:28:28.666880" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:28:28.668884" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:28:28.664652" elapsed="0.004260"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:28.670479" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:28.670204" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:28.670972" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:28.670700" 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="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:28:28.676681" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:28.878330" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:29.281333" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:29.284216" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:28:28.673500" elapsed="0.615288">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:28.671105" elapsed="0.618221">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:29.290381" elapsed="0.000067"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:29.289738" elapsed="0.000824"/>
</branch>
<status status="FAIL" start="2026-04-17T03:28:28.671086" elapsed="0.619532">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:29.291821" elapsed="0.000067"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:29.292198" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:29.292103" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:29.292056" elapsed="0.000297"/>
</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-04-17T03:28:29.292703" elapsed="0.000051"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:28:29.292867" elapsed="0.000035"/>
</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-04-17T03:28:28.669262" elapsed="0.623927">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:29.293370" elapsed="0.000058"/>
</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-04-17T03:28:28.557726" elapsed="0.735998">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:29.294685" elapsed="0.000076"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:29.294076" elapsed="0.000919"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:29.294015" elapsed="0.001076"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:29.295199" elapsed="0.000045"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-04-17T03:28:28.553096" elapsed="0.742414">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:31.359832" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:31.359349" elapsed="0.000517"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:31.360698" 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-04-17T03:28:31.360430" elapsed="0.000347">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-04-17T03:28:31.360877" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:31.360070" elapsed="0.000927"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:31.361593" 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-04-17T03:28:31.361192" elapsed="0.000512"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:31.362041" 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-04-17T03:28:31.362201" 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-04-17T03:28:31.361876" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:31.362652" 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-04-17T03:28:31.362400" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:31.363805" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:31.363499" elapsed="0.000351"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:31.364314" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:28:31.364042" elapsed="0.000298"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:31.365198" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:31.364710" elapsed="0.000515"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:31.366452" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:31.365883" elapsed="0.000670"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:31.366634" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:28:31.366960" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:31.365422" elapsed="0.001564"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:31.367147" elapsed="0.000386"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:28:31.364570" elapsed="0.003004"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:31.368249" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:31.367824" elapsed="0.000453"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:31.372674" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:31.371915" elapsed="0.000859"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:31.372855" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:28:31.373264" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:31.368670" elapsed="0.004620"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:31.373447" elapsed="0.000372"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:28:31.367689" elapsed="0.006172"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:28:31.364392" elapsed="0.009505"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:28:31.373956" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:28:31.374120" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:28:31.363163" elapsed="0.010982"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:31.362782" elapsed="0.011394"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:31.374359" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:31.374203" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:31.362758" elapsed="0.011678"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:31.375202" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:28:31.374583" elapsed="0.000649"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:28:31.375280" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:31.358503" elapsed="0.016903"/>
</kw>
<msg time="2026-04-17T03:28:31.375509" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:31.342732" elapsed="0.032829"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:31.388211" 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/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-04-17T03:28:31.400805" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/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-04-17T03:28:31.413282" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:31.413492" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:31.413673" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:31.414081" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:31.413908" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:31.413892" 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-04-17T03:28:31.414319" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:31.414490" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:31.414656" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:28:31.413860" elapsed="0.000847"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:28:31.413750" elapsed="0.000983"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:31.414880" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:31.414976" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:28:31.415114" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:28:31.336771" elapsed="0.078370"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:31.416493" 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-04-17T03:28:31.416200" 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-04-17T03:28:31.416671" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:31.415817" elapsed="0.000879"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:31.417165" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:31.416825" elapsed="0.000403"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:31.417988" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:31.417547" elapsed="0.000480"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:31.417265" elapsed="0.000812"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:31.416806" elapsed="0.001300"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:31.421666" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:28:31.418321" elapsed="0.003382"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:28:31.421776" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:28:31.422019" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:28:31.415479" elapsed="0.006576"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:31.423854" 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-04-17T03:28:31.423509" elapsed="0.000468">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-04-17T03:28:31.424115" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:31.422979" elapsed="0.001170"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:28:31.424440" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-04-17T03:28:31.424248" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:31.424223" elapsed="0.000365"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:31.424859" elapsed="0.000042"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:31.425308" elapsed="0.000033"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:28:31.425396" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:28:31.427336" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:28:31.422490" elapsed="0.004873"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:31.428811" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:31.428552" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:31.429343" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:31.429077" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:28:31.434747" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:31.636538" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:32.039009" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:32.041202" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:28:31.431640" elapsed="0.613205">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:31.429454" elapsed="0.615721">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:32.045766" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:32.045268" elapsed="0.000623"/>
</branch>
<status status="FAIL" start="2026-04-17T03:28:31.429436" elapsed="0.616520">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:32.046692" elapsed="0.000043"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:32.046911" elapsed="0.000056"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:32.046846" elapsed="0.000184"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:32.046819" elapsed="0.000255"/>
</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-04-17T03:28:32.047377" elapsed="0.000047"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:28:32.047524" elapsed="0.000030"/>
</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-04-17T03:28:31.427705" elapsed="0.620046">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:32.047922" elapsed="0.000061"/>
</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-04-17T03:28:31.311006" elapsed="0.737165">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:32.048803" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:32.048408" elapsed="0.000571"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:32.048356" elapsed="0.000677"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:32.049116" elapsed="0.000031"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-04-17T03:28:31.304484" elapsed="0.744871">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:34.110594" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:34.110150" elapsed="0.000479"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:34.111440" 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-04-17T03:28:34.111184" elapsed="0.000332">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-04-17T03:28:34.111706" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:34.110810" elapsed="0.000922"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:34.112322" 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-04-17T03:28:34.111904" elapsed="0.000447"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:34.112662" 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-04-17T03:28:34.112818" 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-04-17T03:28:34.112517" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:34.113365" 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-04-17T03:28:34.113106" 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-04-17T03:28:34.114524" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:34.114216" elapsed="0.000355"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:34.115034" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:28:34.114736" elapsed="0.000325"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:34.115864" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:34.115428" elapsed="0.000463"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:34.117386" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:34.116763" elapsed="0.000728"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:34.117573" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:28:34.117884" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:34.116103" elapsed="0.001807"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:34.118090" elapsed="0.000405"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:28:34.115288" elapsed="0.003261"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:34.119471" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:34.118821" elapsed="0.000677"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:34.120746" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:34.120176" elapsed="0.000673"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:34.120944" elapsed="0.000052"/>
</return>
<msg time="2026-04-17T03:28:34.121263" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:34.119691" elapsed="0.001598"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:34.121456" elapsed="0.000372"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:28:34.118681" elapsed="0.003190"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:28:34.115113" elapsed="0.006793"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:28:34.121966" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:28:34.122156" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:28:34.113862" elapsed="0.008326"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:34.113496" elapsed="0.008735"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:34.122424" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:34.122263" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:34.113471" elapsed="0.009031"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:34.123357" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:28:34.122650" elapsed="0.000749"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:28:34.123451" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/spmsi_ad/rib/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:28:34.109358" elapsed="0.014275"/>
</kw>
<msg time="2026-04-17T03:28:34.123691" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:34.095803" elapsed="0.027940"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:34.137586" elapsed="0.000054"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:28:34.150016" elapsed="0.000044"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/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-04-17T03:28:34.162381" elapsed="0.000041"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:34.162667" 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-04-17T03:28:34.162900" 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-04-17T03:28:34.163382" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:34.163206" elapsed="0.000235"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:34.163187" 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-04-17T03:28:34.163613" 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-04-17T03:28:34.163802" 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-04-17T03:28:34.163998" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:28:34.163141" elapsed="0.000913"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:28:34.163007" elapsed="0.001073"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:34.164227" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:34.164307" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:28:34.164467" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:28:34.091378" elapsed="0.073119"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:34.166210" 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-04-17T03:28:34.165886" elapsed="0.000401">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-04-17T03:28:34.166409" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:34.165338" elapsed="0.001098"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:34.166799" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:34.166509" elapsed="0.000349"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:34.167389" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:34.167089" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:34.166883" elapsed="0.000580"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:34.166491" elapsed="0.001001"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:34.170250" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:28:34.167664" elapsed="0.002617"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:28:34.170342" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:28:34.170520" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:28:34.164885" elapsed="0.005660"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:34.171973" 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-04-17T03:28:34.171678" elapsed="0.000368">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-04-17T03:28:34.172144" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:34.171295" elapsed="0.000874"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:28:34.172400" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-04-17T03:28:34.172244" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:34.172225" elapsed="0.000283"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:34.172673" elapsed="0.000024"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:34.172972" elapsed="0.000027"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:28:34.173049" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:28:34.175081" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:28:34.170907" elapsed="0.004209"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:34.176808" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:34.176504" elapsed="0.000356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:34.177334" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:34.177082" 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="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:28:34.182784" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:34.384209" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:34.786799" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:34.789281" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:28:34.179639" elapsed="0.614358">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:34.177448" elapsed="0.616744">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:34.794597" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:34.794279" elapsed="0.000419"/>
</branch>
<status status="FAIL" start="2026-04-17T03:28:34.177429" elapsed="0.617304">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:34.795471" elapsed="0.000055"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:34.795734" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:34.795669" elapsed="0.000156"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:34.795635" elapsed="0.000255"/>
</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-04-17T03:28:34.796181" elapsed="0.000035"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:28:34.796290" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:28:34.175530" elapsed="0.620926">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:34.796566" 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-04-17T03:28:34.062365" elapsed="0.734342">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:34.797130" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:34.796842" elapsed="0.000392"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:34.796818" elapsed="0.000449"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:34.797314" elapsed="0.000019"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-04-17T03:28:34.056066" elapsed="0.741390">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:28:34.797612" level="FAIL">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-17T03:28:28.544763" elapsed="6.253035">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:28:34.798197" elapsed="0.000368"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:28:34.798826" elapsed="0.000030"/>
</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="NOT RUN" start="2026-04-17T03:28:34.799107" elapsed="0.000031"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:28:34.799354" elapsed="0.000029"/>
</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-04-17T03:28:34.799728" elapsed="0.002612"/>
</kw>
<arg>spmsi_ad</arg>
<arg>${MVPN_DIR}</arg>
<status status="FAIL" start="2026-04-17T03:28:28.535502" elapsed="6.266948">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:28.473429" elapsed="6.329199">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:28:34.805967" elapsed="0.000263"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:28:34.805603" elapsed="0.000685"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:34.807374" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:34.807244" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:34.807222" elapsed="0.000225"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:34.812504" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:34.812394" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:34.812375" elapsed="0.000199"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:34.813623" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:28:34.813219" elapsed="0.000433"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:28:34.814193" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:28:34.813857" elapsed="0.000362"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:28:34.814265" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:28:34.814428" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:28:34.812811" elapsed="0.001642"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:34.820251" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:34.820116" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:34.820097" elapsed="0.000222"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:34.821511" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:34.821404" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:34.821386" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:34.822054" level="INFO">${karaf_connection_index} = 24</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:28:34.821732" elapsed="0.000350"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:34.822522" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:28:34.822299" elapsed="0.000249"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:28:34.823332" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:28:34.823071" elapsed="0.000993">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:28:34.824262" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:28:34.824311" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:34.822712" elapsed="0.001624"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:28:34.825170" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:28:34.824862" elapsed="0.000960">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:28:34.826028" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:28:34.826074" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:34.824511" elapsed="0.001585"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:28:34.827023" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_leaf_ad"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:28:34.826396" elapsed="0.000689">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_leaf_ad"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:34.826171" elapsed="0.000983">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_leaf_ad"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:28:34.826152" elapsed="0.001034">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_leaf_ad"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:34.827349" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:34.827577" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:34.827435" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:34.827418" elapsed="0.000234"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:28:34.827684" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:28:34.830260" elapsed="0.000146"/>
</kw>
<msg time="2026-04-17T03:28:34.830472" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:34.829171" 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-04-17T03:28:34.830883" elapsed="0.000093"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:34.831240" 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-04-17T03:28:34.828532" elapsed="0.002891"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:28:34.827997" elapsed="0.003490"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:28:34.821100" elapsed="0.010471">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_leaf_ad"</status>
</kw>
<msg time="2026-04-17T03:28:34.831674" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:28:34.831717" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_leaf_ad"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:34.820474" elapsed="0.011267"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:28:34.831961" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:34.831835" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:34.831816" elapsed="0.000212"/>
</if>
<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-04-17T03:28:34.833108" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:34.832917" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:34.832899" elapsed="0.000276"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:34.833457" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:28:34.833562" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:28:34.833332" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:34.834069" level="INFO">{1: 24}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:34.833786" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:34.834514" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:34.834269" elapsed="0.000301"/>
</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-04-17T03:28:34.835227" elapsed="0.000272"/>
</kw>
<msg time="2026-04-17T03:28:34.835600" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:28:34.835647" level="INFO">${old_connection_index} = 24</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:34.834794" elapsed="0.000876"/>
</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-04-17T03:28:34.836565" elapsed="0.000194"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:28:34.838004" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:28:34.837469" elapsed="0.001421">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:34.836980" elapsed="0.002027"/>
</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-04-17T03:28:34.839658" elapsed="0.000351"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:34.839185" elapsed="0.000911"/>
</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-04-17T03:28:34.836046" elapsed="0.004095"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:34.835746" elapsed="0.004443"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:34.835727" elapsed="0.004488"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:34.841120" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:28:34.840765" elapsed="0.000382"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:28:34.841196" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:28:34.841352" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:28:34.840428" elapsed="0.000950"/>
</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-04-17T03:28:34.841652" elapsed="0.000479"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:34.842417" level="INFO">index=25
host=10.30.170.120
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-04-17T03:28:34.842521" level="INFO">${karaf_connection_object} = index=25
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:28:34.842307" elapsed="0.000241"/>
</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-04-17T03:28:34.842725" elapsed="0.005259"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:28:34.848551" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:28:34.849766" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:28:34.848240" elapsed="0.002139">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:28:34.866736" elapsed="0.000824"/>
</kw>
<msg time="2026-04-17T03:28:34.867698" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:34.864469" elapsed="0.003508"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:34.868234" elapsed="0.000034"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:34.868483" elapsed="0.000030"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:28:34.851590" elapsed="0.017022"/>
</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-04-17T03:28:34.850857" elapsed="0.017826"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:28:34.832619" elapsed="0.036280">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:34.869531" elapsed="0.000039"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:28:34.869643" elapsed="0.000032"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:28:34.819725" elapsed="0.050086">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:28:34.870003" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:28:34.870069" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:34.814851" elapsed="0.055251"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:34.870654" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:34.870220" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:34.870192" elapsed="0.000577"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:28:34.814694" elapsed="0.056110"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:28:34.814511" elapsed="0.056342"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:28:34.812000" elapsed="0.059163"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:28:34.806920" elapsed="0.064337"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:34.806454" elapsed="0.064872"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:28:34.803311" elapsed="0.068093"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:34.872780" 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-04-17T03:28:34.873039" 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-04-17T03:28:34.872483" elapsed="0.000593"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-17T03:28:34.873593" 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-04-17T03:28:34.873300" elapsed="0.000330"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:34.874126" 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-04-17T03:28:34.874300" 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-04-17T03:28:34.873851" elapsed="0.000485"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-17T03:28:34.874827" 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-04-17T03:28:34.874553" elapsed="0.000311"/>
</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-04-17T03:28:34.875449" elapsed="0.002458"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:34.875149" elapsed="0.002813"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:34.875119" elapsed="0.002878"/>
</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-04-17T03:28:34.922700" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:34.922110" elapsed="0.000638"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:34.923989" 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-04-17T03:28:34.923607" elapsed="0.000482">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-04-17T03:28:34.924218" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:34.923018" elapsed="0.001235"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:34.925040" 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-04-17T03:28:34.924494" elapsed="0.000584"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:34.925497" 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-04-17T03:28:34.925706" 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-04-17T03:28:34.925309" elapsed="0.000433"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:34.926322" 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-04-17T03:28:34.925986" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:34.927764" level="INFO">mapping: {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:34.927414" elapsed="0.000398"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:34.928297" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:28:34.928013" elapsed="0.000311"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:34.929035" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:34.928699" elapsed="0.000363"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:34.930142" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:34.929617" elapsed="0.000552"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:34.930224" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:28:34.930391" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:34.929258" elapsed="0.001159"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:34.930578" elapsed="0.000266"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:28:34.928558" elapsed="0.002330"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:34.931474" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:34.931165" elapsed="0.000335"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:34.932760" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:34.932341" elapsed="0.000447"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:34.932840" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:28:34.933021" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:34.931737" 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-04-17T03:28:34.933207" elapsed="0.000233"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:28:34.931024" elapsed="0.002458"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:28:34.928380" elapsed="0.005140"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:28:34.933566" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:28:34.933784" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:28:34.926978" elapsed="0.006844"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:34.926490" elapsed="0.007378"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:34.934147" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:34.933908" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:34.926459" elapsed="0.007793"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:34.935337" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:28:34.934462" elapsed="0.000923"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:28:34.935541" elapsed="0.000043"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/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-04-17T03:28:34.921030" elapsed="0.014703"/>
</kw>
<msg time="2026-04-17T03:28:34.935814" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:34.903636" elapsed="0.032251"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:34.950580" elapsed="0.000056"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/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-04-17T03:28:34.964605" 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/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-04-17T03:28:34.977564" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:34.977806" 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-04-17T03:28:34.978009" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:34.978474" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:34.978268" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:34.978252" elapsed="0.000315"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:34.978719" 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-04-17T03:28:34.978888" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:34.979075" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:28:34.978214" elapsed="0.000915"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:28:34.978093" elapsed="0.001063"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:34.979321" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:34.979400" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:28:34.979576" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:28:34.898644" elapsed="0.080963"/>
</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-04-17T03:28:35.008648" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:35.008039" elapsed="0.000654"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:35.009780" 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-04-17T03:28:35.009444" elapsed="0.000438">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-04-17T03:28:35.010029" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:35.008961" elapsed="0.001104"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:35.010823" 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-04-17T03:28:35.010299" elapsed="0.000561"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:35.011313" 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-04-17T03:28:35.011595" 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-04-17T03:28:35.011104" elapsed="0.000532"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:35.012219" 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-04-17T03:28:35.011861" elapsed="0.000437"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-17T03:28:35.012898" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:35.012408" elapsed="0.000592"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:35.013646" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:35.013248" elapsed="0.000431"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:35.013041" elapsed="0.000682"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:35.012374" elapsed="0.001380"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:35.014571" 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-04-17T03:28:35.013989" elapsed="0.000624"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:28:35.014684" elapsed="0.000045"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/${file_name} exists. 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-04-17T03:28:35.006949" elapsed="0.007894"/>
</kw>
<msg time="2026-04-17T03:28:35.014903" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:34.991950" elapsed="0.023033"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:35.030004" elapsed="0.000074"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:35.046317" 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/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-04-17T03:28:35.061202" elapsed="0.000065"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:35.061583" elapsed="0.000035"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:35.061857" 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-04-17T03:28:35.062476" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:35.062255" elapsed="0.000302"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:35.062230" elapsed="0.000367"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:35.062804" 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-04-17T03:28:35.063076" 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-04-17T03:28:35.063321" elapsed="0.000031"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:28:35.062175" elapsed="0.001224"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:28:35.061996" elapsed="0.001468"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:35.063680" elapsed="0.000031"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:35.063795" elapsed="0.000026"/>
</return>
<msg time="2026-04-17T03:28:35.064065" 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-04-17T03:28:34.990593" elapsed="0.073517"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:35.066159" 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-04-17T03:28:35.065719" elapsed="0.000549">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-04-17T03:28:35.066400" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:35.065157" elapsed="0.001274"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:35.066802" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:35.066523" elapsed="0.000338"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:35.067477" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:35.067141" elapsed="0.000363"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:35.066887" elapsed="0.000654"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:35.066498" elapsed="0.001065"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:35.070268" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:28:35.067719" elapsed="0.002577"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:28:35.070428" elapsed="0.000048"/>
</return>
<msg time="2026-04-17T03:28:35.070658" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:28:35.064632" elapsed="0.006063"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:35.072506" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:28:35.072233" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:35.073148" 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-04-17T03:28:35.072805" elapsed="0.000418"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:35.073750" 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-04-17T03:28:35.073437" elapsed="0.000360"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:35.074223" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:35.073971" elapsed="0.000296"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:35.075179" 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-04-17T03:28:35.074897" elapsed="0.000317"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:28:35.075667" 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-04-17T03:28:35.075471" elapsed="0.000223"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:35.075849" elapsed="0.000232"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:35.076505" 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-04-17T03:28:35.076249" elapsed="0.000302"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:28:35.076593" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:28:35.076759" 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-04-17T03:28:35.074481" elapsed="0.002303"/>
</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-04-17T03:28:35.083116" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:35.284822" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:35.687155" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:35.690006" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:28:35.079354" elapsed="0.616864">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:35.076860" elapsed="0.619553">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:28:35.696991" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:35.696604" elapsed="0.000495"/>
</branch>
<status status="FAIL" start="2026-04-17T03:28:35.076840" elapsed="0.620294">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:28:35.697837" elapsed="0.000042"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:35.698073" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:35.698017" elapsed="0.000145"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:35.697989" elapsed="0.000204"/>
</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-04-17T03:28:35.698432" elapsed="0.000039"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:28:35.698569" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>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="FAIL" start="2026-04-17T03:28:35.071151" elapsed="0.627645">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:35.698989" elapsed="0.000117"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>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="FAIL" start="2026-04-17T03:28:34.885051" elapsed="0.814215">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:35.700080" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:35.699564" elapsed="0.000628"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:35.699525" elapsed="0.000702"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:35.700273" elapsed="0.000021"/>
</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="FAIL" start="2026-04-17T03:28:34.878321" elapsed="0.822104">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:28:35.700709" elapsed="0.000113"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<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="NOT RUN" start="2026-04-17T03:28:35.701424" elapsed="0.000049"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:35.701765" elapsed="0.000040"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations">
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:35.702204" elapsed="0.000078"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:28:35.702671" elapsed="0.000046"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<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="NOT RUN" start="2026-04-17T03:28:35.703125" elapsed="0.000052"/>
</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-04-17T03:28:35.752527" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:35.752064" elapsed="0.000514"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:35.753419" 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-04-17T03:28:35.753126" elapsed="0.000368">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-04-17T03:28:35.753590" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:35.752757" elapsed="0.000858"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:35.754202" 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-04-17T03:28:35.753782" elapsed="0.000448"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:35.754642" 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-04-17T03:28:35.754826" 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-04-17T03:28:35.754480" elapsed="0.000373"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:35.755302" 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-04-17T03:28:35.755046" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:35.756453" level="INFO">mapping: {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:35.756189" elapsed="0.000308"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:35.756953" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:28:35.756662" elapsed="0.000318"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:35.757922" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:35.757355" elapsed="0.000619"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:35.759192" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:35.758691" elapsed="0.000544"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:35.759368" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:28:35.759605" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:35.758170" elapsed="0.001461"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:35.759791" elapsed="0.000538"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:28:35.757215" elapsed="0.003156"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:35.761210" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:35.760630" elapsed="0.000609"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:35.762649" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:35.761921" elapsed="0.000771"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:35.762812" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:28:35.763131" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:35.761432" elapsed="0.001733"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:35.763380" elapsed="0.000773"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:28:35.760488" elapsed="0.003726"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:28:35.757033" elapsed="0.007231"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:28:35.764323" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:28:35.764552" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:28:35.755807" elapsed="0.008924"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:35.755437" elapsed="0.009351"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:35.765070" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:35.764825" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:35.755412" elapsed="0.009769"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:35.766238" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:28:35.765385" elapsed="0.000894"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:28:35.766383" 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/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-04-17T03:28:35.751290" elapsed="0.015279"/>
</kw>
<msg time="2026-04-17T03:28:35.766646" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:35.738059" elapsed="0.028674"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:35.781902" 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/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-04-17T03:28:35.794555" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/app.vanadium/${file_name} exists. 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-04-17T03:28:35.807159" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:35.807383" 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-04-17T03:28:35.807573" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:35.808010" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:35.807820" elapsed="0.000268"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:35.807804" elapsed="0.000318"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:35.808317" 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-04-17T03:28:35.808501" 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-04-17T03:28:35.808674" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:28:35.807768" elapsed="0.000961"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:28:35.807653" elapsed="0.001104"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:35.808906" elapsed="0.000039"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:35.809016" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:28:35.809229" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:28:35.732743" elapsed="0.076516"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:35.810611" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:28:35.810231" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:28:35.815644" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:36.017380" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:36.420081" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:36.422845" level="INFO">${response} = None</msg>
<msg time="2026-04-17T03:28:36.423034" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:35.812839" elapsed="0.615012">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:35.810733" elapsed="0.617301">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:36.428427" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:36.428102" elapsed="0.000423"/>
</branch>
<status status="FAIL" start="2026-04-17T03:28:35.810715" elapsed="0.617844">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:36.434295" 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-04-17T03:28:36.430800" elapsed="0.003545">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:36.430422" elapsed="0.004031">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:28:36.430381" elapsed="0.004129">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-04-17T03:28:36.438254" 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-04-17T03:28:36.434953" elapsed="0.003348">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:36.434616" elapsed="0.003774">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:28:36.434593" elapsed="0.003840">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:36.439079" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:28:36.438642" elapsed="0.000464"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:36.439486" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:36.439238" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:36.440071" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:36.439740" elapsed="0.000358"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:36.439571" elapsed="0.000564"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:36.439218" elapsed="0.000938"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:36.440697" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:28:36.440321" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:36.441051" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:36.440795" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:36.441647" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:36.441320" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:36.441134" elapsed="0.000575"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:36.440777" elapsed="0.000953"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:36.441890" elapsed="0.000369"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-17T03:28:36.442777" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:28:36.442465" elapsed="0.000338"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-04-17T03:28:36.445307" 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-04-17T03:28:36.442979" elapsed="0.002370">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-04-17T03:28:36.429664" elapsed="0.015861">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-04-17T03:28:36.445595" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:28:36.448133" level="INFO">${response_text} = None</msg>
<msg time="2026-04-17T03:28:36.448164" 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-04-17T03:28:35.809542" elapsed="0.638651">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-04-17T03:28:36.448260" elapsed="0.000027"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="FAIL" start="2026-04-17T03:28:35.705227" elapsed="0.743211">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:35.704271" elapsed="0.744232"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-04-17T03:28:35.703620" elapsed="0.744947"/>
</kw>
<arg>leaf_ad</arg>
<arg>${MVPN_DIR}</arg>
<status status="FAIL" start="2026-04-17T03:28:34.871874" elapsed="1.576769">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:34.802860" elapsed="1.645949">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:28:36.456363" elapsed="0.000597"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:28:36.455700" elapsed="0.001416"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:36.459307" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:36.459117" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:36.459082" elapsed="0.000332"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:36.466419" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:36.466268" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:36.466242" elapsed="0.000271"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:36.468093" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:28:36.467448" elapsed="0.000686"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:28:36.468795" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:28:36.468369" elapsed="0.000462"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:28:36.468894" elapsed="0.000073"/>
</return>
<msg time="2026-04-17T03:28:36.469148" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:28:36.466846" elapsed="0.002336"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:36.475470" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:36.475355" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:36.475336" elapsed="0.000202"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:36.476741" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:36.476634" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:36.476616" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:36.477327" level="INFO">${karaf_connection_index} = 25</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:28:36.476984" elapsed="0.000371"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:36.477748" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:28:36.477522" elapsed="0.000252"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:28:36.478582" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:28:36.478298" elapsed="0.001003">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:28:36.479496" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:28:36.479543" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:36.477953" elapsed="0.001613"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:28:36.480350" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:28:36.480103" elapsed="0.000920">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:28:36.481209" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:28:36.481295" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:36.479741" elapsed="0.001583"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:28:36.482272" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_leaf_ad"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:28:36.481625" elapsed="0.000711">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_leaf_ad"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:36.481399" elapsed="0.001009">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_leaf_ad"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:28:36.481380" elapsed="0.001061">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_leaf_ad"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:36.482605" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:36.482830" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:36.482689" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:36.482673" elapsed="0.000231"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:28:36.482952" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:28:36.485630" elapsed="0.000149"/>
</kw>
<msg time="2026-04-17T03:28:36.485848" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:36.484484" elapsed="0.001543"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:36.486309" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:36.486649" 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-04-17T03:28:36.483833" elapsed="0.003004"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:28:36.483244" elapsed="0.003658"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:28:36.476330" elapsed="0.010765">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_leaf_ad"</status>
</kw>
<msg time="2026-04-17T03:28:36.487201" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:28:36.487245" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_leaf_ad"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:36.475699" elapsed="0.011569"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:28:36.487450" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:36.487343" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:36.487325" elapsed="0.000189"/>
</if>
<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-04-17T03:28:36.488502" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:36.488396" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:36.488379" elapsed="0.000188"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:36.488846" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:28:36.488967" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:28:36.488720" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:36.489469" level="INFO">{1: 25}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:36.489154" elapsed="0.000360"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:36.489909" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:36.489669" elapsed="0.000354"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:28:36.490549" elapsed="0.000262"/>
</kw>
<msg time="2026-04-17T03:28:36.490910" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:28:36.490974" level="INFO">${old_connection_index} = 25</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:36.490183" elapsed="0.000814"/>
</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-04-17T03:28:36.491805" elapsed="0.000210"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:28:36.493069" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:28:36.492658" elapsed="0.001334">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:36.492184" elapsed="0.001910"/>
</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-04-17T03:28:36.494729" elapsed="0.000362"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:36.494268" elapsed="0.000905"/>
</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-04-17T03:28:36.491293" elapsed="0.003926"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:36.491071" elapsed="0.004197"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:36.491053" elapsed="0.004240"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:36.496196" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:28:36.495869" elapsed="0.000354"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:28:36.496271" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:28:36.496463" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:28:36.495530" elapsed="0.000958"/>
</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-04-17T03:28:36.496644" elapsed="0.000442"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:36.497389" level="INFO">index=26
host=10.30.170.120
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-04-17T03:28:36.497490" level="INFO">${karaf_connection_object} = index=26
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:28:36.497281" elapsed="0.000234"/>
</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-04-17T03:28:36.497668" elapsed="0.002394"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:28:36.500489" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:28:36.501696" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:28:36.500230" elapsed="0.001860">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:28:36.517981" elapsed="0.000461"/>
</kw>
<msg time="2026-04-17T03:28:36.518540" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:36.516465" elapsed="0.002236"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:36.518867" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:36.519254" elapsed="0.000023"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:28:36.503438" elapsed="0.015903"/>
</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-04-17T03:28:36.502380" elapsed="0.017008"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:28:36.488104" elapsed="0.031369">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:36.519861" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:28:36.519957" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:28:36.475005" elapsed="0.045070">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:28:36.520186" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:28:36.520229" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:36.469780" elapsed="0.050472"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:36.520602" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:36.520335" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:36.520315" elapsed="0.000388"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:28:36.469573" elapsed="0.051156"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:28:36.469298" elapsed="0.051466"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:28:36.465733" elapsed="0.055091"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:28:36.458649" elapsed="0.062234"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:36.457678" elapsed="0.063270"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:28:36.450572" elapsed="0.070435"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:36.522266" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:36.521710" elapsed="0.000586"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:36.523197" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:36.522513" elapsed="0.000714"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:36.523784" 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-04-17T03:28:36.523397" elapsed="0.000415"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:36.524218" 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-04-17T03:28:36.524381" 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-04-17T03:28:36.524000" elapsed="0.000407"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:36.524763" 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-04-17T03:28:36.524884" 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-04-17T03:28:36.524565" elapsed="0.000345"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-04-17T03:28:36.525083" elapsed="0.002812"/>
</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-04-17T03:28:36.528130" elapsed="0.002090"/>
</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-04-17T03:28:36.584147" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:36.583727" elapsed="0.000455"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:36.584983" 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-04-17T03:28:36.584693" elapsed="0.000370">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-17T03:28:36.585192" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:36.584358" elapsed="0.000860"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:36.585776" 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-04-17T03:28:36.585387" elapsed="0.000415"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:36.586125" 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-04-17T03:28:36.586297" 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-04-17T03:28:36.585982" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:36.586730" 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-04-17T03:28:36.586483" 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-04-17T03:28:36.587835" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:36.587523" elapsed="0.000358"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:36.588341" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:28:36.588067" elapsed="0.000299"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:36.589180" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:36.588735" elapsed="0.000472"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:36.590482" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:36.589852" elapsed="0.000733"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:36.590665" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:28:36.590989" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:36.589397" elapsed="0.001618"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:36.591171" elapsed="0.000393"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:28:36.588597" elapsed="0.003008"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:36.592341" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:36.591854" elapsed="0.000514"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:36.593798" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:36.593248" elapsed="0.000650"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:36.593992" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:28:36.594285" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:36.592726" elapsed="0.001585"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:36.594466" elapsed="0.000363"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:28:36.591720" elapsed="0.003151"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:28:36.588419" elapsed="0.006487"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:28:36.594965" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:28:36.595123" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:28:36.587189" elapsed="0.007959"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:36.586853" elapsed="0.008326"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:36.595353" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:36.595203" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:36.586828" elapsed="0.008600"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:36.596174" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:28:36.595573" elapsed="0.000630"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:28:36.596252" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:36.583090" elapsed="0.013285"/>
</kw>
<msg time="2026-04-17T03:28:36.596430" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:36.570222" elapsed="0.026256"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:28:36.609284" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:36.621781" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:36.634345" elapsed="0.000104"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:36.634649" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:36.634832" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:36.635253" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:36.635100" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:36.635084" 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-04-17T03:28:36.635479" 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-04-17T03:28:36.635647" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:36.635813" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:28:36.635047" elapsed="0.000818"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:28:36.634914" elapsed="0.000978"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:36.636055" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:36.636134" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:28:36.636284" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:28:36.565795" elapsed="0.070517"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:36.637757" 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-04-17T03:28:36.637446" elapsed="0.000388">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-04-17T03:28:36.637944" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:36.637039" elapsed="0.000931"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:36.638304" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:36.638042" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:36.638907" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:36.638612" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:36.638388" elapsed="0.000597"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:36.638024" elapsed="0.000982"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:36.641705" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:28:36.639159" elapsed="0.002573"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:28:36.641785" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:28:36.641961" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:28:36.636647" elapsed="0.005341"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:36.643250" 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-04-17T03:28:36.643002" elapsed="0.000315">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-04-17T03:28:36.643457" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:36.642641" elapsed="0.000841"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:28:36.643690" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:28:36.643553" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:36.643535" elapsed="0.000241"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:36.643939" 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-04-17T03:28:36.644116" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:28:36.644182" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:28:36.646147" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:28:36.642305" elapsed="0.003870"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:36.647625" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:36.647360" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:36.648087" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:36.647827" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:28:36.653556" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:36.855268" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:37.258145" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:37.261140" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:28:36.650322" elapsed="0.616475">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:36.648199" elapsed="0.618902">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:37.267621" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:37.267214" elapsed="0.000504"/>
</branch>
<status status="FAIL" start="2026-04-17T03:28:36.648180" elapsed="0.619571">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:37.268450" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:37.268613" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:37.268571" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:37.268549" elapsed="0.000132"/>
</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-04-17T03:28:37.268836" elapsed="0.000089"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:28:37.268995" elapsed="0.000017"/>
</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-04-17T03:28:36.646509" elapsed="0.622611">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:37.269202" 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-04-17T03:28:36.542919" elapsed="0.726385">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:37.269595" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:37.269402" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:37.269384" elapsed="0.000345"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:37.269764" elapsed="0.000016"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-04-17T03:28:36.536890" elapsed="0.732982">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:39.331605" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:39.331175" elapsed="0.000467"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:39.332480" 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-04-17T03:28:39.332203" elapsed="0.000355">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-04-17T03:28:39.332656" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:39.331827" elapsed="0.000854"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:39.333268" 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-04-17T03:28:39.332850" elapsed="0.000445"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:39.333651" 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-04-17T03:28:39.333823" 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-04-17T03:28:39.333462" elapsed="0.000388"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:39.334290" 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-04-17T03:28:39.334035" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:39.335464" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:39.335154" elapsed="0.000427"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:39.336060" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:28:39.335753" elapsed="0.000333"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:39.336919" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:39.336495" elapsed="0.000470"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:39.338449" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:39.337827" elapsed="0.000724"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:39.338635" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:28:39.338969" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:39.337227" elapsed="0.001770"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:39.339162" elapsed="0.000396"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:28:39.336331" elapsed="0.003270"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:39.340757" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:39.339942" elapsed="0.000843"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:39.342147" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:39.341482" elapsed="0.000768"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:39.342330" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:28:39.342634" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:39.341014" elapsed="0.001646"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:39.342821" elapsed="0.000397"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:28:39.339743" elapsed="0.003519"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:28:39.336141" elapsed="0.007157"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:28:39.343342" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:28:39.343504" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:28:39.334789" elapsed="0.008741"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:39.334421" elapsed="0.009142"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:39.343747" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:39.343590" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:39.334395" elapsed="0.009430"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:39.344618" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:28:39.343997" elapsed="0.000652"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:28:39.344699" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:28:39.330452" elapsed="0.014375"/>
</kw>
<msg time="2026-04-17T03:28:39.344885" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:39.315805" elapsed="0.029168"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:39.358242" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:39.373403" elapsed="0.000136"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</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-04-17T03:28:39.386684" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:39.386915" elapsed="0.000036"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:39.387117" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:39.387541" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:39.387381" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:39.387364" 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-04-17T03:28:39.387784" 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-04-17T03:28:39.387966" 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-04-17T03:28:39.388145" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:28:39.387325" elapsed="0.000873"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:28:39.387202" elapsed="0.001024"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:39.388398" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:39.388482" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:28:39.388652" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:28:39.309700" elapsed="0.078981"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:39.390212" 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-04-17T03:28:39.389893" elapsed="0.000398">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-04-17T03:28:39.390388" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:39.389400" elapsed="0.001012"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:39.390760" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:39.390482" elapsed="0.000336"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:39.391398" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:39.391074" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:39.390842" elapsed="0.000618"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:39.390464" elapsed="0.001017"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:39.394164" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:28:39.391635" elapsed="0.002556"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:28:39.394243" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:28:39.394421" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:28:39.389033" elapsed="0.005460"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:39.395772" 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-04-17T03:28:39.395520" elapsed="0.000317">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-04-17T03:28:39.395959" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:39.395161" elapsed="0.000824"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:28:39.396192" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:28:39.396057" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:39.396039" elapsed="0.000247"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:39.396434" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:39.396607" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:28:39.396672" elapsed="0.000014"/>
</return>
<msg time="2026-04-17T03:28:39.398628" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:28:39.394810" elapsed="0.003845"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:39.400093" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:39.399816" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:39.400544" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:39.400296" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:28:39.410510" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:39.612415" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:40.015429" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:40.018189" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:28:39.402855" elapsed="0.618870">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:39.400653" elapsed="0.621251">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:40.022413" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:40.022006" elapsed="0.000513"/>
</branch>
<status status="FAIL" start="2026-04-17T03:28:39.400636" elapsed="0.621917">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:40.023427" elapsed="0.000042"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:40.023648" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:40.023587" elapsed="0.000129"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:40.023558" elapsed="0.000188"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:40.023980" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:28:40.024082" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:28:39.398984" elapsed="0.625273">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:40.024385" elapsed="0.000029"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:28:39.286663" elapsed="0.737888">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:40.025026" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:40.024693" elapsed="0.000439"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:40.024666" elapsed="0.000501"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:40.025213" elapsed="0.000020"/>
</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-04-17T03:28:39.281425" elapsed="0.743934">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:42.078353" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:42.077945" elapsed="0.000443"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:42.079218" 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-04-17T03:28:42.078958" elapsed="0.000339">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-04-17T03:28:42.079394" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:42.078571" elapsed="0.000848"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:42.080000" 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-04-17T03:28:42.079584" elapsed="0.000444"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:42.080335" 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-04-17T03:28:42.080500" 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-04-17T03:28:42.080192" elapsed="0.000396"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:42.081290" 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-04-17T03:28:42.081004" elapsed="0.000336"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:42.082529" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:42.082205" elapsed="0.000390"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:42.083154" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:28:42.082815" elapsed="0.000373"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:42.084055" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:42.083615" elapsed="0.000466"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:42.085544" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:42.084919" elapsed="0.000729"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:42.085729" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:28:42.086060" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:42.084295" elapsed="0.001792"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:42.086249" elapsed="0.000388"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:28:42.083440" elapsed="0.003263"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:42.087656" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:42.086975" elapsed="0.000709"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:42.088992" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:42.088414" elapsed="0.000679"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:42.089187" elapsed="0.000045"/>
</return>
<msg time="2026-04-17T03:28:42.089538" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:42.087884" elapsed="0.001690"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:42.089780" elapsed="0.000428"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:28:42.086822" elapsed="0.003431"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:28:42.083252" elapsed="0.007039"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:28:42.090334" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:28:42.090527" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:28:42.081835" elapsed="0.008729"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:42.081428" elapsed="0.009183"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:42.090833" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:42.090648" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:42.081398" elapsed="0.009514"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:42.091764" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:28:42.091081" elapsed="0.000713"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:28:42.091844" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/leaf_ad/rib/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:28:42.077288" elapsed="0.014718"/>
</kw>
<msg time="2026-04-17T03:28:42.092069" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:42.064605" elapsed="0.027520"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:42.105718" elapsed="0.000054"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:28:42.118382" elapsed="0.000050"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:28:42.130665" elapsed="0.000038"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:42.130918" elapsed="0.000037"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:42.131119" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:42.131562" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:42.131385" elapsed="0.000236"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:42.131367" 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-04-17T03:28:42.131809" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:42.131996" 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-04-17T03:28:42.132167" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:28:42.131328" elapsed="0.000892"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:28:42.131203" elapsed="0.001044"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:42.132429" elapsed="0.000027"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:42.132519" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:28:42.132688" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:28:42.060336" elapsed="0.072383"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:42.134207" 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-04-17T03:28:42.133881" elapsed="0.000408">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-04-17T03:28:42.134387" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:42.133458" elapsed="0.000953"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:42.134808" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:42.134481" elapsed="0.000386"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:42.135397" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:42.135097" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:42.134891" elapsed="0.000660"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:42.134463" elapsed="0.001112"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:42.138223" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:28:42.135730" elapsed="0.002520"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:28:42.138304" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:28:42.138474" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:28:42.133090" elapsed="0.005409"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:42.139797" 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-04-17T03:28:42.139551" elapsed="0.000312">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-04-17T03:28:42.139976" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:42.139207" elapsed="0.000795"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:28:42.140254" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-17T03:28:42.140083" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:42.140060" elapsed="0.000305"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:42.140570" elapsed="0.000026"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:42.140753" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:28:42.140819" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:28:42.142782" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:28:42.138853" elapsed="0.003956"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:42.144321" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:42.144048" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:42.144775" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:42.144529" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:28:42.150056" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:42.351675" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:42.754411" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:42.757060" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:28:42.147080" elapsed="0.613815">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:42.144885" elapsed="0.616191">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:42.761519" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:42.761214" elapsed="0.000402"/>
</branch>
<status status="FAIL" start="2026-04-17T03:28:42.144867" elapsed="0.616783">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:42.762300" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:42.762496" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:42.762440" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:42.762414" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:42.762798" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:28:42.762894" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:28:42.143150" elapsed="0.619923">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:42.763179" 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-04-17T03:28:42.037846" elapsed="0.725469">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:42.764043" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:42.763444" elapsed="0.000703"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:42.763421" elapsed="0.000759"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:42.764226" elapsed="0.000020"/>
</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-04-17T03:28:42.032374" elapsed="0.731995">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:28:42.764520" level="FAIL">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-17T03:28:36.530402" elapsed="6.234277">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:28:42.765000" elapsed="0.000043"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:28:42.765337" elapsed="0.000030"/>
</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="NOT RUN" start="2026-04-17T03:28:42.765593" elapsed="0.000028"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:28:42.765831" elapsed="0.000027"/>
</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-04-17T03:28:42.766275" elapsed="0.002534"/>
</kw>
<arg>leaf_ad</arg>
<arg>${MVPN_DIR}</arg>
<status status="FAIL" start="2026-04-17T03:28:36.521323" elapsed="6.247573">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:36.449109" elapsed="6.320015">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:28:42.772656" elapsed="0.000264"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:28:42.772364" elapsed="0.000635"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:42.774107" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:42.773951" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:42.773912" elapsed="0.000277"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:42.779633" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:42.779516" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:42.779497" elapsed="0.000207"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:42.780804" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:28:42.780363" elapsed="0.000476"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:28:42.781388" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:28:42.781071" elapsed="0.000361"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:28:42.781494" elapsed="0.000048"/>
</return>
<msg time="2026-04-17T03:28:42.781725" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:28:42.779968" elapsed="0.001794"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:42.788141" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:42.788019" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:42.787996" elapsed="0.000218"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:42.789486" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:42.789371" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:42.789354" elapsed="0.000202"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:42.790116" level="INFO">${karaf_connection_index} = 26</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:28:42.789713" elapsed="0.000433"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:42.790545" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:28:42.790316" elapsed="0.000255"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:28:42.791447" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:28:42.791104" elapsed="0.001178">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:28:42.792491" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:28:42.792539" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:42.790734" elapsed="0.001828"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:28:42.793525" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:28:42.793219" elapsed="0.001065">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:28:42.794477" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:28:42.794523" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:42.792823" elapsed="0.001722"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:28:42.795543" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_source_active_ad"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:28:42.794870" elapsed="0.000737">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_source_active_ad"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:42.794631" elapsed="0.001048">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_source_active_ad"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:28:42.794608" elapsed="0.001106">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_source_active_ad"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:42.795884" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:42.796153" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:42.796006" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:42.795988" elapsed="0.000258"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:28:42.796284" elapsed="0.000018"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:28:42.799116" elapsed="0.000155"/>
</kw>
<msg time="2026-04-17T03:28:42.799340" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:42.797891" elapsed="0.001588"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:42.799762" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:42.800154" 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-04-17T03:28:42.797189" elapsed="0.003157"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:28:42.796604" elapsed="0.003809"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:28:42.789060" elapsed="0.011440">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_source_active_ad"</status>
</kw>
<msg time="2026-04-17T03:28:42.800608" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:28:42.800653" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_source_active_ad"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:42.788378" elapsed="0.012300"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:28:42.800866" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:42.800756" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:42.800737" elapsed="0.000214"/>
</if>
<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-04-17T03:28:42.802121" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:42.801880" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:42.801862" elapsed="0.000333"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:42.802509" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:28:42.802618" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:28:42.802367" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:42.803095" level="INFO">{1: 26}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:42.802802" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:42.803545" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:42.803293" elapsed="0.000297"/>
</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-04-17T03:28:42.804156" elapsed="0.000273"/>
</kw>
<msg time="2026-04-17T03:28:42.804581" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:28:42.804630" level="INFO">${old_connection_index} = 26</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:42.803754" elapsed="0.000900"/>
</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-04-17T03:28:42.805520" elapsed="0.000200"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:28:42.807003" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:28:42.806562" elapsed="0.001462">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:42.805892" elapsed="0.002237"/>
</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-04-17T03:28:42.808786" elapsed="0.000300"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:42.808309" elapsed="0.000864"/>
</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-04-17T03:28:42.804973" elapsed="0.004247"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:42.804731" elapsed="0.004539"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:42.804713" elapsed="0.004585"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:42.810277" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:28:42.809870" elapsed="0.000434"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:28:42.810355" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:28:42.810516" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:28:42.809522" elapsed="0.001034"/>
</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-04-17T03:28:42.810744" elapsed="0.000476"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:42.811512" level="INFO">index=27
host=10.30.170.120
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-04-17T03:28:42.811612" level="INFO">${karaf_connection_object} = index=27
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:28:42.811393" elapsed="0.000245"/>
</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-04-17T03:28:42.811791" elapsed="0.004065"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:28:42.816492" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:28:42.817896" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:28:42.816173" elapsed="0.002207">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:28:42.832852" elapsed="0.000442"/>
</kw>
<msg time="2026-04-17T03:28:42.833419" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:42.831467" elapsed="0.002115"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:42.833749" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:42.833920" elapsed="0.000040"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:28:42.819318" elapsed="0.014781"/>
</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-04-17T03:28:42.818715" elapsed="0.015445"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:28:42.801577" elapsed="0.032673">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:42.834626" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:28:42.834756" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:28:42.787588" elapsed="0.047283">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:28:42.835220" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:28:42.835266" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:42.782313" elapsed="0.052977"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:42.835636" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:42.835374" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:42.835353" elapsed="0.000362"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:28:42.782116" elapsed="0.053624"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:28:42.781837" elapsed="0.053934"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:28:42.779130" elapsed="0.056698"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:28:42.773622" elapsed="0.062261"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:42.773157" elapsed="0.062789"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:28:42.770059" elapsed="0.065942"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:42.836884" 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-04-17T03:28:42.837069" 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-04-17T03:28:42.836674" elapsed="0.000422"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-17T03:28:42.837471" 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-04-17T03:28:42.837256" elapsed="0.000242"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:42.837845" 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-04-17T03:28:42.837989" 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-04-17T03:28:42.837656" elapsed="0.000374"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-17T03:28:42.838391" 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-04-17T03:28:42.838188" elapsed="0.000230"/>
</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-04-17T03:28:42.838703" elapsed="0.002670"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:42.838488" elapsed="0.002921"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:42.838471" elapsed="0.002963"/>
</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-04-17T03:28:42.876115" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:42.875696" elapsed="0.000454"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:42.876957" 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-04-17T03:28:42.876669" elapsed="0.000367">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-04-17T03:28:42.877131" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:42.876326" elapsed="0.000829"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:42.877773" 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-04-17T03:28:42.877322" elapsed="0.000551"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:42.878237" 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-04-17T03:28:42.878398" 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-04-17T03:28:42.878090" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:42.878832" 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-04-17T03:28:42.878585" 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-04-17T03:28:42.879873" level="INFO">mapping: {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:42.879606" elapsed="0.000312"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:42.880367" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:28:42.880098" elapsed="0.000295"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:42.881075" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:42.880762" elapsed="0.000338"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:42.882102" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:42.881610" elapsed="0.000519"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:42.882183" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:28:42.882347" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:42.881289" elapsed="0.001083"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:42.882529" elapsed="0.000277"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:28:42.880620" elapsed="0.002225"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:42.883404" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:42.883110" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:42.884531" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:42.884123" elapsed="0.000435"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:42.884608" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:28:42.884759" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:42.883614" elapsed="0.001169"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:42.884951" elapsed="0.000225"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:28:42.882976" elapsed="0.002240"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:28:42.880445" elapsed="0.004806"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:28:42.885293" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:28:42.885450" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:28:42.879280" elapsed="0.006195"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:42.878971" elapsed="0.006536"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:42.885705" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:42.885532" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:42.878947" elapsed="0.006845"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:42.886551" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:28:42.885949" elapsed="0.000631"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:28:42.886630" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:28:42.875064" elapsed="0.011692"/>
</kw>
<msg time="2026-04-17T03:28:42.886850" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:42.862297" elapsed="0.024604"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:42.899348" 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_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-04-17T03:28:42.911755" elapsed="0.000048"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:28:42.924284" elapsed="0.000038"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:42.924534" 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-04-17T03:28:42.924722" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:42.925148" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:42.924993" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:42.924976" 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-04-17T03:28:42.925378" 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-04-17T03:28:42.925548" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:42.925717" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:28:42.924923" elapsed="0.000847"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:28:42.924804" elapsed="0.000993"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:42.925981" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:42.926061" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:28:42.926213" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:28:42.858021" elapsed="0.068221"/>
</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-04-17T03:28:42.951007" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:42.950597" elapsed="0.000440"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:42.951796" 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-04-17T03:28:42.951540" elapsed="0.000426">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-04-17T03:28:42.952064" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:42.951202" elapsed="0.000886"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:42.952648" 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-04-17T03:28:42.952256" elapsed="0.000419"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:42.953002" 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-04-17T03:28:42.953166" 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-04-17T03:28:42.952841" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:42.953606" 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-04-17T03:28:42.953358" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-17T03:28:42.954087" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:42.953740" elapsed="0.000406"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:42.954617" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:42.954320" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:42.954171" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:42.953720" elapsed="0.000981"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:42.955329" 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-04-17T03:28:42.954851" elapsed="0.000510"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:28:42.955412" elapsed="0.000034"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_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-04-17T03:28:42.949972" elapsed="0.005574"/>
</kw>
<msg time="2026-04-17T03:28:42.955603" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:42.937215" elapsed="0.018444"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:42.968515" 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/app.vanadium/${file_name} exists. 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-04-17T03:28:42.981375" 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/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-04-17T03:28:42.994404" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:42.994633" 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-04-17T03:28:42.994819" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:42.995250" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:42.995093" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:42.995075" 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-04-17T03:28:42.995481" 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-04-17T03:28:42.995673" 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-04-17T03:28:42.995863" elapsed="0.000027"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:28:42.995037" elapsed="0.000907"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:28:42.994901" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:42.996131" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:42.996210" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:28:42.996375" 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-04-17T03:28:42.936285" elapsed="0.060122"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:42.997832" 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-04-17T03:28:42.997535" elapsed="0.000419">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-04-17T03:28:42.998055" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:42.997142" elapsed="0.000939"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:42.998420" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:42.998153" elapsed="0.000324"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:42.999011" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:42.998692" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:42.998502" elapsed="0.000571"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:42.998135" elapsed="0.000960"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:43.001443" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:28:42.999249" elapsed="0.002222"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:28:43.001522" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:28:43.001683" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:28:42.996755" elapsed="0.004954"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:43.003315" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:28:43.003052" elapsed="0.000360"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:43.003833" 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-04-17T03:28:43.003572" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:43.004326" 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-04-17T03:28:43.004070" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:43.004778" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:43.004528" elapsed="0.000295"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:43.005671" 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-04-17T03:28:43.005467" elapsed="0.000231"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:28:43.006099" 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-04-17T03:28:43.005857" elapsed="0.000268"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:43.006282" elapsed="0.000209"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:43.006908" 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-04-17T03:28:43.006655" elapsed="0.000317"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:28:43.007015" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:28:43.007176" 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-04-17T03:28:43.005048" elapsed="0.002153"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:28:43.012549" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:43.214030" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:43.616628" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:43.618860" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:28:43.009586" elapsed="0.613011">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:43.007270" elapsed="0.615500">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:28:43.623221" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:43.622837" elapsed="0.000501"/>
</branch>
<status status="FAIL" start="2026-04-17T03:28:43.007253" elapsed="0.616122">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:28:43.624062" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:43.624542" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:43.624463" elapsed="0.000156"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:43.624426" elapsed="0.000226"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:43.624884" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:28:43.625018" elapsed="0.000024"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>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="FAIL" start="2026-04-17T03:28:43.002078" elapsed="0.623141">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:43.625417" elapsed="0.000035"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>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="FAIL" start="2026-04-17T03:28:42.846956" elapsed="0.778678">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:43.626261" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:43.625875" elapsed="0.000491"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:43.625840" elapsed="0.000563"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:43.626451" elapsed="0.000022"/>
</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="FAIL" start="2026-04-17T03:28:42.841716" elapsed="0.784887">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:28:43.627022" elapsed="0.000048"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<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="NOT RUN" start="2026-04-17T03:28:43.627500" elapsed="0.000050"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:43.627871" elapsed="0.000043"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations">
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:43.628271" elapsed="0.000048"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:28:43.628654" elapsed="0.000044"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<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="NOT RUN" start="2026-04-17T03:28:43.629134" elapsed="0.000049"/>
</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-04-17T03:28:43.675780" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:43.675338" elapsed="0.000479"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:43.676649" 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-04-17T03:28:43.676372" elapsed="0.000440">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-04-17T03:28:43.676910" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:43.676014" elapsed="0.000937"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:43.677541" 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-04-17T03:28:43.677122" elapsed="0.000446"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:43.677913" 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-04-17T03:28:43.678090" 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-04-17T03:28:43.677760" elapsed="0.000357"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:43.678531" 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-04-17T03:28:43.678280" 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-04-17T03:28:43.679911" level="INFO">mapping: {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:43.679554" elapsed="0.000450"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:43.680593" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:28:43.680230" elapsed="0.000395"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:43.681611" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:43.681028" elapsed="0.000609"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:43.682833" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:43.682363" elapsed="0.000519"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:43.683062" elapsed="0.000054"/>
</return>
<msg time="2026-04-17T03:28:43.683351" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:43.681840" elapsed="0.001537"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:43.683536" elapsed="0.000518"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:28:43.680868" elapsed="0.003229"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:43.685035" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:43.684405" elapsed="0.000657"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:43.686587" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:43.685828" elapsed="0.000813"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:43.686791" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:28:43.687104" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:43.685256" elapsed="0.001873"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:43.687288" elapsed="0.000491"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:28:43.684222" elapsed="0.003598"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:28:43.680681" elapsed="0.007175"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:28:43.687900" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:28:43.688078" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:28:43.679047" elapsed="0.009056"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:43.678658" elapsed="0.009477"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:43.688328" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:43.688162" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:43.678633" elapsed="0.009772"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:43.689242" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:28:43.688553" elapsed="0.000719"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:28:43.689407" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/app/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:28:43.674522" elapsed="0.015048"/>
</kw>
<msg time="2026-04-17T03:28:43.689645" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:43.661579" elapsed="0.028145"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:43.703272" elapsed="0.000064"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:28:43.718734" elapsed="0.000056"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</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-04-17T03:28:43.731195" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:43.731431" 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-04-17T03:28:43.731617" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:43.732052" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:43.731883" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:43.731865" 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-04-17T03:28:43.732279" 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-04-17T03:28:43.732446" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:43.732615" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:28:43.731826" elapsed="0.000842"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:28:43.731704" elapsed="0.000992"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:43.732842" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:43.732920" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:28:43.733091" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:28:43.656997" elapsed="0.076123"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:43.734504" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:28:43.734197" elapsed="0.000358"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:28:43.739533" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:43.940921" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:44.343417" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:44.346362" level="INFO">${response} = None</msg>
<msg time="2026-04-17T03:28:44.346435" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:43.736706" elapsed="0.613317">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:43.734624" elapsed="0.615552">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:44.350632" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:44.350260" elapsed="0.000507"/>
</branch>
<status status="FAIL" start="2026-04-17T03:28:43.734606" elapsed="0.616200">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:44.356451" 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-04-17T03:28:44.353028" elapsed="0.003473">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:44.352629" elapsed="0.003964">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:28:44.352602" elapsed="0.004036">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-04-17T03:28:44.360499" 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-04-17T03:28:44.357142" elapsed="0.003406">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:44.356753" elapsed="0.003885">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:28:44.356729" elapsed="0.003954">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:44.361681" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:28:44.361084" elapsed="0.000631"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:44.362050" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:44.361787" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:44.362610" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:44.362301" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:44.362133" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:44.361769" elapsed="0.000926"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:44.363316" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:28:44.362865" elapsed="0.000478"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:44.363653" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:44.363412" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:44.364224" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:44.363897" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:44.363733" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:44.363394" elapsed="0.000913"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:44.364464" elapsed="0.000373"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-17T03:28:44.365323" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:28:44.365021" elapsed="0.000328"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-04-17T03:28:44.367744" 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-04-17T03:28:44.365506" elapsed="0.002272">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-04-17T03:28:44.351895" elapsed="0.016024">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-04-17T03:28:44.368000" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:28:44.370478" level="INFO">${response_text} = None</msg>
<msg time="2026-04-17T03:28:44.370509" 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-04-17T03:28:43.733517" elapsed="0.637020">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-04-17T03:28:44.370604" 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-04-17T03:28:43.631235" elapsed="0.739545">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:43.630355" elapsed="0.740491"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-04-17T03:28:43.629656" elapsed="0.741250"/>
</kw>
<arg>source_active_ad</arg>
<arg>${MVPN_DIR}</arg>
<status status="FAIL" start="2026-04-17T03:28:42.836290" elapsed="1.534707">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:42.769485" elapsed="1.601682">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:28:44.374956" elapsed="0.000427"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:28:44.374535" elapsed="0.000953"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:44.377170" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:44.377003" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:44.376972" elapsed="0.000310"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:44.384252" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:44.384139" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:44.384120" elapsed="0.000202"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:44.385459" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:28:44.385005" elapsed="0.000535"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:28:44.386042" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:28:44.385712" elapsed="0.000357"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:28:44.386115" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:28:44.386278" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:28:44.384561" elapsed="0.001742"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:44.393122" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:44.393010" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:44.392990" 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-04-17T03:28:44.394512" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:44.394384" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:44.394360" elapsed="0.000229"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:44.395087" level="INFO">${karaf_connection_index} = 27</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:28:44.394750" elapsed="0.000364"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:44.395553" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:28:44.395285" elapsed="0.000297"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:28:44.396399" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:28:44.396118" elapsed="0.001007">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:28:44.397338" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:28:44.397403" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:44.395748" elapsed="0.001688"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:28:44.398392" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:28:44.398115" elapsed="0.001016">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:28:44.399324" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:28:44.399373" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:44.397641" elapsed="0.001756"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:28:44.400463" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_source_active_ad"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:28:44.399707" elapsed="0.000829">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_source_active_ad"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:44.399474" elapsed="0.001134">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_source_active_ad"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:28:44.399455" elapsed="0.001190">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_source_active_ad"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:44.400863" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:44.401122" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:44.400974" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:44.400955" elapsed="0.000246"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:28:44.401234" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:28:44.404020" elapsed="0.000173"/>
</kw>
<msg time="2026-04-17T03:28:44.404262" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:44.402750" elapsed="0.001645"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:44.404685" elapsed="0.000153"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:44.405143" 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-04-17T03:28:44.402098" elapsed="0.003286"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:28:44.401518" elapsed="0.003934"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:28:44.394009" elapsed="0.011528">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_source_active_ad"</status>
</kw>
<msg time="2026-04-17T03:28:44.405644" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:28:44.405694" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_source_active_ad"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:44.393353" elapsed="0.012368"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:28:44.405911" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:44.405800" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:44.405781" elapsed="0.000217"/>
</if>
<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-04-17T03:28:44.407127" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:44.407014" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:44.406917" elapsed="0.000279"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:44.407486" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:28:44.407600" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:28:44.407353" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:44.408160" level="INFO">{1: 27}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:44.407847" elapsed="0.000359"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:44.408636" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:44.408375" elapsed="0.000306"/>
</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-04-17T03:28:44.409275" elapsed="0.000272"/>
</kw>
<msg time="2026-04-17T03:28:44.409648" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:28:44.409699" level="INFO">${old_connection_index} = 27</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:44.408875" elapsed="0.000849"/>
</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-04-17T03:28:44.410566" elapsed="0.000198"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:28:44.412068" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:28:44.411556" elapsed="0.001654">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:44.411030" elapsed="0.002308"/>
</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-04-17T03:28:44.414181" elapsed="0.000345"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:44.413567" elapsed="0.001061"/>
</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-04-17T03:28:44.410044" elapsed="0.004639"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:44.409799" elapsed="0.004947"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:44.409781" elapsed="0.004997"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:44.416095" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:28:44.415517" elapsed="0.000607"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:28:44.416177" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:28:44.416378" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:28:44.415161" elapsed="0.001245"/>
</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-04-17T03:28:44.416570" elapsed="0.000529"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:44.417399" level="INFO">index=28
host=10.30.170.120
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-04-17T03:28:44.417502" level="INFO">${karaf_connection_object} = index=28
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:28:44.417284" elapsed="0.000289"/>
</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-04-17T03:28:44.417734" elapsed="0.002588"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:28:44.420795" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:28:44.422150" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:28:44.420497" elapsed="0.002065">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:28:44.436440" elapsed="0.000509"/>
</kw>
<msg time="2026-04-17T03:28:44.437046" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:44.435001" elapsed="0.002197"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:44.437369" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:44.437533" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:28:44.423452" elapsed="0.014162"/>
</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-04-17T03:28:44.422884" elapsed="0.014775"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:28:44.406631" elapsed="0.031115">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:44.438143" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:28:44.438218" 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="FAIL" start="2026-04-17T03:28:44.392599" elapsed="0.045726">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:28:44.438434" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:28:44.438477" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:44.386701" elapsed="0.051800"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:44.438840" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:44.438582" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:44.438562" elapsed="0.000356"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:28:44.386551" elapsed="0.052433"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:28:44.386363" elapsed="0.052656"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:28:44.383707" elapsed="0.055370"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:28:44.376428" elapsed="0.062704"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:44.375758" elapsed="0.063418"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:28:44.371996" elapsed="0.067232"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:44.440484" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:44.439858" elapsed="0.000654"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:44.441192" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:44.440688" elapsed="0.000533"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:44.441775" 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-04-17T03:28:44.441395" elapsed="0.000407"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:44.442484" 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-04-17T03:28:44.442637" 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-04-17T03:28:44.442265" elapsed="0.000398"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:44.443029" 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-04-17T03:28:44.443159" 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-04-17T03:28:44.442821" elapsed="0.000363"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-04-17T03:28:44.443337" elapsed="0.002736"/>
</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-04-17T03:28:44.446254" elapsed="0.002031"/>
</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-04-17T03:28:44.500830" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:44.500340" elapsed="0.000526"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:44.501706" 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-04-17T03:28:44.501407" elapsed="0.000383">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-04-17T03:28:44.501885" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:44.501061" elapsed="0.000849"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:44.502483" 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-04-17T03:28:44.502094" elapsed="0.000417"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:44.502816" 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-04-17T03:28:44.503019" 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-04-17T03:28:44.502673" elapsed="0.000374"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:44.503477" 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-04-17T03:28:44.503210" 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-04-17T03:28:44.504616" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:44.504283" elapsed="0.000418"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:44.505182" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:28:44.504868" elapsed="0.000340"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:44.506051" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:44.505584" elapsed="0.000494"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:44.507704" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:44.506958" elapsed="0.000888"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:44.507955" elapsed="0.000079"/>
</return>
<msg time="2026-04-17T03:28:44.508331" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:44.506308" elapsed="0.002050"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:44.508576" elapsed="0.000437"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:28:44.505444" elapsed="0.003612"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:44.509754" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:44.509325" elapsed="0.000455"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:44.511297" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:44.510681" elapsed="0.000717"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:44.511478" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:28:44.511777" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:44.510197" elapsed="0.001607"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:44.511976" elapsed="0.000375"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:28:44.509188" elapsed="0.003205"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:28:44.505262" elapsed="0.007166"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:28:44.512471" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:28:44.512630" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:28:44.503941" elapsed="0.008749"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:44.503602" elapsed="0.009123"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:44.512904" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:44.512750" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:44.503577" elapsed="0.009423"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:44.513746" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:28:44.513149" elapsed="0.000627"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:28:44.513824" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:44.499527" elapsed="0.014455"/>
</kw>
<msg time="2026-04-17T03:28:44.514039" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:44.486631" elapsed="0.027458"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:44.526673" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:44.539508" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_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-04-17T03:28:44.552258" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:44.552536" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:44.552752" 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-04-17T03:28:44.553150" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:44.553000" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:44.552985" 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-04-17T03:28:44.553371" 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-04-17T03:28:44.553540" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:44.553718" elapsed="0.000025"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:28:44.552952" elapsed="0.000832"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:28:44.552832" elapsed="0.000984"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:44.553977" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:44.554055" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:28:44.554184" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:28:44.482322" elapsed="0.071890"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:44.555658" 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-04-17T03:28:44.555374" elapsed="0.000360">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-04-17T03:28:44.555828" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:44.555009" elapsed="0.000843"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:44.556195" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:44.555923" elapsed="0.000331"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:44.556880" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:44.556503" elapsed="0.000404"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:44.556278" elapsed="0.000684"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:44.555905" elapsed="0.001085"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:44.559644" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:28:44.557159" elapsed="0.002513"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:28:44.559723" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:28:44.559881" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:28:44.554622" elapsed="0.005284"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:44.561268" 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-04-17T03:28:44.561010" elapsed="0.000324">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-04-17T03:28:44.561430" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:44.560580" elapsed="0.000875"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:28:44.561664" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-17T03:28:44.561527" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:44.561509" elapsed="0.000279"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:44.561955" elapsed="0.000024"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:44.562157" elapsed="0.000025"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:28:44.562228" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:28:44.564157" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:28:44.560246" elapsed="0.003937"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:44.565629" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:44.565354" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:44.566108" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:44.565833" elapsed="0.000319"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:28:44.571302" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:44.772710" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:45.176137" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:45.179336" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:28:44.568295" elapsed="0.617499">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:44.566217" elapsed="0.619979">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:45.186874" elapsed="0.000129"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:45.186314" elapsed="0.000803"/>
</branch>
<status status="FAIL" start="2026-04-17T03:28:44.566199" elapsed="0.620975">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:45.188466" elapsed="0.000067"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:45.188827" elapsed="0.000045"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:45.188724" elapsed="0.000259"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:45.188671" elapsed="0.000363"/>
</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-04-17T03:28:45.189511" elapsed="0.000050"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:28:45.189670" elapsed="0.000034"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:28:44.564497" elapsed="0.625469">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:45.190289" elapsed="0.000038"/>
</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-04-17T03:28:44.459448" elapsed="0.731074">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:45.191229" elapsed="0.000058"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:45.190738" elapsed="0.000661"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:45.190701" elapsed="0.000752"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:45.191526" elapsed="0.000032"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-04-17T03:28:44.454594" elapsed="0.737163">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:47.250201" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:47.249737" elapsed="0.000500"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:47.251175" 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-04-17T03:28:47.250845" elapsed="0.000424">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-04-17T03:28:47.251373" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:47.250460" elapsed="0.000949"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:47.252077" 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-04-17T03:28:47.251581" elapsed="0.000527"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:47.252441" 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-04-17T03:28:47.252616" 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-04-17T03:28:47.252278" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:47.253114" 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-04-17T03:28:47.252818" elapsed="0.000346"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:47.254394" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:47.254062" elapsed="0.000393"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:47.255426" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:28:47.254625" elapsed="0.000894"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:47.258031" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:47.256554" elapsed="0.001542"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:47.260853" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:47.259870" elapsed="0.001165"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:47.261164" elapsed="0.000068"/>
</return>
<msg time="2026-04-17T03:28:47.261733" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:47.258605" 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-04-17T03:28:47.262132" elapsed="0.000655"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:28:47.256160" elapsed="0.006762"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:47.264554" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:47.263393" elapsed="0.001202"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:47.266478" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:47.265625" elapsed="0.001007"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:47.266747" elapsed="0.000049"/>
</return>
<msg time="2026-04-17T03:28:47.267259" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:47.264897" elapsed="0.002402"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:47.267533" elapsed="0.000649"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:28:47.263181" elapsed="0.005066"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:28:47.255676" elapsed="0.012623"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:28:47.268364" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:28:47.268605" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:28:47.253665" elapsed="0.014978"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:47.253249" elapsed="0.015448"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:47.269065" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:47.268756" elapsed="0.000401"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:47.253224" elapsed="0.015964"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:47.270631" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:28:47.269415" elapsed="0.001283"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:28:47.270980" elapsed="0.000096"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:47.248905" elapsed="0.022423"/>
</kw>
<msg time="2026-04-17T03:28:47.271455" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:47.235312" elapsed="0.036257"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:47.286203" 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_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-04-17T03:28:47.300425" 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-04-17T03:28:47.313196" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:47.313429" 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-04-17T03:28:47.313616" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:47.314049" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:47.313880" elapsed="0.000226"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:47.313861" 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-04-17T03:28:47.314277" 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-04-17T03:28:47.314444" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:47.314609" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:28:47.313823" elapsed="0.000839"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:28:47.313699" elapsed="0.000990"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:47.314874" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:47.314968" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:28:47.315132" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:28:47.230666" elapsed="0.084494"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:47.316605" 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-04-17T03:28:47.316303" elapsed="0.000382">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-04-17T03:28:47.316780" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:47.315872" elapsed="0.000932"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:47.317165" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:47.316874" elapsed="0.000348"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:47.317730" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:47.317432" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:47.317246" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:47.316856" elapsed="0.000955"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:47.320411" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:28:47.317978" elapsed="0.002461"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:28:47.320492" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:28:47.320651" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:28:47.315498" elapsed="0.005177"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:47.321970" 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-04-17T03:28:47.321696" elapsed="0.000402">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-04-17T03:28:47.322195" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:47.321351" elapsed="0.000869"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:28:47.322432" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:28:47.322293" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:47.322274" elapsed="0.000242"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:47.322665" 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-04-17T03:28:47.322877" elapsed="0.000023"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:28:47.322962" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:28:47.325369" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:28:47.321011" elapsed="0.004395"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:47.327632" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:47.327255" elapsed="0.000445"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:47.328167" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:47.327891" elapsed="0.000353"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:28:47.333325" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:47.534721" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:47.938181" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:47.941303" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:28:47.330551" elapsed="0.615156">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:47.328329" elapsed="0.617579">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:47.946460" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:47.946024" elapsed="0.000546"/>
</branch>
<status status="FAIL" start="2026-04-17T03:28:47.328308" elapsed="0.618297">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:47.947363" elapsed="0.000040"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:47.947576" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:47.947515" elapsed="0.000238"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:47.947485" elapsed="0.000308"/>
</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-04-17T03:28:47.948033" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:28:47.948135" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:28:47.325863" elapsed="0.622443">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:47.948420" 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-04-17T03:28:47.207010" elapsed="0.741553">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:47.948989" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:47.948697" elapsed="0.000394"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:47.948673" elapsed="0.000452"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:47.949170" elapsed="0.000019"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-04-17T03:28:47.199596" elapsed="0.749717">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:50.007881" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:50.007277" elapsed="0.000647"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:50.009002" 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-04-17T03:28:50.008552" elapsed="0.000555">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-04-17T03:28:50.009211" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:50.008165" elapsed="0.001071"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:50.009922" 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-04-17T03:28:50.009460" elapsed="0.000508"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:50.010298" 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-04-17T03:28:50.010559" 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-04-17T03:28:50.010140" elapsed="0.000447"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:50.011080" 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-04-17T03:28:50.010761" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:50.012616" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:50.012272" elapsed="0.000409"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:50.013191" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:28:50.012862" elapsed="0.000358"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:50.014155" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:50.013709" elapsed="0.000474"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:50.015528" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:50.014905" elapsed="0.000730"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:50.015758" elapsed="0.000050"/>
</return>
<msg time="2026-04-17T03:28:50.016117" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:50.014386" elapsed="0.001759"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:50.016311" elapsed="0.000428"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:28:50.013558" elapsed="0.003226"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:50.017828" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:50.017069" elapsed="0.000787"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:50.019152" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:50.018539" elapsed="0.000721"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:50.019338" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:28:50.019638" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:50.018068" elapsed="0.001611"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:50.019873" elapsed="0.000404"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:28:50.016906" elapsed="0.003418"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:28:50.013317" elapsed="0.007042"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:28:50.020404" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:28:50.020567" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:28:50.011873" elapsed="0.008721"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:50.011374" elapsed="0.009252"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:50.020809" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:50.020654" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:50.011339" elapsed="0.009549"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:50.021836" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:28:50.021067" elapsed="0.000801"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:28:50.021919" elapsed="0.000050"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:28:50.006194" elapsed="0.015875"/>
</kw>
<msg time="2026-04-17T03:28:50.022128" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:49.991726" elapsed="0.030454"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:50.034693" elapsed="0.000033"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_active_ad/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:50.047063" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_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-04-17T03:28:50.059900" elapsed="0.000103"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:50.060257" 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-04-17T03:28:50.060447" 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-04-17T03:28:50.060889" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:50.060726" elapsed="0.000244"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:50.060708" elapsed="0.000291"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:50.061147" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:50.061316" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:50.061499" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:28:50.060663" elapsed="0.000890"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:28:50.060537" elapsed="0.001044"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:50.061731" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:50.061810" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:28:50.062003" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:28:49.986650" elapsed="0.075385"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:50.064016" 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-04-17T03:28:50.063633" elapsed="0.000485">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-04-17T03:28:50.064217" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:50.063158" elapsed="0.001084"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:50.064595" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:50.064311" elapsed="0.000343"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:50.065214" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:50.064896" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:50.064679" elapsed="0.000597"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:50.064294" elapsed="0.001003"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:50.067910" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:28:50.065484" elapsed="0.002467"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:28:50.068090" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:28:50.068259" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:28:50.062579" elapsed="0.005705"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:50.069551" 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-04-17T03:28:50.069297" elapsed="0.000319">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-04-17T03:28:50.069710" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:50.068951" elapsed="0.000784"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:28:50.069957" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:28:50.069804" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:50.069786" elapsed="0.000255"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:50.070191" 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-04-17T03:28:50.070364" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:28:50.070428" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:28:50.072361" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:28:50.068603" elapsed="0.003788"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:50.073973" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:50.073671" elapsed="0.000356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:50.074439" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:50.074183" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:28:50.080018" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:50.281476" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:50.684109" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:50.686623" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:28:50.076647" elapsed="0.614928">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:50.074555" elapsed="0.617225">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:50.692318" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:50.691860" elapsed="0.000565"/>
</branch>
<status status="FAIL" start="2026-04-17T03:28:50.074535" elapsed="0.617928">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:50.693785" elapsed="0.000060"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:50.694087" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:50.694019" elapsed="0.000147"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:50.693984" 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-04-17T03:28:50.694442" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:28:50.694549" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:28:50.072750" elapsed="0.621993">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:50.694872" elapsed="0.000030"/>
</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-04-17T03:28:49.962585" elapsed="0.732659">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:50.696337" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:50.695397" elapsed="0.001066"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:50.695369" elapsed="0.001132"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:50.696552" elapsed="0.000022"/>
</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-04-17T03:28:49.957716" elapsed="0.739004">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:28:50.696987" level="FAIL">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-17T03:28:44.448456" elapsed="6.248808">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:28:50.697593" elapsed="0.000034"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:28:50.697883" elapsed="0.000030"/>
</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="NOT RUN" start="2026-04-17T03:28:50.698187" elapsed="0.000030"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:28:50.698441" elapsed="0.000028"/>
</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-04-17T03:28:50.699031" elapsed="0.003286"/>
</kw>
<arg>source_active_ad</arg>
<arg>${MVPN_DIR}</arg>
<status status="FAIL" start="2026-04-17T03:28:44.439482" elapsed="6.262928">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:44.371502" elapsed="6.331151">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:28:50.706614" elapsed="0.000352"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:28:50.706331" elapsed="0.000698"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:50.708260" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:50.708090" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:50.708063" elapsed="0.000274"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:50.714904" elapsed="0.000043"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:50.714742" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:50.714713" elapsed="0.000315"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:50.716600" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:28:50.715944" elapsed="0.000698"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:28:50.717389" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:28:50.716879" elapsed="0.000548"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:28:50.717491" elapsed="0.000051"/>
</return>
<msg time="2026-04-17T03:28:50.717724" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:28:50.715368" elapsed="0.002391"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:50.723647" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:50.723532" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:50.723512" elapsed="0.000205"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:50.725023" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:50.724875" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:50.724857" elapsed="0.000235"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:50.725606" level="INFO">${karaf_connection_index} = 28</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:28:50.725275" elapsed="0.000360"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:50.726099" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:28:50.725806" elapsed="0.000321"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:28:50.727085" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:28:50.726738" elapsed="0.001145">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:28:50.728129" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:28:50.728181" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:50.726315" elapsed="0.001890"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:28:50.729195" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:28:50.728849" elapsed="0.001067">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:28:50.730135" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:28:50.730182" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:50.728456" elapsed="0.001750"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:28:50.731351" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_shared_tree_join"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:28:50.730622" elapsed="0.000795">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_shared_tree_join"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:50.730375" elapsed="0.001118">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_shared_tree_join"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:28:50.730352" elapsed="0.001177">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_shared_tree_join"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:50.731697" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:50.731943" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:50.731784" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:50.731766" elapsed="0.000258"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:28:50.732059" elapsed="0.000018"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:28:50.734890" elapsed="0.000173"/>
</kw>
<msg time="2026-04-17T03:28:50.735139" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:50.733684" elapsed="0.001594"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:50.735622" elapsed="0.000087"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:50.736025" 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-04-17T03:28:50.732999" elapsed="0.003224"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:28:50.732392" elapsed="0.003898"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:28:50.724567" elapsed="0.011813">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_shared_tree_join"</status>
</kw>
<msg time="2026-04-17T03:28:50.736488" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:28:50.736540" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_shared_tree_join"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:50.723877" elapsed="0.012708"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:28:50.736812" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:50.736693" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:50.736667" elapsed="0.000213"/>
</if>
<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-04-17T03:28:50.738097" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:50.737910" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:50.737892" elapsed="0.000273"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:50.738479" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:28:50.738589" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:28:50.738326" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:50.739067" level="INFO">{1: 28}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:50.738773" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:50.739510" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:50.739267" elapsed="0.000287"/>
</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-04-17T03:28:50.740120" elapsed="0.000279"/>
</kw>
<msg time="2026-04-17T03:28:50.740499" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:28:50.740546" level="INFO">${old_connection_index} = 28</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:50.739717" elapsed="0.000853"/>
</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-04-17T03:28:50.741520" elapsed="0.000196"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:28:50.742981" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:28:50.742489" elapsed="0.001433">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:50.741888" elapsed="0.002156"/>
</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-04-17T03:28:50.744696" elapsed="0.000321"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:50.744221" elapsed="0.000904"/>
</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-04-17T03:28:50.740898" elapsed="0.004276"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:50.740645" elapsed="0.004579"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:50.740627" elapsed="0.004623"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:50.746139" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:28:50.745797" elapsed="0.000369"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:28:50.746215" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:28:50.746374" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:28:50.745466" elapsed="0.000933"/>
</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-04-17T03:28:50.746556" elapsed="0.000526"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:50.747367" level="INFO">index=29
host=10.30.170.120
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-04-17T03:28:50.747468" level="INFO">${karaf_connection_object} = index=29
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:28:50.747258" elapsed="0.000236"/>
</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-04-17T03:28:50.747649" elapsed="0.004735"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:28:50.752847" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:28:50.754068" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:28:50.752566" elapsed="0.001917">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:28:50.770406" elapsed="0.000437"/>
</kw>
<msg time="2026-04-17T03:28:50.770992" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:50.768672" elapsed="0.002499"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:50.771344" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:50.771533" elapsed="0.000029"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:28:50.755400" elapsed="0.016253"/>
</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-04-17T03:28:50.754808" elapsed="0.016910"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:28:50.737600" elapsed="0.034247">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:50.772604" elapsed="0.000030"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:28:50.772693" elapsed="0.000031"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:28:50.723180" elapsed="0.049649">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:28:50.772974" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:28:50.773021" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:50.718249" elapsed="0.054796"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:50.774039" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:50.773653" elapsed="0.000442"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:50.773597" elapsed="0.000525"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:28:50.718091" elapsed="0.056060"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:28:50.717849" elapsed="0.056345"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:28:50.714146" elapsed="0.060117"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:28:50.707719" elapsed="0.066607"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:50.707192" elapsed="0.067183"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:28:50.703599" elapsed="0.070837"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:50.775535" 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-04-17T03:28:50.775773" 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-04-17T03:28:50.775290" elapsed="0.000510"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-17T03:28:50.776350" 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-04-17T03:28:50.776116" elapsed="0.000261"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:50.776730" 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-04-17T03:28:50.776860" 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-04-17T03:28:50.776537" elapsed="0.000349"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-17T03:28:50.777323" 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-04-17T03:28:50.777103" elapsed="0.000248"/>
</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-04-17T03:28:50.777650" elapsed="0.002317"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:50.777424" elapsed="0.002582"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:50.777407" elapsed="0.002626"/>
</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-04-17T03:28:50.816002" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:50.815373" elapsed="0.000678"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:50.817238" 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-04-17T03:28:50.816710" elapsed="0.000633">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-04-17T03:28:50.817446" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:50.816282" elapsed="0.001189"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:50.818132" 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-04-17T03:28:50.817650" elapsed="0.000511"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:50.818489" 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-04-17T03:28:50.818704" 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-04-17T03:28:50.818334" elapsed="0.000481"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:50.819286" 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-04-17T03:28:50.819005" elapsed="0.000334"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:50.820480" level="INFO">mapping: {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:50.820213" elapsed="0.000312"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:50.821095" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:28:50.820694" elapsed="0.000431"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:50.821858" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:50.821548" elapsed="0.000337"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:50.822982" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:50.822445" elapsed="0.000577"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:50.823083" elapsed="0.000047"/>
</return>
<msg time="2026-04-17T03:28:50.823272" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:50.822106" 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-04-17T03:28:50.823463" elapsed="0.000316"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:28:50.821397" elapsed="0.002428"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:50.824418" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:50.824109" elapsed="0.000335"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:50.825676" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:50.825254" elapsed="0.000449"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:50.825782" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:28:50.825980" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:50.824637" 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-04-17T03:28:50.826204" elapsed="0.000277"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:28:50.823966" elapsed="0.002568"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:28:50.821193" elapsed="0.005384"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:28:50.826633" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:28:50.826828" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:28:50.819853" elapsed="0.007006"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:50.819432" elapsed="0.007464"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:50.827125" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:50.826924" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:50.819402" elapsed="0.007805"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:50.828101" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:28:50.827361" elapsed="0.000774"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:28:50.828187" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/${file_name} exists. 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-04-17T03:28:50.814499" elapsed="0.013820"/>
</kw>
<msg time="2026-04-17T03:28:50.828379" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:50.801308" elapsed="0.027123"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:50.842280" elapsed="0.000106"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:50.856248" elapsed="0.000066"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</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-04-17T03:28:50.869575" elapsed="0.000057"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:50.869962" 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-04-17T03:28:50.870175" 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-04-17T03:28:50.870689" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:50.870518" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:50.870496" 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-04-17T03:28:50.871044" 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-04-17T03:28:50.871239" 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-04-17T03:28:50.871411" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:28:50.870440" elapsed="0.001026"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:28:50.870273" elapsed="0.001224"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:50.871666" elapsed="0.000024"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:50.871763" elapsed="0.000021"/>
</return>
<msg time="2026-04-17T03:28:50.872054" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:28:50.796579" elapsed="0.075513"/>
</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-04-17T03:28:50.899120" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:50.898591" elapsed="0.000569"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:50.900141" 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-04-17T03:28:50.899766" elapsed="0.000480">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-04-17T03:28:50.900356" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:50.899391" elapsed="0.000996"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:50.901069" 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-04-17T03:28:50.900584" elapsed="0.000515"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:50.901476" 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-04-17T03:28:50.901903" 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-04-17T03:28:50.901275" elapsed="0.000675"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:50.902389" 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-04-17T03:28:50.902127" 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-04-17T03:28:50.903044" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:50.902554" elapsed="0.000569"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:50.903635" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:50.903328" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:50.903164" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:50.902521" elapsed="0.001203"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:50.904476" 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-04-17T03:28:50.903889" elapsed="0.000620"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:28:50.904589" 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/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-04-17T03:28:50.896873" elapsed="0.007888"/>
</kw>
<msg time="2026-04-17T03:28:50.904829" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:50.883529" elapsed="0.021360"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:50.918493" elapsed="0.000086"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:50.931747" elapsed="0.000111"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</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-04-17T03:28:50.944902" elapsed="0.000319"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:50.945553" elapsed="0.000162"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:50.945920" elapsed="0.000040"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:50.946494" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:50.946311" elapsed="0.000243"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:50.946289" elapsed="0.000300"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:50.946748" 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-04-17T03:28:50.946947" 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-04-17T03:28:50.947128" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:28:50.946231" elapsed="0.000952"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:28:50.946044" elapsed="0.001172"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:50.947376" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:50.947466" elapsed="0.000023"/>
</return>
<msg time="2026-04-17T03:28:50.947708" 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-04-17T03:28:50.882503" elapsed="0.065241"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:50.949878" 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-04-17T03:28:50.949357" elapsed="0.000700">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-04-17T03:28:50.950170" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:50.948651" elapsed="0.001546"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:50.950590" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:50.950274" elapsed="0.000395"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:50.951358" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:50.950974" elapsed="0.000412"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:50.950705" elapsed="0.000721"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:50.950253" elapsed="0.001220"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:50.954089" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:28:50.951678" elapsed="0.002440"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:28:50.954176" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:28:50.954352" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:28:50.948226" elapsed="0.006153"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:50.956200" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:28:50.955846" elapsed="0.000409"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:50.956655" 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-04-17T03:28:50.956413" elapsed="0.000390"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:50.957266" 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-04-17T03:28:50.956981" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:50.957760" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:50.957468" elapsed="0.000339"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:50.958719" 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-04-17T03:28:50.958464" elapsed="0.000290"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:28:50.959318" 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-04-17T03:28:50.958945" elapsed="0.000409"/>
</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-04-17T03:28:50.959551" elapsed="0.000258"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:50.960376" 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-04-17T03:28:50.960046" elapsed="0.000390"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:28:50.960489" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:28:50.960705" 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-04-17T03:28:50.958044" elapsed="0.002697"/>
</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-04-17T03:28:50.966993" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:51.168530" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:51.572040" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:51.575035" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:28:50.963526" elapsed="0.617011">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:50.960837" elapsed="0.620063">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:28:51.581634" elapsed="0.000082"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:51.581055" elapsed="0.000830"/>
</branch>
<status status="FAIL" start="2026-04-17T03:28:50.960816" elapsed="0.621135">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:28:51.582590" elapsed="0.000033"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:51.582783" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:51.582734" elapsed="0.000123"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:51.582706" 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-04-17T03:28:51.583107" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:28:51.583182" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>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="FAIL" start="2026-04-17T03:28:50.954750" elapsed="0.628725">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:51.583576" elapsed="0.000018"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>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="FAIL" start="2026-04-17T03:28:50.785262" elapsed="0.798427">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:51.584084" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:51.583832" elapsed="0.000341"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:51.583812" elapsed="0.000387"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:51.584239" elapsed="0.000015"/>
</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="FAIL" start="2026-04-17T03:28:50.780332" elapsed="0.804025">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:28:51.584627" elapsed="0.000031"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<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="NOT RUN" start="2026-04-17T03:28:51.584919" elapsed="0.000042"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:51.585126" elapsed="0.000020"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations">
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:51.585319" elapsed="0.000023"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:28:51.585504" elapsed="0.000021"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<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="NOT RUN" start="2026-04-17T03:28:51.585744" elapsed="0.000033"/>
</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-04-17T03:28:51.643740" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:51.643030" elapsed="0.000771"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:51.645138" 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-04-17T03:28:51.644627" elapsed="0.000647">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-04-17T03:28:51.645404" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:51.644096" elapsed="0.001341"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:51.646272" 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-04-17T03:28:51.645668" elapsed="0.000649"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:51.646977" 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-04-17T03:28:51.647228" 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-04-17T03:28:51.646739" elapsed="0.000528"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:51.647868" 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-04-17T03:28:51.647507" elapsed="0.000457"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:51.650418" level="INFO">mapping: {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:51.649736" elapsed="0.000848"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:51.651711" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:28:51.651020" elapsed="0.000752"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:51.653993" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:51.652651" elapsed="0.001385"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:51.655910" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:51.655218" elapsed="0.000776"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:51.656177" elapsed="0.000074"/>
</return>
<msg time="2026-04-17T03:28:51.656543" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:51.654388" elapsed="0.002199"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:51.656857" elapsed="0.000823"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:28:51.652336" elapsed="0.005408"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:51.659007" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:51.658175" elapsed="0.000872"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:51.661374" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:51.660288" elapsed="0.001148"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:51.661617" elapsed="0.000064"/>
</return>
<msg time="2026-04-17T03:28:51.662036" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:51.659439" elapsed="0.002636"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:51.662312" elapsed="0.000763"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:28:51.657963" elapsed="0.005175"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:28:51.651895" elapsed="0.011299"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:28:51.663262" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:28:51.663506" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:28:51.648716" elapsed="0.014827"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:51.648098" elapsed="0.015494"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:51.663877" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:51.663637" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:51.648057" elapsed="0.015958"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:51.665358" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:28:51.664240" elapsed="0.001163"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:28:51.665475" elapsed="0.000045"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/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-04-17T03:28:51.641567" elapsed="0.024098"/>
</kw>
<msg time="2026-04-17T03:28:51.665867" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:51.622192" elapsed="0.043902"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:51.679343" elapsed="0.000105"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:51.694669" elapsed="0.000063"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/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-04-17T03:28:51.707524" elapsed="0.000048"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:51.707837" 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-04-17T03:28:51.708050" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:51.708545" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:51.708377" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:51.708356" 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-04-17T03:28:51.708819" 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-04-17T03:28:51.709004" 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-04-17T03:28:51.709175" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:28:51.708299" elapsed="0.000929"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:28:51.708147" elapsed="0.001112"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:51.709410" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:51.709492" elapsed="0.000021"/>
</return>
<msg time="2026-04-17T03:28:51.709685" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:28:51.615491" elapsed="0.094225"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:51.711170" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:28:51.710748" elapsed="0.000482"/>
</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-04-17T03:28:51.716527" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:51.918346" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:52.321569" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:52.324837" level="INFO">${response} = None</msg>
<msg time="2026-04-17T03:28:52.324999" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:51.713439" elapsed="0.616327">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:51.711298" elapsed="0.618798">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:52.330804" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:52.330214" elapsed="0.000767"/>
</branch>
<status status="FAIL" start="2026-04-17T03:28:51.711279" elapsed="0.619757">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:52.337882" 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-04-17T03:28:52.334195" elapsed="0.003770">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:52.333774" elapsed="0.004298">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:28:52.333737" elapsed="0.004388">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-04-17T03:28:52.341706" 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-04-17T03:28:52.338556" elapsed="0.003199">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:52.338226" elapsed="0.003617">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:28:52.338202" elapsed="0.003690">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:52.342962" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:28:52.342257" elapsed="0.000745"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:52.343449" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:52.343102" elapsed="0.000428"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:52.344277" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:52.343810" elapsed="0.000505"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:52.343565" elapsed="0.000799"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:52.343076" elapsed="0.001320"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:52.345275" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:28:52.344743" elapsed="0.000571"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:52.345751" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:52.345410" elapsed="0.000415"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:52.346540" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:52.346124" elapsed="0.000453"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:52.345854" elapsed="0.000916"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:52.345385" elapsed="0.001427"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:52.347076" elapsed="0.000510"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-17T03:28:52.348341" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:28:52.347833" elapsed="0.000545"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-04-17T03:28:52.351887" 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-04-17T03:28:52.348629" elapsed="0.003332">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-04-17T03:28:52.332791" elapsed="0.019402">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-04-17T03:28:52.352306" elapsed="0.000058"/>
</return>
<msg time="2026-04-17T03:28:52.356371" level="INFO">${response_text} = None</msg>
<msg time="2026-04-17T03:28:52.356456" 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-04-17T03:28:51.710047" elapsed="0.646517">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-04-17T03:28:52.356707" elapsed="0.000063"/>
</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-04-17T03:28:51.587267" elapsed="0.769743">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:51.586645" elapsed="0.770455"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-04-17T03:28:51.586118" elapsed="0.771057"/>
</kw>
<arg>shared_tree_join</arg>
<arg>${MVPN_DIR}</arg>
<status status="FAIL" start="2026-04-17T03:28:50.774818" elapsed="1.582444">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:50.703006" elapsed="1.654530">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:28:52.361666" elapsed="0.000375"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:28:52.361312" elapsed="0.000803"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:52.363419" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:52.363244" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:52.363213" elapsed="0.000288"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:52.368682" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:52.368561" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:52.368541" elapsed="0.000211"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:52.369862" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:28:52.369424" elapsed="0.000470"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:28:52.370499" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:28:52.370117" elapsed="0.000410"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:28:52.370574" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:28:52.370753" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:28:52.369025" elapsed="0.001752"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:52.376761" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:52.376648" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:52.376625" elapsed="0.000208"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:52.378137" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:52.378014" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:52.377996" elapsed="0.000211"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:52.378691" level="INFO">${karaf_connection_index} = 29</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:28:52.378363" elapsed="0.000356"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:52.379155" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:28:52.378889" elapsed="0.000292"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:28:52.380058" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:28:52.379690" elapsed="0.001282">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:28:52.381187" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:28:52.381235" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:52.379345" elapsed="0.001914"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:28:52.382065" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:28:52.381785" elapsed="0.000973">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:28:52.382975" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:28:52.383023" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:52.381433" elapsed="0.001613"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:28:52.384023" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_shared_tree_join"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:28:52.383367" elapsed="0.000720">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_shared_tree_join"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:52.383126" elapsed="0.001039">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_shared_tree_join"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:28:52.383106" elapsed="0.001100">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_shared_tree_join"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:52.384374" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:52.384635" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:52.384461" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:52.384443" elapsed="0.000269"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:28:52.384746" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:28:52.387447" elapsed="0.000151"/>
</kw>
<msg time="2026-04-17T03:28:52.387675" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:52.386357" 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-04-17T03:28:52.388282" elapsed="0.000090"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:52.388687" 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-04-17T03:28:52.385670" elapsed="0.003213"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:28:52.385086" elapsed="0.003884"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:28:52.377677" elapsed="0.011384">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_shared_tree_join"</status>
</kw>
<msg time="2026-04-17T03:28:52.389168" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:28:52.389213" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_shared_tree_join"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:52.377007" elapsed="0.012302"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:28:52.389510" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:52.389396" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:52.389376" elapsed="0.000202"/>
</if>
<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-04-17T03:28:52.390650" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:52.390541" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:52.390523" elapsed="0.000197"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:52.391160" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:28:52.391274" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:28:52.390885" elapsed="0.000422"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:52.391758" level="INFO">{1: 29}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:52.391468" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:52.392230" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:52.391980" elapsed="0.000295"/>
</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-04-17T03:28:52.392890" elapsed="0.000305"/>
</kw>
<msg time="2026-04-17T03:28:52.393296" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:28:52.393351" level="INFO">${old_connection_index} = 29</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:52.392449" elapsed="0.000927"/>
</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-04-17T03:28:52.394240" elapsed="0.000214"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:28:52.395916" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:28:52.395468" elapsed="0.001691">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:52.394625" elapsed="0.002637"/>
</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-04-17T03:28:52.397952" elapsed="0.000298"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:52.397456" elapsed="0.000879"/>
</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-04-17T03:28:52.393685" elapsed="0.004720"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:52.393454" elapsed="0.005018"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:52.393435" elapsed="0.005070"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:52.399517" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:28:52.399192" elapsed="0.000351"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:28:52.399593" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:28:52.399760" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:28:52.398766" elapsed="0.001018"/>
</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-04-17T03:28:52.399959" elapsed="0.000472"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:52.400774" level="INFO">index=30
host=10.30.170.120
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-04-17T03:28:52.400874" level="INFO">${karaf_connection_object} = index=30
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:28:52.400654" elapsed="0.000245"/>
</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-04-17T03:28:52.401075" elapsed="0.002464"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:28:52.403988" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:28:52.405509" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:28:52.403707" elapsed="0.002244">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:28:52.421254" elapsed="0.000442"/>
</kw>
<msg time="2026-04-17T03:28:52.421824" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:52.419342" elapsed="0.002680"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:52.422201" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:52.422370" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:28:52.407157" elapsed="0.015302"/>
</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-04-17T03:28:52.406405" elapsed="0.016105"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:28:52.390226" elapsed="0.032387">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:52.423108" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:28:52.423193" elapsed="0.000031"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:28:52.376272" elapsed="0.047058">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:28:52.423461" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:28:52.423505" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:52.371377" elapsed="0.052153"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:52.423939" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:52.423630" elapsed="0.000367"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:52.423605" elapsed="0.000420"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:28:52.371218" elapsed="0.052837"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:28:52.370997" elapsed="0.053104"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:28:52.368107" elapsed="0.056063"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:28:52.362864" elapsed="0.061368"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:52.362290" elapsed="0.061991"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:28:52.358557" elapsed="0.065793"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:52.425798" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:52.425271" elapsed="0.000560"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:52.426477" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:52.426020" elapsed="0.000485"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:52.427087" 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-04-17T03:28:52.426673" elapsed="0.000442"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:52.427511" 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-04-17T03:28:52.427727" 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-04-17T03:28:52.427285" elapsed="0.000469"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:52.428154" 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-04-17T03:28:52.428351" 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-04-17T03:28:52.427948" elapsed="0.000429"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-04-17T03:28:52.428572" elapsed="0.003109"/>
</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-04-17T03:28:52.431921" elapsed="0.001904"/>
</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-04-17T03:28:52.498553" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:52.498005" elapsed="0.000589"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:52.499610" 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-04-17T03:28:52.499277" elapsed="0.000436">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-04-17T03:28:52.499845" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:52.498815" elapsed="0.001061"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:52.500653" 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-04-17T03:28:52.500107" elapsed="0.000594"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:52.501093" 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-04-17T03:28:52.501310" 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-04-17T03:28:52.500887" elapsed="0.000456"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:52.501898" 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-04-17T03:28:52.501553" 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-04-17T03:28:52.503405" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:52.502965" elapsed="0.000492"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:52.503972" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:28:52.503628" elapsed="0.000375"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:52.504961" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:52.504471" elapsed="0.000522"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:52.506501" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:52.505768" elapsed="0.000860"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:52.506731" elapsed="0.000056"/>
</return>
<msg time="2026-04-17T03:28:52.507112" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:52.505200" elapsed="0.001945"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:52.507312" elapsed="0.000403"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:28:52.504296" elapsed="0.003462"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:52.508571" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:52.508046" elapsed="0.000552"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:52.510175" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:52.509585" elapsed="0.000693"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:52.510359" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:28:52.510833" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:52.509077" elapsed="0.001787"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:52.511123" elapsed="0.000464"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:28:52.507877" elapsed="0.003756"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:28:52.504064" elapsed="0.007615"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:28:52.511728" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:28:52.511894" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:28:52.502507" elapsed="0.009413"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:52.502076" elapsed="0.009903"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:52.512196" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:52.512011" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:52.502044" elapsed="0.010251"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:52.513271" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:28:52.512508" elapsed="0.000793"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:28:52.513354" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:28:52.496652" elapsed="0.016833"/>
</kw>
<msg time="2026-04-17T03:28:52.513546" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:52.481629" elapsed="0.031977"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:52.526940" elapsed="0.000049"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/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-04-17T03:28:52.540098" elapsed="0.000059"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:28:52.553696" elapsed="0.000073"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:52.554091" 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-04-17T03:28:52.554345" 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-04-17T03:28:52.554921" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:52.554721" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:52.554700" elapsed="0.000354"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:52.555210" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:52.555381" 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-04-17T03:28:52.555652" elapsed="0.000026"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:28:52.554647" elapsed="0.001067"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:28:52.554459" elapsed="0.001284"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:52.555896" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:52.556008" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:28:52.556207" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:28:52.476181" elapsed="0.080058"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:52.558200" 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-04-17T03:28:52.557843" elapsed="0.000440">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-04-17T03:28:52.558383" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:52.557397" elapsed="0.001011"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:52.558774" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:52.558483" elapsed="0.000350"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:52.559388" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:52.559081" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:52.558860" elapsed="0.000591"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:52.558463" elapsed="0.001009"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:52.562364" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:28:52.559629" elapsed="0.002764"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:28:52.562450" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:28:52.562630" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:28:52.556754" elapsed="0.005906"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:52.564279" 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-04-17T03:28:52.563983" elapsed="0.000371">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/shared_tree_join/rib/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-17T03:28:52.564503" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:52.563587" elapsed="0.000943"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:28:52.564760" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:28:52.564605" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:52.564585" elapsed="0.000262"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:52.565024" 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-04-17T03:28:52.565203" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:28:52.565271" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:28:52.567333" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:28:52.563033" elapsed="0.004328"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:52.569115" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:52.568799" elapsed="0.000367"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:52.569568" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:52.569323" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:28:52.574866" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:52.776683" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:53.179739" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:53.182894" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:28:52.571835" elapsed="0.615300">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:52.569685" elapsed="0.617609">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:53.187665" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:53.187356" elapsed="0.000406"/>
</branch>
<status status="FAIL" start="2026-04-17T03:28:52.569665" elapsed="0.618131">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:53.188527" elapsed="0.000040"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:53.188731" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:53.188673" elapsed="0.000123"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:53.188646" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:53.189060" elapsed="0.000038"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:28:53.189173" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:28:52.567741" elapsed="0.621596">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:53.189446" 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-04-17T03:28:52.449535" elapsed="0.740052">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:53.190168" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:53.189784" elapsed="0.000496"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:53.189760" elapsed="0.000553"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:53.190361" elapsed="0.000020"/>
</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-04-17T03:28:52.441913" elapsed="0.748593">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:55.254987" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:55.254504" elapsed="0.000520"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:55.255979" 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-04-17T03:28:55.255570" elapsed="0.000504">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-04-17T03:28:55.256203" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:55.255207" elapsed="0.001028"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:55.257007" 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-04-17T03:28:55.256459" elapsed="0.000586"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:55.257448" 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-04-17T03:28:55.257645" 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-04-17T03:28:55.257258" elapsed="0.000414"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:55.258171" 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-04-17T03:28:55.257837" 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-04-17T03:28:55.259347" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:55.259024" elapsed="0.000376"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:55.260044" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:28:55.259612" elapsed="0.000466"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:55.261092" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:55.260539" elapsed="0.000590"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:55.262706" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:55.261958" elapsed="0.000853"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:55.262896" elapsed="0.000058"/>
</return>
<msg time="2026-04-17T03:28:55.263229" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:55.261394" elapsed="0.001863"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:55.263442" elapsed="0.000547"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:28:55.260388" elapsed="0.003655"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:55.265056" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:55.264371" elapsed="0.000772"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:55.266680" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:55.265993" elapsed="0.000789"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:55.266871" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:28:55.267245" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:55.265363" elapsed="0.001911"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:55.267442" elapsed="0.000429"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:28:55.264195" elapsed="0.003721"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:28:55.260149" elapsed="0.007823"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:28:55.268018" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:28:55.268180" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:28:55.258663" elapsed="0.009542"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:55.258306" elapsed="0.009931"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:55.268424" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:55.268266" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:55.258282" elapsed="0.010218"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:55.269313" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:28:55.268648" elapsed="0.000694"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:28:55.269392" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:28:55.253691" elapsed="0.015829"/>
</kw>
<msg time="2026-04-17T03:28:55.269578" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:55.239969" elapsed="0.029662"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:55.283658" elapsed="0.000063"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:28:55.297806" elapsed="0.000044"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/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-04-17T03:28:55.311099" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:55.311551" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:55.311767" 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-04-17T03:28:55.312365" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:55.312203" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:55.312184" 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-04-17T03:28:55.312628" 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-04-17T03:28:55.312834" elapsed="0.000029"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:55.313054" elapsed="0.000028"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:28:55.312137" elapsed="0.000982"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:28:55.311970" elapsed="0.001178"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:55.313330" elapsed="0.000030"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:55.313435" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:28:55.313606" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:28:55.235212" elapsed="0.078424"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:55.315234" 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-04-17T03:28:55.314894" elapsed="0.000420">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-04-17T03:28:55.315412" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:55.314417" elapsed="0.001019"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:55.315841" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:55.315510" elapsed="0.000391"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:55.316458" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:55.316151" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:55.315944" elapsed="0.000577"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:55.315490" elapsed="0.001053"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:55.319374" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:28:55.316726" elapsed="0.002677"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:28:55.319474" elapsed="0.000045"/>
</return>
<msg time="2026-04-17T03:28:55.319701" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:28:55.314037" elapsed="0.005692"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:55.321130" 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-04-17T03:28:55.320839" elapsed="0.000365">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-04-17T03:28:55.321307" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:55.320480" elapsed="0.000858"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:28:55.321584" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-04-17T03:28:55.321423" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:55.321402" 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-04-17T03:28:55.321848" 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-04-17T03:28:55.322046" elapsed="0.000024"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:28:55.322195" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:28:55.324455" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:28:55.320111" elapsed="0.004383"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:55.326112" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:55.325804" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:55.326580" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:55.326318" 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-04-17T03:28:55.332172" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:55.533541" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:55.935973" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:55.938461" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:28:55.329005" elapsed="0.614868">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:55.326697" elapsed="0.617423">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:55.944511" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:55.944188" elapsed="0.000428"/>
</branch>
<status status="FAIL" start="2026-04-17T03:28:55.326676" elapsed="0.617981">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:55.945366" elapsed="0.000042"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:55.945583" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:55.945524" elapsed="0.000129"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:55.945495" elapsed="0.000203"/>
</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-04-17T03:28:55.945952" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:28:55.946062" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:28:55.324885" elapsed="0.621349">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:55.946441" 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-04-17T03:28:55.208225" elapsed="0.738373">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:55.947075" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:55.946764" elapsed="0.000423"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:55.946738" elapsed="0.000485"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:55.947272" elapsed="0.000022"/>
</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-04-17T03:28:55.201138" elapsed="0.746285">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:58.004560" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:58.004149" elapsed="0.000447"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:58.005429" 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-04-17T03:28:58.005137" elapsed="0.000370">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-04-17T03:28:58.005602" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:58.004772" elapsed="0.000855"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:58.006205" 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-04-17T03:28:58.005799" elapsed="0.000434"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:58.006540" 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-04-17T03:28:58.006746" 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-04-17T03:28:58.006397" elapsed="0.000378"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:58.007244" 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-04-17T03:28:58.006955" elapsed="0.000340"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:58.008408" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:58.008095" elapsed="0.000359"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:58.008897" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:28:58.008620" elapsed="0.000331"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:58.009775" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:28:58.009358" elapsed="0.000445"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:58.011122" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:58.010489" elapsed="0.000745"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:58.011316" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:28:58.011705" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:58.010019" 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-04-17T03:28:58.011898" elapsed="0.000410"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:28:58.009215" elapsed="0.003137"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:58.013311" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:58.012613" elapsed="0.000726"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:58.014578" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:58.014024" elapsed="0.000657"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:58.014759" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:28:58.015075" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:58.013539" elapsed="0.001592"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:58.015292" elapsed="0.000376"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:28:58.012474" elapsed="0.003238"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:28:58.009030" elapsed="0.006722"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:28:58.015811" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:28:58.016020" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:28:58.007740" elapsed="0.008310"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:58.007395" elapsed="0.008693"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:58.016306" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:58.016120" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:58.007360" elapsed="0.009034"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:58.017297" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:28:58.016570" elapsed="0.000758"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:28:58.017380" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/shared_tree_join/rib/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:28:58.003502" elapsed="0.014010"/>
</kw>
<msg time="2026-04-17T03:28:58.017571" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:57.990670" elapsed="0.026957"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:58.030244" elapsed="0.000043"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/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-04-17T03:28:58.042871" 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/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-04-17T03:28:58.055131" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:58.055428" 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-04-17T03:28:58.055614" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:58.056038" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:58.055867" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:58.055850" 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-04-17T03:28:58.056274" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:58.056442" 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-04-17T03:28:58.056612" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:28:58.055813" elapsed="0.000851"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:28:58.055696" elapsed="0.000996"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:58.056839" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:58.056916" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:28:58.057090" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:28:57.986271" elapsed="0.070848"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:58.058524" 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-04-17T03:28:58.058230" elapsed="0.000371">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-04-17T03:28:58.058697" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:58.057813" elapsed="0.000909"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:58.059072" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:58.058792" elapsed="0.000368"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:58.059667" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:58.059370" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:58.059184" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:58.058774" elapsed="0.000974"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:58.062266" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:28:58.059899" elapsed="0.002395"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:28:58.062344" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:28:58.062501" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:28:58.057454" elapsed="0.005071"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:58.063800" 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-04-17T03:28:58.063566" elapsed="0.000297">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-04-17T03:28:58.063972" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:58.063226" elapsed="0.000772"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:28:58.064204" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-17T03:28:58.064068" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:58.064050" elapsed="0.000279"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:58.064479" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:58.064652" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:28:58.064717" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:28:58.066623" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:28:58.062835" elapsed="0.003814"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:58.068096" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:28:58.067817" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:58.068573" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:58.068331" 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-04-17T03:28:58.073641" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:58.275123" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:58.678030" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:58.680632" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:28:58.070716" elapsed="0.615511">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:58.068680" elapsed="0.617792">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:58.687241" elapsed="0.000073"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:58.686570" elapsed="0.000853"/>
</branch>
<status status="FAIL" start="2026-04-17T03:28:58.068663" elapsed="0.618820">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:58.688408" elapsed="0.000042"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:58.688613" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:58.688558" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:58.688531" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:58.688950" elapsed="0.000035"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:28:58.689054" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:28:58.066976" elapsed="0.622242">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:58.689406" 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-04-17T03:28:57.963579" elapsed="0.725975">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:58.690329" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:58.689691" elapsed="0.000745"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:58.689666" elapsed="0.000806"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:58.690520" elapsed="0.000020"/>
</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-04-17T03:28:57.955874" elapsed="0.734793">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:28:58.690839" level="FAIL">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-17T03:28:52.434053" elapsed="6.257014">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:28:58.691395" elapsed="0.000042"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:28:58.691718" elapsed="0.000031"/>
</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="NOT RUN" start="2026-04-17T03:28:58.692019" elapsed="0.000032"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:28:58.692271" elapsed="0.000027"/>
</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-04-17T03:28:58.692638" elapsed="0.003192"/>
</kw>
<arg>shared_tree_join</arg>
<arg>${MVPN_DIR}</arg>
<status status="FAIL" start="2026-04-17T03:28:52.424669" elapsed="6.271397">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:52.357903" elapsed="6.338497">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:28:58.702112" elapsed="0.000372"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:28:58.701650" elapsed="0.000923"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:58.704190" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:58.704005" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:58.703970" elapsed="0.000323"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:58.711006" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:58.710840" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:58.710818" elapsed="0.000270"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:58.712286" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:28:58.711808" elapsed="0.000509"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:28:58.712838" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:28:58.712502" elapsed="0.000364"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:28:58.712914" elapsed="0.000056"/>
</return>
<msg time="2026-04-17T03:28:58.713109" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:28:58.711378" elapsed="0.001757"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:58.719705" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:58.719585" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:58.719564" elapsed="0.000216"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:28:58.721098" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:58.720980" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:58.720960" elapsed="0.000212"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:58.721672" level="INFO">${karaf_connection_index} = 30</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:28:58.721342" elapsed="0.000359"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:58.722140" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:28:58.721886" elapsed="0.000281"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:28:58.723046" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:28:58.722726" elapsed="0.001075">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:28:58.724017" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:28:58.724067" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:58.722352" elapsed="0.001740"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:28:58.724939" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:28:58.724662" elapsed="0.000988">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:28:58.725845" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:28:58.725893" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:58.724283" elapsed="0.001635"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:28:58.726919" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_source_tree_join"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:28:58.726273" elapsed="0.000744">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_source_tree_join"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:58.726023" elapsed="0.001070">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_source_tree_join"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:28:58.726002" elapsed="0.001127">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_source_tree_join"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:58.727313" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:58.727564" elapsed="0.000099"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:58.727404" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:58.727386" elapsed="0.000342"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:28:58.727766" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:28:58.730707" elapsed="0.000157"/>
</kw>
<msg time="2026-04-17T03:28:58.730950" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:58.729455" elapsed="0.001677"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:58.731432" elapsed="0.000080"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:58.731794" 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-04-17T03:28:58.728709" elapsed="0.003296"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:28:58.728104" elapsed="0.003970"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:28:58.720631" elapsed="0.011534">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_source_tree_join"</status>
</kw>
<msg time="2026-04-17T03:28:58.732284" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:28:58.732331" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_source_tree_join"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:58.719972" elapsed="0.012384"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:28:58.732551" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:58.732437" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:58.732418" elapsed="0.000204"/>
</if>
<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-04-17T03:28:58.733778" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:58.733665" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:58.733646" elapsed="0.000206"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:58.734181" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:28:58.734294" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:28:58.734043" elapsed="0.000281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:58.734780" level="INFO">{1: 30}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:58.734498" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:58.735293" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:58.735030" elapsed="0.000309"/>
</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-04-17T03:28:58.735942" elapsed="0.000286"/>
</kw>
<msg time="2026-04-17T03:28:58.736334" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:28:58.736383" level="INFO">${old_connection_index} = 30</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:58.735518" elapsed="0.000889"/>
</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-04-17T03:28:58.737368" elapsed="0.000203"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:28:58.738717" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:28:58.738295" elapsed="0.001370">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:58.737761" elapsed="0.002006"/>
</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-04-17T03:28:58.740518" elapsed="0.000290"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:58.739977" elapsed="0.000917"/>
</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-04-17T03:28:58.736732" elapsed="0.004285"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:58.736487" elapsed="0.004586"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:58.736468" elapsed="0.004632"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:58.742207" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:28:58.741853" elapsed="0.000382"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:28:58.742287" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:28:58.742450" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:28:58.741486" elapsed="0.000990"/>
</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-04-17T03:28:58.742652" elapsed="0.000484"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:28:58.743448" level="INFO">index=31
host=10.30.170.120
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-04-17T03:28:58.743555" level="INFO">${karaf_connection_object} = index=31
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:28:58.743332" elapsed="0.000251"/>
</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-04-17T03:28:58.743752" elapsed="0.004200"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:28:58.748443" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:28:58.752882" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:28:58.748139" elapsed="0.005196">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:28:58.772386" elapsed="0.000417"/>
</kw>
<msg time="2026-04-17T03:28:58.772913" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:58.770026" elapsed="0.003070"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:58.773266" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:58.773435" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:28:58.754280" elapsed="0.019241"/>
</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-04-17T03:28:58.753655" elapsed="0.019918"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:28:58.733348" elapsed="0.040317">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:58.774241" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:28:58.774323" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:28:58.719208" elapsed="0.055232">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:28:58.774555" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:28:58.774599" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:58.713565" elapsed="0.061056"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:58.775007" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:58.774705" elapsed="0.000357"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:58.774686" elapsed="0.000402"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:28:58.713398" elapsed="0.061714"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:28:58.713203" elapsed="0.061942"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:28:58.710393" elapsed="0.064812"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:28:58.703552" elapsed="0.071710"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:58.702811" elapsed="0.072498"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:28:58.697894" elapsed="0.077527"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:58.776443" 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-04-17T03:28:58.776645" 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-04-17T03:28:58.776231" elapsed="0.000440"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-17T03:28:58.777118" 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-04-17T03:28:58.776832" elapsed="0.000321"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:58.777541" 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-04-17T03:28:58.777673" 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-04-17T03:28:58.777346" elapsed="0.000353"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-17T03:28:58.778225" 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-04-17T03:28:58.777856" elapsed="0.000395"/>
</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-04-17T03:28:58.778539" elapsed="0.002742"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:58.778322" elapsed="0.003017"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:58.778304" elapsed="0.003073"/>
</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-04-17T03:28:58.831200" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:58.830631" elapsed="0.000613"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:58.832185" 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-04-17T03:28:58.831857" elapsed="0.000412">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-04-17T03:28:58.832369" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:58.831446" elapsed="0.000949"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:58.832996" 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-04-17T03:28:58.832566" elapsed="0.000461"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:58.833349" 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-04-17T03:28:58.833528" 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-04-17T03:28:58.833198" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:58.834010" 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-04-17T03:28:58.833725" elapsed="0.000347"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:58.835358" level="INFO">mapping: {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:58.835050" elapsed="0.000357"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:58.835876" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:28:58.835585" elapsed="0.000319"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:58.836661" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:58.836347" elapsed="0.000341"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:58.837798" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:58.837342" elapsed="0.000484"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:58.837880" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:28:58.838082" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:58.836989" elapsed="0.001120"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:58.838276" elapsed="0.000249"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:28:58.836180" elapsed="0.002388"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:58.839239" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:58.838828" elapsed="0.000446"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:58.840646" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:58.840200" elapsed="0.000474"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:58.840730" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:28:58.840900" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:58.839541" 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-04-17T03:28:58.841105" elapsed="0.000247"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:28:58.838688" elapsed="0.002706"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:28:58.835988" elapsed="0.005449"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:28:58.841498" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:28:58.841698" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:28:58.834571" elapsed="0.007161"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:58.834165" elapsed="0.007611"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:58.842016" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:58.841810" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:58.834138" elapsed="0.007963"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:58.843062" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:28:58.842261" elapsed="0.000837"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:28:58.843150" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/${file_name} exists. 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-04-17T03:28:58.829750" elapsed="0.013533"/>
</kw>
<msg time="2026-04-17T03:28:58.843347" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:58.813462" elapsed="0.029942"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:58.856625" elapsed="0.000066"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:28:58.869782" 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/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-04-17T03:28:58.882851" elapsed="0.000035"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:58.883154" 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-04-17T03:28:58.883351" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:58.883773" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:58.883615" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:58.883596" 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-04-17T03:28:58.884021" 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-04-17T03:28:58.884201" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:58.884371" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:28:58.883557" elapsed="0.000870"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:28:58.883437" elapsed="0.001017"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:58.884605" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:58.884686" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:28:58.884848" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:28:58.808257" elapsed="0.076621"/>
</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-04-17T03:28:58.912548" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:58.912131" elapsed="0.000452"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:58.913392" 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-04-17T03:28:58.913125" elapsed="0.000346">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-04-17T03:28:58.913567" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:58.912761" elapsed="0.000832"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:58.914169" 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-04-17T03:28:58.913759" elapsed="0.000439"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:58.914512" 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-04-17T03:28:58.914693" 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-04-17T03:28:58.914365" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:58.915207" 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-04-17T03:28:58.914885" elapsed="0.000461"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-17T03:28:58.915749" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:58.915426" elapsed="0.000383"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:58.916315" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:58.916008" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:58.915837" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:58.915402" elapsed="0.001001"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:58.917042" 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-04-17T03:28:58.916557" elapsed="0.000518"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:28:58.917129" 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/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-04-17T03:28:58.911466" elapsed="0.005799"/>
</kw>
<msg time="2026-04-17T03:28:58.917326" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:58.897553" elapsed="0.019823"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:28:58.930340" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/${file_name} exists. 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-04-17T03:28:58.943096" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_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-04-17T03:28:58.956559" elapsed="0.000040"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:58.956847" 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-04-17T03:28:58.957117" 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-04-17T03:28:58.957657" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:58.957449" elapsed="0.000285"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:58.957428" elapsed="0.000340"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:58.957988" elapsed="0.000030"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:58.958229" elapsed="0.000029"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:58.958464" elapsed="0.000027"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:28:58.957384" elapsed="0.001151"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:28:58.957234" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:58.958847" elapsed="0.000030"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:58.959039" elapsed="0.000027"/>
</return>
<msg time="2026-04-17T03:28:58.959241" 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-04-17T03:28:58.895192" elapsed="0.064090"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:58.961278" 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-04-17T03:28:58.960840" elapsed="0.000540">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-04-17T03:28:58.961511" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:58.960317" elapsed="0.001227"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:58.962020" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:58.961642" elapsed="0.000459"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:28:58.962804" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:58.962389" elapsed="0.000458"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:58.962136" elapsed="0.000778"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:58.961617" elapsed="0.001399"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:58.965451" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:28:58.963259" elapsed="0.002219"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:28:58.965528" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:28:58.965684" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:28:58.959756" elapsed="0.005953"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:58.967300" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:28:58.967045" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:58.967736" 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-04-17T03:28:58.967499" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:58.968205" 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-04-17T03:28:58.967958" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:58.968642" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:58.968402" elapsed="0.000283"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:28:58.969547" 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-04-17T03:28:58.969343" elapsed="0.000231"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:28:58.969909" 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-04-17T03:28:58.969729" elapsed="0.000222"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:58.970105" elapsed="0.000212"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:58.970772" 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-04-17T03:28:58.970518" elapsed="0.000299"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:28:58.970860" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:28:58.971077" 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-04-17T03:28:58.968888" elapsed="0.002217"/>
</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-04-17T03:28:58.976581" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:59.178173" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:59.581421" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:59.583602" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:28:58.973529" elapsed="0.616209">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:58.971189" elapsed="0.618920">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:28:59.591020" elapsed="0.000088"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:59.590259" elapsed="0.000991"/>
</branch>
<status status="FAIL" start="2026-04-17T03:28:58.971167" elapsed="0.620111">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:28:59.591767" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:59.591916" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:28:59.591875" elapsed="0.000104"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:59.591855" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:59.592154" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:28:59.592220" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>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="FAIL" start="2026-04-17T03:28:58.966053" elapsed="0.626285">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:59.592421" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>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="FAIL" start="2026-04-17T03:28:58.791202" elapsed="0.801319">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:59.592892" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:59.592701" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:59.592683" elapsed="0.000318"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:59.593035" elapsed="0.000015"/>
</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="FAIL" start="2026-04-17T03:28:58.781786" elapsed="0.811351">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:28:59.593329" elapsed="0.000022"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<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="NOT RUN" start="2026-04-17T03:28:59.593561" elapsed="0.000024"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:59.593738" elapsed="0.000020"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations">
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:59.593920" elapsed="0.000037"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:28:59.594123" elapsed="0.000020"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<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="NOT RUN" start="2026-04-17T03:28:59.594351" elapsed="0.000023"/>
</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-04-17T03:28:59.639569" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:28:59.639123" elapsed="0.000482"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:28:59.640560" 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-04-17T03:28:59.640259" elapsed="0.000378">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-04-17T03:28:59.640734" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:28:59.639787" elapsed="0.000972"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:28:59.641396" 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-04-17T03:28:59.640941" elapsed="0.000492"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:28:59.641760" 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-04-17T03:28:59.641944" 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-04-17T03:28:59.641612" elapsed="0.000360"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:59.642383" 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-04-17T03:28:59.642132" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:59.643639" level="INFO">mapping: {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:28:59.643379" elapsed="0.000304"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:28:59.644134" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:28:59.643843" elapsed="0.000316"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:59.645127" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:59.644540" elapsed="0.000614"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:59.646324" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:59.645837" elapsed="0.000528"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:59.646490" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:28:59.646727" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:59.645351" elapsed="0.001403"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:59.646981" elapsed="0.000522"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:28:59.644398" elapsed="0.003148"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:28:59.648364" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:28:59.647802" elapsed="0.000588"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:28:59.649841" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:28:59.649091" elapsed="0.000793"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:28:59.650022" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:28:59.650334" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:28:59.648583" elapsed="0.001782"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:28:59.650579" elapsed="0.000616"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:28:59.647666" elapsed="0.003574"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:28:59.644216" elapsed="0.007061"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:28:59.651323" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:28:59.651489" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:28:59.642942" elapsed="0.008573"/>
</kw>
<status status="PASS" start="2026-04-17T03:28:59.642513" elapsed="0.009035"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:59.651738" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:59.651577" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-17T03:28:59.642488" elapsed="0.009326"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:28:59.652789" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:28:59.652041" elapsed="0.000777"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:28:59.652868" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/app/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:28:59.638315" elapsed="0.014702"/>
</kw>
<msg time="2026-04-17T03:28:59.653078" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:28:59.625152" elapsed="0.027995"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:28:59.666291" elapsed="0.000059"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:28:59.679730" elapsed="0.000139"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</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-04-17T03:28:59.693865" elapsed="0.000053"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:59.694192" 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-04-17T03:28:59.694416" 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-04-17T03:28:59.694917" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:28:59.694718" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:28:59.694699" 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-04-17T03:28:59.695190" 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-04-17T03:28:59.695424" elapsed="0.000054"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:59.695692" elapsed="0.000025"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:28:59.694658" elapsed="0.001096"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:28:59.694523" elapsed="0.001261"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:28:59.695959" elapsed="0.000024"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:28:59.696046" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:28:59.696207" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:28:59.620611" elapsed="0.075626"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:28:59.697778" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:28:59.697363" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:28:59.704378" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:59.906173" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:00.308779" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:00.311658" level="INFO">${response} = None</msg>
<msg time="2026-04-17T03:29:00.311768" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:28:59.700868" elapsed="0.616467">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:59.697963" elapsed="0.619584">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:00.318108" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:00.317637" elapsed="0.000620"/>
</branch>
<status status="FAIL" start="2026-04-17T03:28:59.697919" elapsed="0.620392">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:00.322767" 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-04-17T03:29:00.320340" elapsed="0.002486">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:00.320098" elapsed="0.002814">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:29:00.320077" elapsed="0.002893">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-04-17T03:29:00.325640" 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-04-17T03:29:00.323293" elapsed="0.002383">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:00.323047" elapsed="0.002696">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:29:00.323029" elapsed="0.002747">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:00.326440" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:29:00.326006" elapsed="0.000463"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:00.326836" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:00.326542" elapsed="0.000358"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:00.327431" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:00.327118" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:00.326941" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:00.326524" elapsed="0.000996"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:00.328073" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:29:00.327684" elapsed="0.000417"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:00.328417" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:00.328171" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:00.328987" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:00.328664" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:00.328499" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:00.328152" elapsed="0.000919"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:00.329226" elapsed="0.000358"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-17T03:29:00.330079" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:29:00.329755" elapsed="0.000350"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-04-17T03:29:00.332754" 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-04-17T03:29:00.330270" elapsed="0.002532">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-04-17T03:29:00.319551" elapsed="0.013533">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-04-17T03:29:00.333179" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:29:00.335948" level="INFO">${response_text} = None</msg>
<msg time="2026-04-17T03:29:00.335991" 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-04-17T03:28:59.696538" elapsed="0.639484">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-04-17T03:29:00.336093" elapsed="0.000027"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="FAIL" start="2026-04-17T03:28:59.595628" elapsed="0.740642">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:28:59.595126" elapsed="0.741210"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-04-17T03:28:59.594627" elapsed="0.741772"/>
</kw>
<arg>source_tree_join</arg>
<arg>${MVPN_DIR}</arg>
<status status="FAIL" start="2026-04-17T03:28:58.775762" elapsed="1.560711">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:28:58.696845" elapsed="1.639798">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:29:00.339807" elapsed="0.000254"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:29:00.339533" elapsed="0.000583"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:00.341165" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:00.341044" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:00.341023" elapsed="0.000214"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:00.346189" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:00.346084" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:00.346066" elapsed="0.000189"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:00.347344" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:29:00.346903" elapsed="0.000472"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:29:00.347834" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:29:00.347539" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:29:00.347903" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:29:00.348075" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:29:00.346487" elapsed="0.001612"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:00.353819" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:00.353697" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:00.353673" 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-04-17T03:29:00.355199" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:00.355093" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:00.355076" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:00.355715" level="INFO">${karaf_connection_index} = 31</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:29:00.355415" elapsed="0.000326"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:00.356199" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:29:00.355973" elapsed="0.000252"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:29:00.357013" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:29:00.356729" elapsed="0.000971">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:29:00.357895" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:29:00.357958" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:00.356390" elapsed="0.001593"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:29:00.358740" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:29:00.358497" elapsed="0.000956">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:29:00.359638" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:29:00.359683" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:00.358154" elapsed="0.001552"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:29:00.360658" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_source_tree_join"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:29:00.360023" elapsed="0.000697">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_source_tree_join"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:00.359779" elapsed="0.001010">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_source_tree_join"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:29:00.359761" elapsed="0.001064">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_source_tree_join"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:00.361009" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:00.361237" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:00.361095" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:00.361079" elapsed="0.000233"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:29:00.361343" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:29:00.364110" elapsed="0.000146"/>
</kw>
<msg time="2026-04-17T03:29:00.364323" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:00.363035" 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-04-17T03:29:00.364726" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:00.365085" 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-04-17T03:29:00.362328" elapsed="0.002940"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:29:00.361647" elapsed="0.003684"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:29:00.354715" elapsed="0.010702">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_source_tree_join"</status>
</kw>
<msg time="2026-04-17T03:29:00.365518" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:29:00.365561" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_source_tree_join"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:00.354090" elapsed="0.011494"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:29:00.365773" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:00.365659" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:00.365641" elapsed="0.000196"/>
</if>
<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-04-17T03:29:00.367046" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:00.366881" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:00.366864" elapsed="0.000249"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:00.367390" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:29:00.367542" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:29:00.367267" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:00.368005" level="INFO">{1: 31}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:00.367727" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:00.368448" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:00.368205" elapsed="0.000286"/>
</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-04-17T03:29:00.369033" elapsed="0.000271"/>
</kw>
<msg time="2026-04-17T03:29:00.369402" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:29:00.369449" level="INFO">${old_connection_index} = 31</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:00.368651" elapsed="0.000820"/>
</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-04-17T03:29:00.370368" elapsed="0.000193"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:29:00.371706" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:29:00.371296" elapsed="0.001346">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:00.370755" elapsed="0.002009"/>
</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-04-17T03:29:00.373447" elapsed="0.000275"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:00.372976" elapsed="0.000831"/>
</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-04-17T03:29:00.369767" elapsed="0.004085"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:00.369545" elapsed="0.004355"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:00.369527" elapsed="0.004414"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:00.375104" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:29:00.374600" elapsed="0.000541"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:29:00.375207" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:29:00.375411" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:29:00.374156" elapsed="0.001289"/>
</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-04-17T03:29:00.375615" elapsed="0.000531"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:00.376444" level="INFO">index=32
host=10.30.170.120
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-04-17T03:29:00.376544" level="INFO">${karaf_connection_object} = index=32
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:29:00.376329" elapsed="0.000241"/>
</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-04-17T03:29:00.376722" elapsed="0.002611"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:29:00.379778" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:29:00.381170" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:29:00.379511" elapsed="0.002066">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:29:00.395451" elapsed="0.000402"/>
</kw>
<msg time="2026-04-17T03:29:00.395963" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:00.394074" elapsed="0.002044"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:00.396283" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:00.396451" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:29:00.382443" elapsed="0.014090"/>
</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-04-17T03:29:00.381882" elapsed="0.014749"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:29:00.366546" elapsed="0.030174">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:00.397328" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:29:00.397406" 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="FAIL" start="2026-04-17T03:29:00.353310" elapsed="0.044206">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:29:00.397628" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:29:00.397673" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:00.348484" elapsed="0.049219"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:00.398063" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:00.397785" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:00.397766" elapsed="0.000377"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:29:00.348334" elapsed="0.049833"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:29:00.348158" elapsed="0.050042"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:29:00.345707" elapsed="0.052551"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:29:00.340721" elapsed="0.057595"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:00.340269" elapsed="0.058094"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:29:00.337364" elapsed="0.061053"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:00.399656" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:00.399123" elapsed="0.000561"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:00.400417" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:00.399853" elapsed="0.000599"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:00.401266" 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-04-17T03:29:00.400649" elapsed="0.000644"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:00.401663" 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-04-17T03:29:00.401821" 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-04-17T03:29:00.401457" elapsed="0.000390"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:00.402208" 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-04-17T03:29:00.402327" 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-04-17T03:29:00.402018" elapsed="0.000335"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-04-17T03:29:00.402505" elapsed="0.002980"/>
</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-04-17T03:29:00.405739" elapsed="0.001952"/>
</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-04-17T03:29:00.463170" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:00.462733" elapsed="0.000471"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:00.464019" 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-04-17T03:29:00.463715" elapsed="0.000388">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-04-17T03:29:00.464203" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:00.463375" elapsed="0.000852"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:00.464791" 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-04-17T03:29:00.464396" elapsed="0.000422"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:00.465147" 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-04-17T03:29:00.465311" 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-04-17T03:29:00.465001" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:00.465753" 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-04-17T03:29:00.465500" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:00.466948" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:00.466558" elapsed="0.000440"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:00.467599" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:29:00.467206" elapsed="0.000426"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:00.468495" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:00.468033" elapsed="0.000488"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:00.469877" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:00.469271" elapsed="0.000748"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:00.470121" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:29:00.470471" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:00.468717" elapsed="0.001782"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:00.470690" elapsed="0.000514"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:29:00.467873" elapsed="0.003390"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:00.472244" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:29:00.471643" elapsed="0.000629"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:00.473802" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:29:00.473225" elapsed="0.000680"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:00.474018" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:29:00.474322" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:29:00.472714" elapsed="0.001634"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:00.474515" elapsed="0.000457"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:29:00.471435" elapsed="0.003595"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:29:00.467690" elapsed="0.007389"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:29:00.475132" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:29:00.475299" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:29:00.466221" elapsed="0.009104"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:00.465876" elapsed="0.009481"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:00.475604" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:00.475442" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:00.465853" elapsed="0.009859"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:00.476528" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:29:00.475875" elapsed="0.000683"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:29:00.476607" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:29:00.461809" elapsed="0.014923"/>
</kw>
<msg time="2026-04-17T03:29:00.476787" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:00.449239" elapsed="0.027601"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:29:00.489939" 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/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-04-17T03:29:00.503004" elapsed="0.000038"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/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-04-17T03:29:00.515720" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:00.515973" 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-04-17T03:29:00.516159" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:00.516574" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:00.516419" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:00.516402" 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-04-17T03:29:00.516801" 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-04-17T03:29:00.516985" 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-04-17T03:29:00.517153" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:29:00.516364" elapsed="0.000841"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:29:00.516245" elapsed="0.000987"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:00.517379" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:00.517456" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:29:00.517611" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:29:00.444992" elapsed="0.072711"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:00.519193" 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-04-17T03:29:00.518843" elapsed="0.000428">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-04-17T03:29:00.519366" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:00.518432" elapsed="0.000958"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:00.519723" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:00.519460" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:00.520312" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:00.520008" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:00.519805" elapsed="0.000568"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:00.519442" elapsed="0.000954"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:00.523083" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:29:00.520601" elapsed="0.002510"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:29:00.523165" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:29:00.523346" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:29:00.518070" elapsed="0.005302"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:00.524626" 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-04-17T03:29:00.524383" elapsed="0.000309">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-04-17T03:29:00.524787" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:00.524035" elapsed="0.000777"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:29:00.525033" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:29:00.524880" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:00.524863" elapsed="0.000255"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:00.525267" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:00.525442" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:29:00.525513" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:29:00.527881" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:29:00.523684" elapsed="0.004230"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:00.529479" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:00.529214" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:00.529983" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:00.529709" elapsed="0.000319"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:29:00.535230" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:00.736809" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:01.139153" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:01.141840" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:29:00.532179" elapsed="0.615072">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:00.530095" elapsed="0.617379">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:01.148032" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:01.147565" elapsed="0.000625"/>
</branch>
<status status="FAIL" start="2026-04-17T03:29:00.530076" elapsed="0.618170">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:01.149188" elapsed="0.000059"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:01.149533" elapsed="0.000045"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:01.149435" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:01.149386" elapsed="0.000342"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:01.150118" elapsed="0.000064"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:29:01.150322" elapsed="0.000042"/>
</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-04-17T03:29:00.528303" elapsed="0.622280">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:01.150842" elapsed="0.000038"/>
</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-04-17T03:29:00.422373" elapsed="0.728734">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:01.151530" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:01.151320" elapsed="0.000285"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:01.151293" elapsed="0.000337"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:01.151664" elapsed="0.000015"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-04-17T03:29:00.416213" elapsed="0.735556">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:03.214715" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:03.214153" elapsed="0.000606"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:03.215679" 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-04-17T03:29:03.215394" elapsed="0.000368">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-04-17T03:29:03.215878" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:03.215021" elapsed="0.000884"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:03.216490" 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-04-17T03:29:03.216094" elapsed="0.000423"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:03.216826" 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-04-17T03:29:03.217026" 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-04-17T03:29:03.216681" elapsed="0.000371"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:03.217479" 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-04-17T03:29:03.217228" 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-04-17T03:29:03.218712" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:03.218326" elapsed="0.000439"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:03.219283" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:29:03.218953" elapsed="0.000362"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:03.220192" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:03.219699" elapsed="0.000520"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:03.221500" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:03.220896" elapsed="0.000706"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:03.221685" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:29:03.222042" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:03.220417" elapsed="0.001653"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:03.222231" elapsed="0.000421"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:29:03.219558" elapsed="0.003144"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:03.223628" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:29:03.222999" elapsed="0.000656"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:03.224912" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:29:03.224340" elapsed="0.000693"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:03.225110" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:29:03.225403" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:29:03.223852" elapsed="0.001576"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:03.225643" elapsed="0.000411"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:29:03.222840" elapsed="0.003269"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:29:03.219378" elapsed="0.006779"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:29:03.226217" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:29:03.226434" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:29:03.217987" elapsed="0.008483"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:03.217608" elapsed="0.008908"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:03.226833" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:03.226556" elapsed="0.000344"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:03.217582" elapsed="0.009340"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:03.227785" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:29:03.227095" elapsed="0.000731"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:29:03.227882" 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-04-17T03:29:03.213346" elapsed="0.014705"/>
</kw>
<msg time="2026-04-17T03:29:03.228112" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:03.196186" elapsed="0.031981"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:29:03.240965" elapsed="0.000048"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/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-04-17T03:29:03.254333" 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/rib.vanadium/${file_name} exists. 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-04-17T03:29:03.267033" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:03.267274" 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-04-17T03:29:03.267460" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:03.267879" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:03.267725" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:03.267707" 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-04-17T03:29:03.268127" 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-04-17T03:29:03.268296" 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-04-17T03:29:03.268547" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:29:03.267667" elapsed="0.000943"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:29:03.267545" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:03.268838" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:03.268920" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:29:03.269097" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:29:03.191580" elapsed="0.077546"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:03.270542" 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-04-17T03:29:03.270249" elapsed="0.000385">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-04-17T03:29:03.270730" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:03.269827" elapsed="0.000928"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:03.271107" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:03.270825" elapsed="0.000340"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:03.271677" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:03.271380" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:03.271190" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:03.270807" elapsed="0.000951"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:03.274324" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:29:03.271910" elapsed="0.002441"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:29:03.274402" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:29:03.274561" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:29:03.269468" elapsed="0.005118"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:03.275839" 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-04-17T03:29:03.275602" elapsed="0.000302">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-04-17T03:29:03.276015" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:03.275262" elapsed="0.000777"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:29:03.276244" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:29:03.276109" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:03.276091" elapsed="0.000237"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:03.276476" 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-04-17T03:29:03.276648" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:29:03.276712" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:29:03.278646" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:29:03.274914" elapsed="0.003759"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:03.280118" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:03.279840" elapsed="0.000383"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:03.280626" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:03.280380" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:29:03.285959" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:03.487521" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:03.890227" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:03.892902" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:29:03.282839" elapsed="0.615503">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:03.280737" elapsed="0.617828">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:03.899205" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:03.898712" elapsed="0.000636"/>
</branch>
<status status="FAIL" start="2026-04-17T03:29:03.280718" elapsed="0.618682">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:03.900321" elapsed="0.000059"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:03.900626" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:03.900541" elapsed="0.000183"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:03.900498" elapsed="0.000268"/>
</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-04-17T03:29:03.901108" elapsed="0.000047"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:29:03.901251" elapsed="0.000031"/>
</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-04-17T03:29:03.279004" elapsed="0.622416">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:03.901501" 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-04-17T03:29:03.168044" elapsed="0.733567">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:03.902077" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:03.901818" elapsed="0.000337"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:03.901793" elapsed="0.000387"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:03.902213" elapsed="0.000015"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-04-17T03:29:03.160106" elapsed="0.742213">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:05.970661" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:05.970211" elapsed="0.000489"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:05.971581" 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-04-17T03:29:05.971303" elapsed="0.000357">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-04-17T03:29:05.971760" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:05.970881" elapsed="0.000906"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:05.972384" 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-04-17T03:29:05.971976" elapsed="0.000437"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:05.972730" 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-04-17T03:29:05.972899" 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-04-17T03:29:05.972582" elapsed="0.000361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:05.973364" 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-04-17T03:29:05.973107" 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-04-17T03:29:05.974610" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:05.974243" elapsed="0.000436"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:05.975192" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:29:05.974856" elapsed="0.000373"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:05.976113" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:05.975628" elapsed="0.000513"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:05.977790" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:05.977046" elapsed="0.000898"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:05.978048" elapsed="0.000048"/>
</return>
<msg time="2026-04-17T03:29:05.978421" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:05.976400" elapsed="0.002054"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:05.978654" elapsed="0.000482"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:29:05.975484" elapsed="0.003709"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:05.980153" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:29:05.979475" elapsed="0.000760"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:05.981478" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:29:05.980897" elapsed="0.000685"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:05.981660" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:29:05.981974" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:29:05.980436" elapsed="0.001572"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:05.982200" elapsed="0.000401"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:29:05.979333" elapsed="0.003313"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:29:05.975299" elapsed="0.007383"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:29:05.982725" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:29:05.982889" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:29:05.973892" elapsed="0.009022"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:05.973537" elapsed="0.009427"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:05.983153" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:05.982991" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:05.973505" elapsed="0.009757"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:05.984066" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:29:05.983430" elapsed="0.000667"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:29:05.984147" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:29:05.969512" elapsed="0.014765"/>
</kw>
<msg time="2026-04-17T03:29:05.984333" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:05.953359" elapsed="0.031025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:29:05.997853" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_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-04-17T03:29:06.010268" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/source_tree_join/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:06.022599" elapsed="0.000035"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:06.022822" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:06.023015" 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-04-17T03:29:06.023442" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:06.023294" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:06.023278" 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-04-17T03:29:06.023662" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:06.023829" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:06.024009" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:29:06.023248" elapsed="0.000816"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:29:06.023143" elapsed="0.000946"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:06.024236" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:06.024311" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:29:06.024445" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:29:05.948640" elapsed="0.075832"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:06.025773" 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-04-17T03:29:06.025513" elapsed="0.000333">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-04-17T03:29:06.025954" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:06.025156" elapsed="0.000824"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:06.026301" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:06.026050" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:06.026896" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:06.026586" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:06.026381" elapsed="0.000593"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:06.026032" elapsed="0.000964"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:06.029504" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:29:06.027149" elapsed="0.002382"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:29:06.029583" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:29:06.029737" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:29:06.024804" elapsed="0.004957"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:06.031286" 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-04-17T03:29:06.031029" elapsed="0.000321">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-04-17T03:29:06.031445" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:06.030408" elapsed="0.001061"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:29:06.031672" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-17T03:29:06.031537" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:06.031520" elapsed="0.000234"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:06.031901" elapsed="0.000039"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:06.032093" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:29:06.032206" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:29:06.034114" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:29:06.030082" elapsed="0.004059"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:06.035579" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:06.035318" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:06.036037" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:06.035778" 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-04-17T03:29:06.041051" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:06.242645" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:06.645325" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:06.647802" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:29:06.038201" elapsed="0.613204">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:06.036146" elapsed="0.615422">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:06.651988" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:06.651633" elapsed="0.000472"/>
</branch>
<status status="FAIL" start="2026-04-17T03:29:06.036128" elapsed="0.616016">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:06.652794" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:06.653038" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:06.652973" elapsed="0.000134"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:06.652917" elapsed="0.000221"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:06.653361" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:29:06.653466" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:29:06.034460" elapsed="0.619172">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:06.653813" 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-04-17T03:29:05.920107" elapsed="0.733884">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:06.654809" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:06.654140" elapsed="0.000830"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:06.654115" elapsed="0.000898"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:06.655064" elapsed="0.000022"/>
</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-04-17T03:29:05.911627" elapsed="0.743646">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:29:06.655456" level="FAIL">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-17T03:29:00.407977" elapsed="6.247632">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:29:06.655915" elapsed="0.000083"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:29:06.656342" elapsed="0.000041"/>
</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="NOT RUN" start="2026-04-17T03:29:06.656703" elapsed="0.000038"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:29:06.657046" elapsed="0.000037"/>
</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-04-17T03:29:06.657485" elapsed="0.003312"/>
</kw>
<arg>source_tree_join</arg>
<arg>${MVPN_DIR}</arg>
<status status="FAIL" start="2026-04-17T03:29:00.398678" elapsed="6.262229">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:00.336882" elapsed="6.324266">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:29:06.664529" elapsed="0.000251"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:29:06.664246" elapsed="0.000592"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:06.666065" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:06.665835" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:06.665807" elapsed="0.000339"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:06.672975" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:06.672774" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:06.672747" elapsed="0.000330"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:06.674738" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:29:06.674041" elapsed="0.000738"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:29:06.675515" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:29:06.675079" elapsed="0.000463"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:29:06.675588" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:29:06.675749" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:29:06.673423" elapsed="0.002351"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:06.681804" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:06.681683" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:06.681661" 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-04-17T03:29:06.683360" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:06.683246" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:06.683227" elapsed="0.000204"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:06.683953" level="INFO">${karaf_connection_index} = 32</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:29:06.683597" elapsed="0.000386"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:06.684482" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:29:06.684185" elapsed="0.000330"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:29:06.685538" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:29:06.685185" elapsed="0.001175">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:29:06.686569" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:29:06.686668" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:06.684715" elapsed="0.001978"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:29:06.687536" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:29:06.687283" elapsed="0.001169">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:29:06.688831" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:29:06.688897" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:06.686867" elapsed="0.002082"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:29:06.690147" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_intra_pe_distinguisher"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:29:06.689352" elapsed="0.000880">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_intra_pe_distinguisher"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:06.689055" elapsed="0.001275">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_intra_pe_distinguisher"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:29:06.689028" elapsed="0.001344">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_intra_pe_distinguisher"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:06.690629" elapsed="0.000031"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:06.690965" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:06.690746" elapsed="0.000296"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:06.690725" elapsed="0.000348"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:29:06.691120" elapsed="0.000022"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:29:06.694642" elapsed="0.000201"/>
</kw>
<msg time="2026-04-17T03:29:06.694954" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:06.693188" elapsed="0.001947"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:06.695525" elapsed="0.000101"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:06.696074" 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-04-17T03:29:06.692297" elapsed="0.004022"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:29:06.691522" elapsed="0.004887"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:29:06.682858" elapsed="0.013666">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_intra_pe_distinguisher"</status>
</kw>
<msg time="2026-04-17T03:29:06.696665" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:29:06.696725" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_intra_pe_distinguisher"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:06.682138" elapsed="0.014618"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:29:06.697080" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:06.696860" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:06.696835" elapsed="0.000336"/>
</if>
<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-04-17T03:29:06.698551" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:06.698407" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:06.698383" elapsed="0.000327"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:06.699167" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:29:06.699306" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:29:06.698989" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:06.699952" level="INFO">{1: 32}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:06.699558" elapsed="0.000460"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:06.700563" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:06.700234" elapsed="0.000390"/>
</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-04-17T03:29:06.701512" elapsed="0.000355"/>
</kw>
<msg time="2026-04-17T03:29:06.702024" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:29:06.702088" level="INFO">${old_connection_index} = 32</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:06.700847" elapsed="0.001272"/>
</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-04-17T03:29:06.703317" elapsed="0.000263"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:29:06.705110" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:29:06.704510" elapsed="0.001666">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:06.703813" elapsed="0.002467"/>
</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-04-17T03:29:06.707019" elapsed="0.000285"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:06.706461" elapsed="0.000929"/>
</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-04-17T03:29:06.702531" elapsed="0.004907"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:06.702222" elapsed="0.005264"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:06.702198" elapsed="0.005313"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:06.708486" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:29:06.708142" elapsed="0.000380"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:29:06.708590" elapsed="0.000047"/>
</return>
<msg time="2026-04-17T03:29:06.708808" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:29:06.707741" elapsed="0.001408"/>
</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-04-17T03:29:06.709563" elapsed="0.001101"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:06.711451" level="INFO">index=33
host=10.30.170.120
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-04-17T03:29:06.711690" level="INFO">${karaf_connection_object} = index=33
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:29:06.711147" elapsed="0.000616"/>
</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-04-17T03:29:06.712244" elapsed="0.007663"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:29:06.720393" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:29:06.721743" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:29:06.720104" elapsed="0.002190">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:29:06.736590" elapsed="0.000432"/>
</kw>
<msg time="2026-04-17T03:29:06.737125" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:06.735176" elapsed="0.002112"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:06.737464" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:06.737635" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:29:06.723353" elapsed="0.014368"/>
</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-04-17T03:29:06.722695" elapsed="0.015075"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:29:06.698008" elapsed="0.039854">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:06.738414" elapsed="0.000030"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:29:06.738498" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:29:06.681294" elapsed="0.057342">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:29:06.738755" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:29:06.738800" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:06.676183" elapsed="0.062641"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:06.739393" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:06.738912" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:06.738891" elapsed="0.000589"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:29:06.676035" elapsed="0.063470"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:29:06.675831" elapsed="0.063708"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:29:06.672227" elapsed="0.067371"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:29:06.665503" elapsed="0.074154"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:06.665035" elapsed="0.074667"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:29:06.661848" elapsed="0.077907"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:06.740728" 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-04-17T03:29:06.740975" 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-04-17T03:29:06.740516" elapsed="0.000488"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-17T03:29:06.741394" 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-04-17T03:29:06.741169" elapsed="0.000253"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:06.741781" 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-04-17T03:29:06.741909" 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-04-17T03:29:06.741581" elapsed="0.000377"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-17T03:29:06.742352" 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-04-17T03:29:06.742141" elapsed="0.000239"/>
</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-04-17T03:29:06.742725" elapsed="0.002792"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:06.742453" elapsed="0.003101"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:06.742435" elapsed="0.003145"/>
</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-04-17T03:29:06.780075" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:06.779624" elapsed="0.000486"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:06.780966" 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-04-17T03:29:06.780650" elapsed="0.000394">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-04-17T03:29:06.781142" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:06.780293" elapsed="0.000874"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:06.781729" 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-04-17T03:29:06.781338" elapsed="0.000418"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:06.782083" 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-04-17T03:29:06.782254" 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-04-17T03:29:06.781920" elapsed="0.000360"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:06.782706" 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-04-17T03:29:06.782442" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:06.783817" level="INFO">mapping: {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:06.783557" elapsed="0.000306"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:06.784316" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:29:06.784043" elapsed="0.000299"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:06.785029" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:29:06.784709" elapsed="0.000346"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:06.786078" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:29:06.785576" elapsed="0.000530"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:06.786160" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:29:06.786326" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:29:06.785248" elapsed="0.001162"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:06.786575" elapsed="0.000291"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:29:06.784571" elapsed="0.002338"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:06.787485" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:29:06.787181" elapsed="0.000330"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:06.788672" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:29:06.788256" elapsed="0.000443"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:06.788750" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:29:06.788904" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:29:06.787703" 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-04-17T03:29:06.789106" elapsed="0.000228"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:29:06.787043" elapsed="0.002331"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:29:06.784395" elapsed="0.005014"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:29:06.789453" elapsed="0.000027"/>
</return>
<msg time="2026-04-17T03:29:06.789611" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:29:06.783218" elapsed="0.006420"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:06.782834" elapsed="0.006835"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:06.789850" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:06.789697" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:06.782809" elapsed="0.007134"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:06.790770" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:29:06.790117" elapsed="0.000682"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:29:06.790848" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:29:06.778879" elapsed="0.012130"/>
</kw>
<msg time="2026-04-17T03:29:06.791067" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:06.766126" elapsed="0.024994"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:29:06.803878" 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-04-17T03:29:06.816534" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_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-04-17T03:29:06.828840" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:06.829134" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:06.829316" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:06.829710" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:06.829557" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:06.829541" 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-04-17T03:29:06.829950" 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-04-17T03:29:06.830148" 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-04-17T03:29:06.830333" elapsed="0.000026"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:29:06.829507" elapsed="0.000895"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:29:06.829399" elapsed="0.001038"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:06.830621" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:06.830702" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:29:06.830852" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:29:06.761855" elapsed="0.069026"/>
</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-04-17T03:29:06.857980" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:06.857457" elapsed="0.000564"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:06.859055" 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-04-17T03:29:06.858711" elapsed="0.000442">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-04-17T03:29:06.859278" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:06.858247" elapsed="0.001062"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:06.860037" 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-04-17T03:29:06.859528" elapsed="0.000544"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:06.860487" 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-04-17T03:29:06.860712" 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-04-17T03:29:06.860291" elapsed="0.000461"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:06.861320" 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-04-17T03:29:06.860989" elapsed="0.000487"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-17T03:29:06.862037" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:06.861561" elapsed="0.000558"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:06.862810" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:06.862353" elapsed="0.000495"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:06.862156" elapsed="0.000740"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:06.861535" elapsed="0.001411"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:06.863771" 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-04-17T03:29:06.863163" elapsed="0.000640"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:29:06.863857" 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/app.vanadium/${file_name} exists. If 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-04-17T03:29:06.856629" elapsed="0.007390"/>
</kw>
<msg time="2026-04-17T03:29:06.864084" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:06.841883" elapsed="0.022253"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:29:06.878283" 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/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-04-17T03:29:06.891603" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_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-04-17T03:29:06.904144" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:06.904378" 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-04-17T03:29:06.904560" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:06.905118" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:06.904963" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:06.904945" 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-04-17T03:29:06.905345" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:06.905513" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:06.905760" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:29:06.904896" elapsed="0.000915"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:29:06.904784" elapsed="0.001153"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:06.906110" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:06.906190" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:29:06.906342" 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-04-17T03:29:06.840963" elapsed="0.065409"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:06.907839" 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-04-17T03:29:06.907551" elapsed="0.000364">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-04-17T03:29:06.908028" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:06.907165" elapsed="0.000888"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:06.908380" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:06.908123" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:06.908963" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:06.908649" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:06.908461" elapsed="0.000564"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:06.908105" elapsed="0.000941"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:06.911471" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:29:06.909199" elapsed="0.002309"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:29:06.911579" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:29:06.911749" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:29:06.906788" elapsed="0.004986"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:06.913418" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:29:06.913154" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:06.913889" 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-04-17T03:29:06.913625" elapsed="0.000370"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:06.914418" 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-04-17T03:29:06.914166" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:06.914885" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:06.914641" elapsed="0.000303"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:06.915861" 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-04-17T03:29:06.915657" elapsed="0.000231"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:29:06.916354" 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-04-17T03:29:06.916114" elapsed="0.000271"/>
</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-04-17T03:29:06.916545" elapsed="0.000216"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:06.917191" 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-04-17T03:29:06.916920" elapsed="0.000315"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:29:06.917277" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:29:06.917471" 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-04-17T03:29:06.915214" elapsed="0.002294"/>
</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-04-17T03:29:06.922859" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:07.124386" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:07.527574" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:07.530566" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:29:06.919886" elapsed="0.616845">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:06.917588" elapsed="0.619296">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:29:07.537304" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:07.536966" elapsed="0.000465"/>
</branch>
<status status="FAIL" start="2026-04-17T03:29:06.917570" elapsed="0.619907">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:29:07.538175" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:07.538385" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:07.538328" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:07.538302" 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-04-17T03:29:07.538774" elapsed="0.000035"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:29:07.538878" elapsed="0.000029"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>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="FAIL" start="2026-04-17T03:29:06.912125" elapsed="0.626970">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:07.539290" elapsed="0.000024"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>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="FAIL" start="2026-04-17T03:29:06.750765" elapsed="0.788673">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:07.539784" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:07.539574" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:07.539557" elapsed="0.000321"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:07.539911" elapsed="0.000015"/>
</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="FAIL" start="2026-04-17T03:29:06.745862" elapsed="0.794170">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:29:07.540230" elapsed="0.000023"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<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="NOT RUN" start="2026-04-17T03:29:07.540473" elapsed="0.000027"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:07.540661" elapsed="0.000022"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations">
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:07.540849" elapsed="0.000023"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:29:07.541048" elapsed="0.000022"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<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="NOT RUN" start="2026-04-17T03:29:07.541272" elapsed="0.000023"/>
</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-04-17T03:29:07.589200" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:07.588757" elapsed="0.000479"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:07.590081" 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-04-17T03:29:07.589782" elapsed="0.000375">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-04-17T03:29:07.590256" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:07.589418" elapsed="0.000862"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:07.590962" 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-04-17T03:29:07.590460" elapsed="0.000535"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:07.591322" 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-04-17T03:29:07.591491" 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-04-17T03:29:07.591171" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:07.592001" 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-04-17T03:29:07.591699" elapsed="0.000426"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:07.593272" level="INFO">mapping: {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:07.592992" elapsed="0.000326"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:07.593764" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:29:07.593483" elapsed="0.000308"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:07.594773" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:29:07.594192" elapsed="0.000608"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:07.596020" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:29:07.595530" elapsed="0.000537"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:07.596193" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:29:07.596430" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:29:07.595024" 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-04-17T03:29:07.596628" elapsed="0.000542"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:29:07.594050" elapsed="0.003163"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:07.598012" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:29:07.597472" elapsed="0.000568"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:07.599431" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:29:07.598780" elapsed="0.000695"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:07.599595" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:29:07.599819" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:29:07.598237" elapsed="0.001607"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:07.600033" elapsed="0.000494"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:29:07.597333" elapsed="0.003238"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:29:07.593844" elapsed="0.006761"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:29:07.600650" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:29:07.600810" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:29:07.592569" elapsed="0.008266"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:07.592211" elapsed="0.008656"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:07.601075" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:07.600895" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:07.592184" elapsed="0.008971"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:07.601916" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:29:07.601305" elapsed="0.000657"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:29:07.602012" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:29:07.588023" elapsed="0.014116"/>
</kw>
<msg time="2026-04-17T03:29:07.602196" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:07.573619" elapsed="0.028641"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:29:07.614965" 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_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-04-17T03:29:07.627574" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/app.vanadium/${file_name} exists. If 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-04-17T03:29:07.640057" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:07.640280" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:07.640463" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:07.640874" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:07.640716" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:07.640698" 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-04-17T03:29:07.641122" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:07.641294" 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-04-17T03:29:07.641462" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:29:07.640660" elapsed="0.000855"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:29:07.640547" elapsed="0.000994"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:07.641690" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:07.641767" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:29:07.641920" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:29:07.568716" elapsed="0.073249"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:07.643253" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:29:07.642958" elapsed="0.000346"/>
</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-04-17T03:29:07.648202" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:07.849780" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:08.252511" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:08.254600" level="INFO">${response} = None</msg>
<msg time="2026-04-17T03:29:08.254693" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:07.645447" elapsed="0.611949">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:07.643370" elapsed="0.614166">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:08.257877" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:08.257587" elapsed="0.000383"/>
</branch>
<status status="FAIL" start="2026-04-17T03:29:07.643353" elapsed="0.614643">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:08.263411" 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-04-17T03:29:08.259810" elapsed="0.003655">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:08.259461" elapsed="0.004109">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:29:08.259439" elapsed="0.004179">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-04-17T03:29:08.267804" 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-04-17T03:29:08.264105" elapsed="0.003736">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:08.263727" elapsed="0.004187">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:29:08.263702" elapsed="0.004274">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:08.268708" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:29:08.268223" elapsed="0.000514"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:08.269107" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:08.268816" elapsed="0.000353"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:08.269684" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:08.269365" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:08.269194" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:08.268795" elapsed="0.000976"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:08.270400" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:29:08.269953" elapsed="0.000476"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:08.270817" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:08.270501" elapsed="0.000384"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:08.271412" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:08.271102" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:08.270912" elapsed="0.000563"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:08.270482" elapsed="0.001014"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:08.271660" elapsed="0.000389"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-17T03:29:08.272543" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:29:08.272221" elapsed="0.000348"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-04-17T03:29:08.275075" 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-04-17T03:29:08.272727" elapsed="0.002383">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-04-17T03:29:08.258890" elapsed="0.016445">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-04-17T03:29:08.275405" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:29:08.278067" level="INFO">${response_text} = None</msg>
<msg time="2026-04-17T03:29:08.278099" 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-04-17T03:29:07.642255" elapsed="0.635873">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-04-17T03:29:08.278198" elapsed="0.000028"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="FAIL" start="2026-04-17T03:29:07.542529" elapsed="0.735846">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:07.542035" elapsed="0.736408"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-04-17T03:29:07.541551" elapsed="0.736956"/>
</kw>
<arg>intra_pe_distinguisher</arg>
<arg>${MVPN_DIR}</arg>
<status status="FAIL" start="2026-04-17T03:29:06.740097" elapsed="1.538487">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:06.661391" elapsed="1.617474">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:29:08.282509" elapsed="0.000300"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:29:08.282130" elapsed="0.000745"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:08.283979" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:08.283835" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:08.283814" 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-04-17T03:29:08.289227" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:08.289067" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:08.289048" elapsed="0.000257"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:08.290437" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:29:08.289976" elapsed="0.000489"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:29:08.291013" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:29:08.290684" elapsed="0.000356"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:29:08.291085" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:29:08.291247" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:29:08.289544" elapsed="0.001728"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:08.297104" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:08.296991" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:08.296970" 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-04-17T03:29:08.298422" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:08.298295" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:08.298276" elapsed="0.000225"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:08.299031" level="INFO">${karaf_connection_index} = 33</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:29:08.298698" elapsed="0.000360"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:08.299504" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:29:08.299278" elapsed="0.000251"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:29:08.300398" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:29:08.300127" elapsed="0.000960">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:29:08.301278" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:29:08.301324" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:08.299689" elapsed="0.001658"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:29:08.302129" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:29:08.301866" elapsed="0.000959">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:29:08.303059" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:29:08.303115" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:08.301522" elapsed="0.001619"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:29:08.304093" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_intra_pe_distinguisher"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:29:08.303447" elapsed="0.000709">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_intra_pe_distinguisher"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:08.303220" elapsed="0.001007">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_intra_pe_distinguisher"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:29:08.303200" elapsed="0.001066">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_intra_pe_distinguisher"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:08.304430" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:08.304661" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:08.304517" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:08.304500" elapsed="0.000237"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:29:08.304770" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:29:08.307401" elapsed="0.000149"/>
</kw>
<msg time="2026-04-17T03:29:08.307619" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:08.306266" 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-04-17T03:29:08.308046" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:08.308418" 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-04-17T03:29:08.305619" elapsed="0.002994"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:29:08.305070" elapsed="0.003608"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:29:08.297961" elapsed="0.010806">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_intra_pe_distinguisher"</status>
</kw>
<msg time="2026-04-17T03:29:08.308872" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:29:08.308916" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_intra_pe_distinguisher"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:08.297330" elapsed="0.011627"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:29:08.309195" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:08.309073" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:08.309048" elapsed="0.000215"/>
</if>
<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-04-17T03:29:08.310375" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:08.310266" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:08.310247" elapsed="0.000197"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:08.310819" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:29:08.311102" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:29:08.310604" elapsed="0.000538"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:08.311594" level="INFO">{1: 33}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:08.311321" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:08.312063" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:08.311796" elapsed="0.000311"/>
</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-04-17T03:29:08.312664" elapsed="0.000280"/>
</kw>
<msg time="2026-04-17T03:29:08.313048" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:29:08.313095" level="INFO">${old_connection_index} = 33</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:08.312290" elapsed="0.000828"/>
</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-04-17T03:29:08.313948" elapsed="0.000197"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:29:08.315437" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:29:08.315031" elapsed="0.001273">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:08.314361" elapsed="0.002052"/>
</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-04-17T03:29:08.317080" elapsed="0.000276"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:08.316594" elapsed="0.000847"/>
</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-04-17T03:29:08.313418" elapsed="0.004069"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:08.313193" elapsed="0.004342"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:08.313175" elapsed="0.004386"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:08.318461" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:29:08.318113" elapsed="0.000376"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:29:08.318538" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:29:08.319018" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:29:08.317769" elapsed="0.001295"/>
</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-04-17T03:29:08.319264" elapsed="0.000455"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:08.320016" level="INFO">index=34
host=10.30.170.120
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-04-17T03:29:08.320116" level="INFO">${karaf_connection_object} = index=34
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:29:08.319891" elapsed="0.000250"/>
</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-04-17T03:29:08.320293" elapsed="0.002418"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:29:08.323180" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:29:08.324498" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:29:08.322880" elapsed="0.002007">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:29:08.339955" elapsed="0.000419"/>
</kw>
<msg time="2026-04-17T03:29:08.340481" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:08.338101" elapsed="0.002569"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:08.340849" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:08.341036" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:29:08.325716" elapsed="0.015408"/>
</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-04-17T03:29:08.325194" elapsed="0.016051"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:29:08.309917" elapsed="0.031423">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:08.341733" elapsed="0.000033"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:29:08.341827" elapsed="0.000023"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:29:08.296622" elapsed="0.045666">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:29:08.342409" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:29:08.342455" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:08.291709" elapsed="0.050770"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:08.342880" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:08.342566" elapsed="0.000386"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:08.342544" elapsed="0.000435"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:29:08.291538" elapsed="0.051467"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:29:08.291333" elapsed="0.051731"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:29:08.288673" elapsed="0.054477"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:29:08.283519" elapsed="0.059698"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:08.283054" elapsed="0.060208"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:29:08.279814" elapsed="0.063502"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:08.344625" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:08.344051" elapsed="0.000604"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:08.345304" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:08.344825" elapsed="0.000507"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:08.345876" 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-04-17T03:29:08.345499" elapsed="0.000405"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:08.346305" 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-04-17T03:29:08.346509" 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-04-17T03:29:08.346085" elapsed="0.000457"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:08.347007" 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-04-17T03:29:08.347137" 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-04-17T03:29:08.346771" elapsed="0.000392"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-04-17T03:29:08.347336" elapsed="0.002819"/>
</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-04-17T03:29:08.350424" elapsed="0.001916"/>
</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-04-17T03:29:08.410447" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:08.410032" elapsed="0.000452"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:08.411390" 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-04-17T03:29:08.411075" elapsed="0.000396">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-04-17T03:29:08.411607" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:08.410705" elapsed="0.000937"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:08.412444" 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-04-17T03:29:08.411877" elapsed="0.000605"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:08.412953" 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-04-17T03:29:08.413208" 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-04-17T03:29:08.412730" elapsed="0.000517"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:08.413841" 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-04-17T03:29:08.413482" elapsed="0.000427"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:08.415574" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:08.415119" elapsed="0.000526"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:08.416326" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:29:08.415888" elapsed="0.000477"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:08.417535" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:08.416904" elapsed="0.000670"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:08.419425" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:08.418550" elapsed="0.001024"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:08.419689" elapsed="0.000055"/>
</return>
<msg time="2026-04-17T03:29:08.420159" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:08.417856" elapsed="0.002341"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:08.420430" elapsed="0.000590"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:29:08.416699" elapsed="0.004382"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:08.422056" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:29:08.421449" elapsed="0.000643"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:08.424103" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:29:08.423294" elapsed="0.000949"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:08.424353" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:29:08.424765" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:29:08.422593" elapsed="0.002209"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:08.425053" elapsed="0.000514"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:29:08.421249" elapsed="0.004378"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:29:08.416441" elapsed="0.009237"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:29:08.425738" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:29:08.425988" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:29:08.414512" elapsed="0.011513"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:08.414042" elapsed="0.012092"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:08.426388" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:08.426172" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:08.414009" elapsed="0.012489"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:08.427618" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:29:08.426766" elapsed="0.000885"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:29:08.427701" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:29:08.409357" elapsed="0.018603"/>
</kw>
<msg time="2026-04-17T03:29:08.428018" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:08.396310" elapsed="0.031759"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:29:08.440998" elapsed="0.000049"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/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-04-17T03:29:08.454467" elapsed="0.000064"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:29:08.467972" elapsed="0.000046"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:08.468275" 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-04-17T03:29:08.468477" 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-04-17T03:29:08.468902" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:08.468744" elapsed="0.000240"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:08.468726" 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-04-17T03:29:08.469163" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:08.469353" 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-04-17T03:29:08.469546" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:29:08.468686" elapsed="0.000915"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:29:08.468563" elapsed="0.001067"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:08.469781" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:08.469952" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:29:08.470118" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:29:08.391735" elapsed="0.078414"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:08.471740" 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-04-17T03:29:08.471423" elapsed="0.000393">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-04-17T03:29:08.471913" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:08.470993" elapsed="0.000962"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:08.472296" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:08.472027" elapsed="0.000326"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:08.472879" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:08.472566" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:08.472378" elapsed="0.000579"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:08.472008" elapsed="0.000972"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:08.475524" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:29:08.473136" elapsed="0.002416"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:29:08.475605" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:29:08.475767" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:29:08.470499" elapsed="0.005293"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:08.477097" 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-04-17T03:29:08.476836" elapsed="0.000325">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-04-17T03:29:08.477257" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:08.476495" elapsed="0.000786"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:29:08.477488" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:29:08.477350" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:08.477332" elapsed="0.000241"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:08.477721" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:08.477893" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:29:08.477983" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:29:08.479951" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:29:08.476158" elapsed="0.003823"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:08.481555" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:08.481291" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:08.482019" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:08.481759" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:29:08.487291" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:08.688896" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:09.091765" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:09.094526" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:29:08.484295" elapsed="0.616101">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:08.482157" elapsed="0.618427">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:09.101003" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:09.100653" elapsed="0.000454"/>
</branch>
<status status="FAIL" start="2026-04-17T03:29:08.482130" elapsed="0.619015">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:09.101846" elapsed="0.000044"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:09.102118" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:09.102042" elapsed="0.000164"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:09.102005" elapsed="0.000244"/>
</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-04-17T03:29:09.102542" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:29:09.102701" elapsed="0.000032"/>
</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-04-17T03:29:08.480296" elapsed="0.622625">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:09.103098" elapsed="0.000031"/>
</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-04-17T03:29:08.365720" elapsed="0.737545">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:09.103723" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:09.103408" elapsed="0.000420"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:09.103383" elapsed="0.000478"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:09.103908" elapsed="0.000042"/>
</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-04-17T03:29:08.361058" elapsed="0.743017">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:11.169251" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:11.168777" elapsed="0.000519"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:11.170248" 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-04-17T03:29:11.169956" elapsed="0.000394">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-04-17T03:29:11.170452" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:11.169521" elapsed="0.000957"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:11.171163" 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-04-17T03:29:11.170683" elapsed="0.000508"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:11.171512" 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-04-17T03:29:11.171685" 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-04-17T03:29:11.171360" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:11.172145" 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-04-17T03:29:11.171872" elapsed="0.000321"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:11.173330" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:11.173014" elapsed="0.000363"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:11.173820" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:29:11.173543" elapsed="0.000303"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:11.174667" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:11.174254" elapsed="0.000440"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:11.176125" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:11.175472" elapsed="0.000782"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:11.176360" elapsed="0.000052"/>
</return>
<msg time="2026-04-17T03:29:11.176769" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:11.174943" elapsed="0.001872"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:11.177076" elapsed="0.000545"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:29:11.174112" elapsed="0.003568"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:11.179087" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:29:11.178088" elapsed="0.001047"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:11.181018" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:29:11.180243" elapsed="0.000906"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:11.181254" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:29:11.181649" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:29:11.179436" elapsed="0.002249"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:11.181997" elapsed="0.000518"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:29:11.177852" elapsed="0.004722"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:29:11.173900" elapsed="0.008726"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:29:11.182690" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:29:11.183056" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:29:11.172650" elapsed="0.010447"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:11.172276" elapsed="0.010869"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:11.183415" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:11.183185" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:11.172250" elapsed="0.011276"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:11.184639" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:29:11.183743" elapsed="0.000937"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:29:11.184749" elapsed="0.000041"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_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-04-17T03:29:11.167985" elapsed="0.016939"/>
</kw>
<msg time="2026-04-17T03:29:11.185031" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:11.151486" elapsed="0.033621"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:29:11.202771" elapsed="0.000132"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:29:11.222372" elapsed="0.000067"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:29:11.235572" elapsed="0.000061"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:11.235888" 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-04-17T03:29:11.236099" 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-04-17T03:29:11.236534" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:11.236376" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:11.236359" 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-04-17T03:29:11.236763" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:11.237036" 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-04-17T03:29:11.237211" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:29:11.236321" elapsed="0.000944"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:29:11.236186" elapsed="0.001106"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:11.237441" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:11.237522" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:29:11.237691" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:29:11.146692" elapsed="0.091029"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:11.239316" 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-04-17T03:29:11.238999" elapsed="0.000396">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-04-17T03:29:11.239493" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:11.238490" elapsed="0.001028"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:11.239862" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:11.239593" elapsed="0.000327"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:11.240478" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:11.240176" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:11.239962" elapsed="0.000578"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:11.239573" elapsed="0.000989"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:11.243304" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:29:11.240717" elapsed="0.002614"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:29:11.243388" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:29:11.243555" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:29:11.238120" elapsed="0.005460"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:11.244875" 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-04-17T03:29:11.244621" elapsed="0.000337">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-04-17T03:29:11.245057" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:11.244264" elapsed="0.000818"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:29:11.245293" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:29:11.245154" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:11.245136" elapsed="0.000240"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:11.245526" 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-04-17T03:29:11.245699" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:29:11.245763" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:29:11.247721" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:29:11.243905" elapsed="0.003843"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:11.249296" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:11.249026" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:11.249742" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:11.249499" 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-04-17T03:29:11.256753" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:11.458567" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:11.861191" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:11.863469" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:29:11.252779" elapsed="0.614512">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:11.249853" elapsed="0.617617">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:11.867872" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:11.867534" elapsed="0.000479"/>
</branch>
<status status="FAIL" start="2026-04-17T03:29:11.249834" elapsed="0.618216">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:11.868726" elapsed="0.000052"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:11.868991" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:11.868891" elapsed="0.000169"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:11.868863" elapsed="0.000231"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:11.869329" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:29:11.869448" elapsed="0.000024"/>
</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-04-17T03:29:11.248154" elapsed="0.621475">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:11.869745" 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-04-17T03:29:11.116638" elapsed="0.753254">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:11.870449" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:11.870141" elapsed="0.000452"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:11.870114" elapsed="0.000551"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:11.870726" elapsed="0.000025"/>
</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-04-17T03:29:11.110769" elapsed="0.760193">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:13.930956" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:13.930364" elapsed="0.000634"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:13.932060" 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-04-17T03:29:13.931727" elapsed="0.000415">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-04-17T03:29:13.932242" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:13.931267" elapsed="0.001001"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:13.932838" 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-04-17T03:29:13.932438" elapsed="0.000427"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:13.933195" 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-04-17T03:29:13.933368" 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-04-17T03:29:13.933047" elapsed="0.000357"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:13.933861" 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-04-17T03:29:13.933596" 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-04-17T03:29:13.935092" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:13.934744" elapsed="0.000416"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:13.935704" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:29:13.935376" elapsed="0.000357"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:13.936555" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:13.936136" elapsed="0.000445"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:13.937855" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:13.937292" elapsed="0.000689"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:13.938061" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:29:13.938373" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:13.936777" elapsed="0.001627"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:13.938581" elapsed="0.000521"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:29:13.935993" elapsed="0.003269"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:13.940433" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:29:13.939605" elapsed="0.000863"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:13.942043" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:29:13.941338" elapsed="0.000810"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:13.942230" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:29:13.942535" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:29:13.940723" 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-04-17T03:29:13.942726" elapsed="0.000435"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:29:13.939413" elapsed="0.003793"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:29:13.935786" elapsed="0.007458"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:29:13.943288" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:29:13.943450" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:29:13.934412" elapsed="0.009064"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:13.934013" elapsed="0.009500"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:13.943697" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:13.943541" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:13.933988" elapsed="0.009785"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:13.944619" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:29:13.943920" elapsed="0.000729"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:29:13.944698" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_pe_distinguisher/rib/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:29:13.929404" elapsed="0.015421"/>
</kw>
<msg time="2026-04-17T03:29:13.944880" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:13.914087" elapsed="0.030920"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:29:13.957770" elapsed="0.000052"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/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-04-17T03:29:13.970448" 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/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-04-17T03:29:13.983008" elapsed="0.000049"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:13.983435" 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-04-17T03:29:13.983626" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:13.984099" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:13.983921" elapsed="0.000235"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:13.983904" 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-04-17T03:29:13.984328" 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-04-17T03:29:13.984496" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:13.984664" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:29:13.983864" elapsed="0.000852"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:29:13.983717" elapsed="0.001026"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:13.984890" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:13.984984" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:29:13.985153" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:29:13.909194" elapsed="0.075989"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:13.986677" 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-04-17T03:29:13.986354" elapsed="0.000411">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-04-17T03:29:13.986860" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:13.985920" elapsed="0.000964"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:13.987323" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:13.986970" elapsed="0.000417"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:13.987922" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:13.987620" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:13.987412" elapsed="0.000590"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:13.986951" elapsed="0.001072"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:13.990577" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:29:13.988176" elapsed="0.002428"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:29:13.990657" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:29:13.990818" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:29:13.985554" elapsed="0.005288"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:13.993237" 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-04-17T03:29:13.992888" elapsed="0.000435">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-04-17T03:29:13.993429" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:13.992434" elapsed="0.001019"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:29:13.993691" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-17T03:29:13.993531" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:13.993509" elapsed="0.000385"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:13.994064" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:13.994244" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:29:13.994310" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:29:13.996316" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:29:13.991197" elapsed="0.005146"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:13.997828" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:13.997561" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:13.998295" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:13.998050" 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-04-17T03:29:14.003995" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:14.205614" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:14.608112" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:14.610581" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:29:14.000525" elapsed="0.615071">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:13.998407" elapsed="0.617432">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:14.616419" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:14.615963" elapsed="0.000602"/>
</branch>
<status status="FAIL" start="2026-04-17T03:29:13.998388" elapsed="0.618229">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:14.617526" elapsed="0.000057"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:14.617821" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:14.617740" elapsed="0.000177"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:14.617700" elapsed="0.000290"/>
</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-04-17T03:29:14.618314" elapsed="0.000047"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:29:14.618463" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:29:13.996704" elapsed="0.622000">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:14.618996" elapsed="0.000038"/>
</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-04-17T03:29:13.884970" elapsed="0.734281">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:14.620341" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:14.619458" elapsed="0.001040"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:14.619421" elapsed="0.001130"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:14.620619" elapsed="0.000029"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-04-17T03:29:13.878319" elapsed="0.742504">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:29:14.621064" level="FAIL">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-17T03:29:08.352632" elapsed="6.268607">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:29:14.621556" elapsed="0.000034"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:29:14.621797" elapsed="0.000021"/>
</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="NOT RUN" start="2026-04-17T03:29:14.622025" elapsed="0.000021"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:29:14.622202" elapsed="0.000020"/>
</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-04-17T03:29:14.622533" elapsed="0.002714"/>
</kw>
<arg>intra_pe_distinguisher</arg>
<arg>${MVPN_DIR}</arg>
<status status="FAIL" start="2026-04-17T03:29:08.343585" elapsed="6.281830">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:08.279293" elapsed="6.346397">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:29:14.630717" elapsed="0.000385"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:29:14.630317" elapsed="0.000887"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:14.632713" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:14.632531" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:14.632494" elapsed="0.000322"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:14.639272" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:14.639068" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:14.639037" elapsed="0.000343"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:14.640959" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:29:14.640335" elapsed="0.000664"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:29:14.641517" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:29:14.641196" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:29:14.641589" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:29:14.641761" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:29:14.639770" elapsed="0.002035"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:14.649729" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:14.649544" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:14.649508" elapsed="0.000336"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:14.651775" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:14.651619" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:14.651593" elapsed="0.000281"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:14.652557" level="INFO">${karaf_connection_index} = 34</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:29:14.652117" elapsed="0.000479"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:14.653161" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:29:14.652832" elapsed="0.000367"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:29:14.654381" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:29:14.653991" elapsed="0.001436">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:29:14.655690" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:29:14.655759" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:14.653437" elapsed="0.002355"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:29:14.656905" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:29:14.656562" elapsed="0.001163">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:29:14.657918" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:29:14.657986" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:14.656066" elapsed="0.001944"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:29:14.659291" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_intra_vrf"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:29:14.658441" elapsed="0.000953">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_intra_vrf"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:14.658103" elapsed="0.001392">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_intra_vrf"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:29:14.658077" elapsed="0.001470">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_intra_vrf"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:14.659784" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:14.660134" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:14.659901" elapsed="0.000367"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:14.659877" elapsed="0.000417"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:29:14.660333" elapsed="0.000018"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:29:14.663101" elapsed="0.000317"/>
</kw>
<msg time="2026-04-17T03:29:14.663531" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:14.661950" elapsed="0.001785"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:14.664271" elapsed="0.000116"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:14.664783" elapsed="0.000112"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:29:14.661265" elapsed="0.003824"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:29:14.660651" 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="FAIL" start="2026-04-17T03:29:14.651157" elapsed="0.014282">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_intra_vrf"</status>
</kw>
<msg time="2026-04-17T03:29:14.665610" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:29:14.665679" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_intra_vrf"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:14.650140" elapsed="0.015575"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:29:14.666042" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:14.665836" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:14.665806" elapsed="0.000354"/>
</if>
<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-04-17T03:29:14.668097" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:14.667864" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:14.667833" elapsed="0.000368"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:14.668641" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:29:14.668807" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:29:14.668444" elapsed="0.000614"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:14.669724" level="INFO">{1: 34}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:14.669302" elapsed="0.000491"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:14.670446" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:14.670051" elapsed="0.000463"/>
</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-04-17T03:29:14.671721" elapsed="0.000657"/>
</kw>
<msg time="2026-04-17T03:29:14.672547" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:29:14.672619" level="INFO">${old_connection_index} = 34</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:14.670803" elapsed="0.001852"/>
</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-04-17T03:29:14.674155" elapsed="0.000309"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:29:14.676154" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:29:14.675618" elapsed="0.001531">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:14.674727" elapsed="0.002530"/>
</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-04-17T03:29:14.677969" elapsed="0.000296"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:14.677444" elapsed="0.000909"/>
</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-04-17T03:29:14.673184" elapsed="0.005217"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:14.672770" elapsed="0.005682"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:14.672741" elapsed="0.005741"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:14.679668" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:29:14.679280" elapsed="0.000417"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:29:14.679750" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:29:14.679981" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:29:14.678730" elapsed="0.001286"/>
</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-04-17T03:29:14.680204" elapsed="0.000457"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:14.680993" level="INFO">index=35
host=10.30.170.120
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-04-17T03:29:14.681106" level="INFO">${karaf_connection_object} = index=35
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:29:14.680843" elapsed="0.000300"/>
</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-04-17T03:29:14.681334" elapsed="0.005970"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:29:14.688205" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:29:14.689618" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:29:14.687780" elapsed="0.002317">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:29:14.705464" elapsed="0.000494"/>
</kw>
<msg time="2026-04-17T03:29:14.706071" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:14.703760" elapsed="0.002513"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:14.706472" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:14.706647" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:29:14.691104" elapsed="0.015635"/>
</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-04-17T03:29:14.690460" elapsed="0.016331"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:29:14.667357" elapsed="0.039650">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:14.707568" elapsed="0.000037"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:29:14.707669" elapsed="0.000030"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:29:14.648913" elapsed="0.058920">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:29:14.708010" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:29:14.708060" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:14.642284" elapsed="0.065802"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:14.708481" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:14.708183" elapsed="0.000356"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:14.708158" elapsed="0.000415"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:29:14.642105" elapsed="0.066502"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:29:14.641883" elapsed="0.066765"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:29:14.638459" elapsed="0.070254"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:29:14.632111" elapsed="0.076664"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:14.631427" elapsed="0.077398"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:29:14.626901" elapsed="0.082373"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:14.710316" 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-04-17T03:29:14.710526" 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-04-17T03:29:14.710083" elapsed="0.000471"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-17T03:29:14.710983" 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-04-17T03:29:14.710719" elapsed="0.000295"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:14.711437" 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-04-17T03:29:14.711573" 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-04-17T03:29:14.711182" elapsed="0.000418"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-17T03:29:14.712012" 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-04-17T03:29:14.711774" elapsed="0.000267"/>
</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-04-17T03:29:14.712359" elapsed="0.002981"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:14.712122" elapsed="0.003276"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:14.712099" elapsed="0.003333"/>
</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-04-17T03:29:14.757720" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:14.757261" elapsed="0.000496"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:14.758627" 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-04-17T03:29:14.758339" elapsed="0.000369">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-04-17T03:29:14.758818" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:14.757967" elapsed="0.000897"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:14.759640" 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-04-17T03:29:14.759113" elapsed="0.000559"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:14.760027" 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-04-17T03:29:14.760209" 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-04-17T03:29:14.759854" elapsed="0.000384"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:14.760671" 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-04-17T03:29:14.760407" 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-04-17T03:29:14.761822" level="INFO">mapping: {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:14.761545" elapsed="0.000325"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:14.762389" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:29:14.762056" elapsed="0.000362"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:14.763153" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:29:14.762800" elapsed="0.000381"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:14.764315" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:29:14.763830" elapsed="0.000514"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:14.764400" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:29:14.764576" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:29:14.763421" elapsed="0.001182"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:14.764772" elapsed="0.000270"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:29:14.762659" elapsed="0.002427"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:14.765669" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:29:14.765351" elapsed="0.000345"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:14.767034" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:29:14.766562" elapsed="0.000500"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:14.767120" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:29:14.767344" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:29:14.765914" elapsed="0.001456"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:14.767532" elapsed="0.000233"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:29:14.765208" elapsed="0.002600"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:29:14.762473" elapsed="0.005370"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:29:14.767887" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:29:14.768077" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:29:14.761195" elapsed="0.006908"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:14.760806" elapsed="0.007330"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:14.768319" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:14.768163" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:14.760780" elapsed="0.007622"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:14.769186" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:29:14.768552" elapsed="0.000664"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:29:14.769268" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_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-04-17T03:29:14.756430" elapsed="0.012973"/>
</kw>
<msg time="2026-04-17T03:29:14.769461" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:14.742459" elapsed="0.027056"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:29:14.782629" 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/app.vanadium/${file_name} exists. If 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-04-17T03:29:14.795288" 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/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-04-17T03:29:14.808335" elapsed="0.000038"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:14.808690" 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-04-17T03:29:14.808883" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:14.809329" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:14.809167" elapsed="0.000232"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:14.809149" 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-04-17T03:29:14.809606" 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-04-17T03:29:14.809789" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:14.809976" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:29:14.809111" elapsed="0.000921"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:29:14.808984" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:14.810208" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:14.810287" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:29:14.810451" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:29:14.737326" elapsed="0.073155"/>
</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-04-17T03:29:14.836847" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:14.836398" elapsed="0.000483"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:14.837706" 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-04-17T03:29:14.837444" elapsed="0.000354">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-04-17T03:29:14.837893" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:14.837073" elapsed="0.000845"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:14.838490" 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-04-17T03:29:14.838099" elapsed="0.000418"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:14.838822" 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-04-17T03:29:14.839036" 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-04-17T03:29:14.838680" elapsed="0.000385"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:14.839534" 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-04-17T03:29:14.839239" elapsed="0.000442"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-17T03:29:14.840160" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:14.839767" elapsed="0.000453"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:14.840714" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:14.840413" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:14.840247" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:14.839741" elapsed="0.001060"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:14.841441" 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-04-17T03:29:14.840966" elapsed="0.000507"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:29:14.841526" 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/app.vanadium/${file_name} exists. If 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-04-17T03:29:14.835660" elapsed="0.006005"/>
</kw>
<msg time="2026-04-17T03:29:14.841724" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:14.822258" elapsed="0.019516"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:29:14.854794" elapsed="0.000063"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:29:14.868411" elapsed="0.000064"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:29:14.882174" elapsed="0.000063"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:14.882498" 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-04-17T03:29:14.882701" 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-04-17T03:29:14.883241" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:14.883014" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:14.882995" 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-04-17T03:29:14.883502" 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-04-17T03:29:14.883678" 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-04-17T03:29:14.883871" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:29:14.882952" elapsed="0.000991"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:29:14.882788" elapsed="0.001186"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:14.884239" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:14.884324" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:29:14.884515" 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-04-17T03:29:14.821227" elapsed="0.063321"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:14.886129" 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-04-17T03:29:14.885784" elapsed="0.000427">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-04-17T03:29:14.886309" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:14.885367" elapsed="0.000967"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:14.886680" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:14.886405" elapsed="0.000338"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:14.887344" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:14.886991" elapsed="0.000382"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:14.886768" elapsed="0.000642"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:14.886387" elapsed="0.001046"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:14.890030" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:29:14.887589" elapsed="0.002470"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:29:14.890115" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:29:14.890287" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:29:14.884982" elapsed="0.005331"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:14.892388" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:29:14.892114" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:14.893069" 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-04-17T03:29:14.892654" elapsed="0.000527"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:14.893648" 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-04-17T03:29:14.893359" elapsed="0.000348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:14.894197" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:14.893909" elapsed="0.000334"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:14.895167" 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-04-17T03:29:14.894950" elapsed="0.000256"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:29:14.895641" 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-04-17T03:29:14.895439" elapsed="0.000306"/>
</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-04-17T03:29:14.895943" elapsed="0.000241"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:14.896631" 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-04-17T03:29:14.896356" elapsed="0.000321"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:29:14.896741" elapsed="0.000050"/>
</return>
<msg time="2026-04-17T03:29:14.896947" 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-04-17T03:29:14.894472" elapsed="0.002503"/>
</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-04-17T03:29:14.903127" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:15.104905" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:15.508130" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:15.510238" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:29:14.899751" elapsed="0.613426">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:14.897056" elapsed="0.616238">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:29:15.513578" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:15.513341" elapsed="0.000312"/>
</branch>
<status status="FAIL" start="2026-04-17T03:29:14.897035" elapsed="0.616643">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:29:15.514153" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:15.514301" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:15.514260" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:15.514241" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:15.514521" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:29:15.514589" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>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="FAIL" start="2026-04-17T03:29:14.890688" elapsed="0.624017">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:15.514791" elapsed="0.000017"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>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="FAIL" start="2026-04-17T03:29:14.722254" elapsed="0.792739">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:15.515378" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:15.515129" elapsed="0.000349"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:15.515110" elapsed="0.000397"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:15.515542" elapsed="0.000015"/>
</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="FAIL" start="2026-04-17T03:29:14.715820" elapsed="0.799830">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:29:15.515897" elapsed="0.000057"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<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="NOT RUN" start="2026-04-17T03:29:15.516257" elapsed="0.000034"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:15.516506" elapsed="0.000028"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations">
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:15.516761" elapsed="0.000032"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:29:15.517037" elapsed="0.000030"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<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="NOT RUN" start="2026-04-17T03:29:15.517349" elapsed="0.000032"/>
</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-04-17T03:29:15.563036" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:15.562590" elapsed="0.000482"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:15.563943" 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-04-17T03:29:15.563645" elapsed="0.000383">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-04-17T03:29:15.564126" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:15.563248" elapsed="0.000903"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:15.564719" 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-04-17T03:29:15.564319" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:15.565077" 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-04-17T03:29:15.565242" 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-04-17T03:29:15.564914" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:15.565683" 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-04-17T03:29:15.565430" 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-04-17T03:29:15.566886" level="INFO">mapping: {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:15.566610" elapsed="0.000340"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:15.567437" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:29:15.567116" elapsed="0.000347"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:15.568442" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:29:15.567884" elapsed="0.000584"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:15.569727" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:29:15.569261" elapsed="0.000508"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:15.569941" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:29:15.570185" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:29:15.568660" elapsed="0.001551"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:15.570371" elapsed="0.000511"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:29:15.567702" elapsed="0.003239"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:15.571834" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:29:15.571195" elapsed="0.000673"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:15.573197" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:29:15.572574" elapsed="0.000665"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:15.573357" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:29:15.573631" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:29:15.572093" elapsed="0.001569"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:15.573821" elapsed="0.000524"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:29:15.571059" elapsed="0.003328"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:29:15.567516" elapsed="0.006906"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:29:15.574463" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:29:15.574621" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:29:15.566244" elapsed="0.008401"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:15.565888" elapsed="0.008790"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:15.574854" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:15.574702" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:15.565863" elapsed="0.009082"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:15.575714" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:29:15.575094" elapsed="0.000649"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:29:15.575797" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:29:15.561883" elapsed="0.014037"/>
</kw>
<msg time="2026-04-17T03:29:15.575992" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:15.548909" elapsed="0.027147"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:29:15.589210" 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/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-04-17T03:29:15.601983" elapsed="0.000034"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/app.vanadium/${file_name} exists. If 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-04-17T03:29:15.614462" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:15.614695" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:15.614919" elapsed="0.000042"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:15.615405" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:15.615201" elapsed="0.000263"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:15.615184" 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-04-17T03:29:15.615638" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:15.615835" elapsed="0.000029"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:15.616074" elapsed="0.000025"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:29:15.615145" elapsed="0.000993"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:29:15.615028" elapsed="0.001142"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:15.616349" elapsed="0.000024"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:15.616440" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:29:15.616613" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:29:15.544410" elapsed="0.072234"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:15.617942" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:29:15.617629" elapsed="0.000367"/>
</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-04-17T03:29:15.622796" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:15.824300" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:16.226730" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:16.229108" level="INFO">${response} = None</msg>
<msg time="2026-04-17T03:29:16.229186" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:15.620198" elapsed="0.612412">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:15.618062" elapsed="0.614699">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:16.233163" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:16.232827" elapsed="0.000434"/>
</branch>
<status status="FAIL" start="2026-04-17T03:29:15.618045" elapsed="0.615250">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:16.239317" 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-04-17T03:29:16.235443" elapsed="0.003930">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:16.235071" elapsed="0.004465">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:29:16.235041" elapsed="0.004545">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-04-17T03:29:16.242517" 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-04-17T03:29:16.239987" elapsed="0.002565">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:16.239691" elapsed="0.002925">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:29:16.239667" elapsed="0.002981">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:16.243619" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:29:16.242874" elapsed="0.000773"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:16.243988" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:16.243720" elapsed="0.000329"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:16.244571" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:16.244253" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:16.244073" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:16.243702" elapsed="0.000953"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:16.245217" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:29:16.244818" elapsed="0.000426"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:16.245553" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:16.245315" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:16.246301" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:16.245798" elapsed="0.000529"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:16.245635" elapsed="0.000727"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:16.245297" elapsed="0.001087"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:16.246542" elapsed="0.000375"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-17T03:29:16.247447" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:29:16.247114" elapsed="0.000360"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-04-17T03:29:16.250073" 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-04-17T03:29:16.247632" elapsed="0.002474">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-04-17T03:29:16.234284" elapsed="0.016047">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-04-17T03:29:16.250407" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:29:16.253169" level="INFO">${response_text} = None</msg>
<msg time="2026-04-17T03:29:16.253201" 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-04-17T03:29:15.616971" elapsed="0.636258">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-04-17T03:29:16.253299" elapsed="0.000027"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="FAIL" start="2026-04-17T03:29:15.519114" elapsed="0.734398">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:15.518404" elapsed="0.735185"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-04-17T03:29:15.517739" elapsed="0.735914"/>
</kw>
<arg>intra_vrf</arg>
<arg>${MVPN_DIR}</arg>
<status status="FAIL" start="2026-04-17T03:29:14.709604" elapsed="1.544126">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:14.626247" elapsed="1.627698">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:29:16.257436" elapsed="0.000232"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:29:16.257149" elapsed="0.000577"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:16.259065" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:16.258910" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:16.258877" elapsed="0.000257"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:16.264331" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:16.264197" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:16.264178" elapsed="0.000223"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:16.265545" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:29:16.265133" elapsed="0.000454"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:29:16.266108" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:29:16.265759" elapsed="0.000380"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:29:16.266184" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:29:16.266341" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:29:16.264681" elapsed="0.001685"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:16.272217" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:16.272088" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:16.272068" 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-04-17T03:29:16.273530" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:16.273419" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:16.273401" elapsed="0.000224"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:16.274151" level="INFO">${karaf_connection_index} = 35</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:29:16.273809" elapsed="0.000369"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:16.274653" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:29:16.274418" elapsed="0.000262"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:29:16.275572" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:29:16.275252" elapsed="0.001063">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:29:16.276512" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:29:16.276559" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:16.274861" elapsed="0.001721"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:29:16.277430" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:29:16.277149" elapsed="0.000965">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:29:16.278319" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:29:16.278370" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:16.276764" elapsed="0.001630"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:29:16.279444" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_intra_vrf"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:29:16.278705" elapsed="0.000806">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_intra_vrf"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:16.278472" elapsed="0.001110">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_intra_vrf"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:29:16.278452" elapsed="0.001163">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_intra_vrf"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:16.279783" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:16.280080" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:16.279895" elapsed="0.000242"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:16.279874" elapsed="0.000287"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:29:16.280197" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:29:16.282908" elapsed="0.000173"/>
</kw>
<msg time="2026-04-17T03:29:16.283152" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:16.281741" elapsed="0.001543"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:16.283680" elapsed="0.000080"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:16.284121" 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-04-17T03:29:16.281088" elapsed="0.003231"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:29:16.280499" elapsed="0.003910"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:29:16.273085" elapsed="0.011415">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_intra_vrf"</status>
</kw>
<msg time="2026-04-17T03:29:16.284609" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:29:16.284654" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_intra_vrf"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:16.272443" elapsed="0.012236"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:29:16.284869" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:16.284758" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:16.284739" elapsed="0.000240"/>
</if>
<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-04-17T03:29:16.286054" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:16.285906" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:16.285888" elapsed="0.000234"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:16.286429" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:29:16.286544" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:29:16.286284" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:16.287078" level="INFO">{1: 35}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:16.286773" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:16.287643" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:16.287317" elapsed="0.000370"/>
</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-04-17T03:29:16.288302" elapsed="0.000301"/>
</kw>
<msg time="2026-04-17T03:29:16.288703" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:29:16.288750" level="INFO">${old_connection_index} = 35</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:16.287852" elapsed="0.000920"/>
</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-04-17T03:29:16.289666" elapsed="0.000198"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:29:16.291022" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:29:16.290594" elapsed="0.001542">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:16.290074" elapsed="0.002164"/>
</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-04-17T03:29:16.293146" elapsed="0.000287"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:16.292414" elapsed="0.001103"/>
</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-04-17T03:29:16.289115" elapsed="0.004447"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:16.288846" elapsed="0.004764"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:16.288827" elapsed="0.004808"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:16.294517" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:29:16.294194" elapsed="0.000350"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:29:16.294591" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:29:16.294743" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:29:16.293847" elapsed="0.000921"/>
</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-04-17T03:29:16.294950" elapsed="0.000437"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:16.295775" level="INFO">index=36
host=10.30.170.120
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-04-17T03:29:16.295911" level="INFO">${karaf_connection_object} = index=36
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:29:16.295640" elapsed="0.000332"/>
</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-04-17T03:29:16.296149" elapsed="0.002401"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:29:16.298994" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:29:16.300252" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:29:16.298717" elapsed="0.002092">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:29:16.316832" elapsed="0.000425"/>
</kw>
<msg time="2026-04-17T03:29:16.317353" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:16.315045" elapsed="0.002466"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:16.317676" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:16.317842" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:29:16.301983" elapsed="0.015961"/>
</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-04-17T03:29:16.301242" elapsed="0.016752"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:29:16.285603" elapsed="0.032531">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:16.318503" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:29:16.318580" 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="FAIL" start="2026-04-17T03:29:16.271718" elapsed="0.046972">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:29:16.318802" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:29:16.318848" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:16.266777" elapsed="0.052096"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:16.319258" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:16.318992" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:16.318968" elapsed="0.000370"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:29:16.266626" elapsed="0.052735"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:29:16.266424" elapsed="0.052970"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:29:16.263776" elapsed="0.055713"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:29:16.258573" elapsed="0.060975"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:16.257890" elapsed="0.061704"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:29:16.254767" elapsed="0.064881"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:16.320999" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:16.320495" elapsed="0.000533"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:16.321644" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:16.321195" elapsed="0.000476"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:16.322231" 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-04-17T03:29:16.321834" elapsed="0.000424"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:16.322621" 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-04-17T03:29:16.322788" 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-04-17T03:29:16.322419" elapsed="0.000395"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:16.323196" 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-04-17T03:29:16.323318" 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-04-17T03:29:16.322997" elapsed="0.000347"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-04-17T03:29:16.323575" elapsed="0.002511"/>
</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-04-17T03:29:16.326268" elapsed="0.001641"/>
</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-04-17T03:29:16.385562" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:16.385077" elapsed="0.000619"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:16.386612" 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-04-17T03:29:16.386299" elapsed="0.000415">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-04-17T03:29:16.386822" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:16.385892" elapsed="0.000956"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:16.387506" 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-04-17T03:29:16.387046" elapsed="0.000490"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:16.387884" 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-04-17T03:29:16.388074" 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-04-17T03:29:16.387725" elapsed="0.000375"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:16.388538" 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-04-17T03:29:16.388263" 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-04-17T03:29:16.389805" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:16.389459" elapsed="0.000394"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:16.390344" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:29:16.390049" elapsed="0.000326"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:16.391225" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:16.390780" elapsed="0.000472"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:16.392649" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:16.392051" elapsed="0.000709"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:16.392861" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:29:16.393197" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:16.391519" elapsed="0.001704"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:16.393402" elapsed="0.000429"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:29:16.390619" elapsed="0.003257"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:16.394617" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:29:16.394161" elapsed="0.000483"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:16.600118" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:29:16.599373" elapsed="0.000858"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:16.600327" elapsed="0.000050"/>
</return>
<msg time="2026-04-17T03:29:16.600679" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:29:16.598583" elapsed="0.002124"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:16.600872" elapsed="0.000442"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:29:16.394017" elapsed="0.207343"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:29:16.390433" elapsed="0.210969"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:29:16.601454" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:29:16.601643" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:29:16.389093" elapsed="0.212576"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:16.388674" elapsed="0.213029"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:16.601900" elapsed="0.000114"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:16.601733" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:16.388647" elapsed="0.213439"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:16.602969" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:29:16.602247" elapsed="0.000768"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:29:16.603075" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name} exists. If 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-04-17T03:29:16.384188" elapsed="0.219021"/>
</kw>
<msg time="2026-04-17T03:29:16.603273" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:16.370853" elapsed="0.232477"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:29:16.616407" elapsed="0.000058"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:29:16.629079" elapsed="0.000042"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_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-04-17T03:29:16.642399" elapsed="0.000050"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:16.642714" 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-04-17T03:29:16.642954" 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-04-17T03:29:16.643512" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:16.643275" elapsed="0.000305"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:16.643255" 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-04-17T03:29:16.643789" 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-04-17T03:29:16.644008" 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-04-17T03:29:16.644208" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:29:16.643208" elapsed="0.001060"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:29:16.643056" elapsed="0.001243"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:16.644476" elapsed="0.000024"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:16.644567" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:29:16.644755" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:29:16.366301" elapsed="0.278563"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:16.646563" 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-04-17T03:29:16.646218" elapsed="0.000431">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-04-17T03:29:16.646757" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:16.645724" elapsed="0.001062"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:16.647198" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:16.646868" elapsed="0.000396"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:16.647871" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:16.647533" elapsed="0.000367"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:16.647293" elapsed="0.000671"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:16.646847" elapsed="0.001143"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:16.650914" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:29:16.648173" elapsed="0.002785"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:29:16.651016" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:29:16.651191" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:29:16.645302" elapsed="0.005916"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:16.652625" 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-04-17T03:29:16.652362" elapsed="0.000332">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-04-17T03:29:16.652795" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:16.651981" elapsed="0.000841"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:29:16.653061" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-17T03:29:16.652899" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:16.652879" elapsed="0.000275"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:16.653323" 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-04-17T03:29:16.653516" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:29:16.653585" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:29:16.655782" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:29:16.651595" elapsed="0.004215"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:16.657384" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:16.657106" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:16.657876" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:16.657611" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:29:16.663342" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:16.865116" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:17.268078" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:17.271337" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:29:16.660382" elapsed="0.616024">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:16.658009" elapsed="0.618587">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:17.277102" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:17.276673" elapsed="0.000544"/>
</branch>
<status status="FAIL" start="2026-04-17T03:29:16.657990" elapsed="0.619267">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:17.278053" elapsed="0.000044"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:17.278708" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:17.278635" elapsed="0.000148"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:17.278198" elapsed="0.000622"/>
</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-04-17T03:29:17.279097" elapsed="0.000035"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:29:17.279213" elapsed="0.000031"/>
</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-04-17T03:29:16.656182" elapsed="0.623221">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:17.279532" elapsed="0.000050"/>
</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-04-17T03:29:16.340065" elapsed="0.939673">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:17.280162" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:17.279899" elapsed="0.000345"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:17.279875" elapsed="0.000395"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:17.280307" elapsed="0.000016"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-04-17T03:29:16.334235" elapsed="0.946186">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:19.337010" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:19.336591" elapsed="0.000454"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:19.337817" 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-04-17T03:29:19.337565" elapsed="0.000327">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-04-17T03:29:19.338005" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:19.337220" elapsed="0.000810"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:19.338591" 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-04-17T03:29:19.338201" elapsed="0.000418"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:19.338940" 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-04-17T03:29:19.339108" 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-04-17T03:29:19.338784" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:19.339544" 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-04-17T03:29:19.339295" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:19.340666" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:19.340351" elapsed="0.000361"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:19.341173" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:29:19.340875" elapsed="0.000324"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:19.341990" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:19.341563" elapsed="0.000454"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:19.343413" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:19.342834" elapsed="0.000681"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:19.343596" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:29:19.343957" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:19.342208" elapsed="0.001779"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:19.344148" elapsed="0.000387"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:29:19.341424" elapsed="0.003153"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:19.345250" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:29:19.344827" elapsed="0.000451"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:19.346489" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:29:19.345943" elapsed="0.000645"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:19.346664" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:29:19.346972" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:29:19.345467" elapsed="0.001532"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:19.347154" elapsed="0.000366"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:29:19.344691" elapsed="0.002870"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:29:19.341249" elapsed="0.006347"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:29:19.347638" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:29:19.347799" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:29:19.340019" elapsed="0.007888"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:19.339667" elapsed="0.008291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:19.348137" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:19.347983" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:19.339645" elapsed="0.008569"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:19.348954" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:29:19.348358" elapsed="0.000627"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:29:19.349033" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:29:19.335958" elapsed="0.013202"/>
</kw>
<msg time="2026-04-17T03:29:19.349216" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:19.323209" elapsed="0.026056"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:29:19.361773" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:19.374621" 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-04-17T03:29:19.387416" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:19.387662" 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-04-17T03:29:19.387849" elapsed="0.000063"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:19.388295" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:19.388142" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:19.388128" 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-04-17T03:29:19.388520" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:19.388689" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:19.388854" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:29:19.388097" elapsed="0.000809"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:29:19.387993" elapsed="0.000955"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:19.389099" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:19.389254" elapsed="0.000022"/>
</return>
<msg time="2026-04-17T03:29:19.389398" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:29:19.318836" elapsed="0.070590"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:19.390733" 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-04-17T03:29:19.390475" elapsed="0.000333">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_vrf/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-17T03:29:19.390907" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:19.390118" elapsed="0.000830"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:19.391279" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:19.391022" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:19.391860" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:19.391558" elapsed="0.000357"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:19.391362" elapsed="0.000606"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:19.391003" elapsed="0.000988"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:19.394574" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:29:19.392146" elapsed="0.002459"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:29:19.394667" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:29:19.394871" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:29:19.389758" elapsed="0.005148"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:19.396604" 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-04-17T03:29:19.396300" elapsed="0.000378">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-04-17T03:29:19.396776" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:19.395767" elapsed="0.001034"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:29:19.397039" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-04-17T03:29:19.396871" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:19.396853" elapsed="0.000295"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:19.397302" 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-04-17T03:29:19.397478" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:29:19.397545" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:29:19.399508" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:29:19.395335" elapsed="0.004202"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:19.401050" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:19.400770" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:19.401539" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:19.401255" elapsed="0.000342"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:29:19.407301" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:19.608828" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:20.012041" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:20.014763" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:29:19.404288" elapsed="0.616133">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:19.401676" elapsed="0.619003">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:20.021085" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:20.020771" elapsed="0.000388"/>
</branch>
<status status="FAIL" start="2026-04-17T03:29:19.401652" elapsed="0.619531">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:20.021711" elapsed="0.000031"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:20.021869" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:20.021828" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:20.021807" 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-04-17T03:29:20.022130" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:29:20.022211" 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-04-17T03:29:19.399855" elapsed="0.622499">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:20.022435" 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-04-17T03:29:19.295216" elapsed="0.727321">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:20.023143" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:20.022636" elapsed="0.000584"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:20.022618" elapsed="0.000628"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:20.023279" elapsed="0.000015"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-04-17T03:29:19.288251" elapsed="0.735134">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:22.083797" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:22.083324" elapsed="0.000511"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:22.084768" 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-04-17T03:29:22.084487" elapsed="0.000362">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-04-17T03:29:22.084966" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:22.084036" elapsed="0.000959"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:22.085591" 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-04-17T03:29:22.085169" elapsed="0.000451"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:22.085950" 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-04-17T03:29:22.086125" 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-04-17T03:29:22.085787" elapsed="0.000364"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:22.086568" 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-04-17T03:29:22.086315" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:22.087793" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:22.087438" elapsed="0.000403"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:22.088322" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:29:22.088041" elapsed="0.000351"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:22.089209" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:22.088770" elapsed="0.000467"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:22.090734" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:22.089904" elapsed="0.000936"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:22.090925" elapsed="0.000059"/>
</return>
<msg time="2026-04-17T03:29:22.091262" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:22.089440" elapsed="0.001850"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:22.091474" elapsed="0.000425"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:29:22.088628" elapsed="0.003333"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:22.092732" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:29:22.092225" elapsed="0.000533"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:22.094739" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:29:22.093746" elapsed="0.001167"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:22.095059" elapsed="0.000058"/>
</return>
<msg time="2026-04-17T03:29:22.095611" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:29:22.093027" elapsed="0.002625"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:22.096001" elapsed="0.001047"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:29:22.092084" elapsed="0.005013"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:29:22.088448" elapsed="0.008688"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:29:22.097183" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:29:22.097354" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:29:22.087100" elapsed="0.010280"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:22.086699" elapsed="0.010717"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:22.097668" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:22.097453" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:22.086672" elapsed="0.011082"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:22.098633" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:29:22.097944" elapsed="0.000719"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:29:22.098715" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_vrf/rib/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:29:22.082423" elapsed="0.016424"/>
</kw>
<msg time="2026-04-17T03:29:22.098908" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:22.068782" elapsed="0.030200"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:29:22.112447" elapsed="0.000076"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_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-04-17T03:29:22.127162" elapsed="0.000062"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:29:22.142973" elapsed="0.000060"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:22.143285" 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-04-17T03:29:22.143526" 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-04-17T03:29:22.144147" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:22.143903" elapsed="0.000324"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:22.143879" elapsed="0.000385"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:22.144491" 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-04-17T03:29:22.144736" 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-04-17T03:29:22.145126" elapsed="0.000031"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:29:22.143823" elapsed="0.001383"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:29:22.143642" elapsed="0.001604"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:22.145460" elapsed="0.000030"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:22.145571" elapsed="0.000024"/>
</return>
<msg time="2026-04-17T03:29:22.145794" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:29:22.064164" elapsed="0.081672"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:22.147819" 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-04-17T03:29:22.147427" elapsed="0.000497">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-04-17T03:29:22.148075" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:22.146869" elapsed="0.001240"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:22.148653" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:22.148216" elapsed="0.000519"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:22.149482" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:22.149071" elapsed="0.000442"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:22.148771" elapsed="0.000779"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:22.148187" elapsed="0.001385"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:22.152774" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:29:22.149734" elapsed="0.003076"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:29:22.152888" elapsed="0.000070"/>
</return>
<msg time="2026-04-17T03:29:22.153130" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:29:22.146366" elapsed="0.006790"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:22.154824" 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-04-17T03:29:22.154458" elapsed="0.000485">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-04-17T03:29:22.155076" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:22.153954" elapsed="0.001156"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:29:22.155401" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-04-17T03:29:22.155209" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:22.155183" elapsed="0.000339"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:22.155733" elapsed="0.000030"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:22.155999" elapsed="0.000031"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:29:22.156094" elapsed="0.000022"/>
</return>
<msg time="2026-04-17T03:29:22.158901" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:29:22.153515" elapsed="0.005445"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:22.161085" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:22.160694" elapsed="0.000565"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:22.161798" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:22.161477" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:29:22.167536" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:22.369736" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:22.772075" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:22.775845" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:29:22.164291" elapsed="0.617411">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:22.161971" elapsed="0.619930">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:22.782385" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:22.782012" elapsed="0.000481"/>
</branch>
<status status="FAIL" start="2026-04-17T03:29:22.161942" elapsed="0.620589">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:22.783288" elapsed="0.000045"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:22.783572" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:22.783478" elapsed="0.000176"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:22.783425" elapsed="0.000271"/>
</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-04-17T03:29:22.783982" elapsed="0.000043"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:29:22.784127" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:29:22.159493" elapsed="0.624859">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:22.784511" elapsed="0.000027"/>
</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-04-17T03:29:22.040400" elapsed="0.744289">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:22.785708" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:22.785350" elapsed="0.000510"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:22.784906" elapsed="0.001008"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:22.786008" elapsed="0.000033"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-04-17T03:29:22.033995" elapsed="0.752196">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:29:22.786404" level="FAIL">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-17T03:29:16.328192" elapsed="6.458423">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:29:22.786989" elapsed="0.000038"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:29:22.787292" elapsed="0.000031"/>
</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="NOT RUN" start="2026-04-17T03:29:22.787608" elapsed="0.000034"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:29:22.787877" elapsed="0.000031"/>
</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-04-17T03:29:22.788306" elapsed="0.003050"/>
</kw>
<arg>intra_vrf</arg>
<arg>${MVPN_DIR}</arg>
<status status="FAIL" start="2026-04-17T03:29:16.319906" elapsed="6.471637">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:16.254298" elapsed="6.537494">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:29:22.796372" elapsed="0.000395"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:29:22.796012" 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-04-17T03:29:22.798256" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:22.798112" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:22.798087" elapsed="0.000247"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:22.803634" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:22.803511" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:22.803492" elapsed="0.000237"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:22.805258" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:29:22.804651" elapsed="0.000648"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:29:22.806058" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:29:22.805631" elapsed="0.000461"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:29:22.806152" elapsed="0.000047"/>
</return>
<msg time="2026-04-17T03:29:22.806362" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:29:22.804073" elapsed="0.002322"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:22.814342" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:22.814160" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:22.814125" elapsed="0.000321"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:22.816255" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:22.816096" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:22.816068" elapsed="0.000288"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:22.817103" level="INFO">${karaf_connection_index} = 36</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:29:22.816631" elapsed="0.000511"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:22.817694" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:29:22.817380" elapsed="0.000351"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:29:22.818888" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:29:22.818521" elapsed="0.001281">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:29:22.820062" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:29:22.820119" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:22.817990" elapsed="0.002158"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:29:22.821211" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:29:22.820864" elapsed="0.001268">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:29:22.822377" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:29:22.822441" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:22.820380" elapsed="0.002093"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:29:22.823808" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_intra_source_as"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:29:22.822945" elapsed="0.000951">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_intra_source_as"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:22.822592" elapsed="0.001440">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_intra_source_as"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:29:22.822559" elapsed="0.001529">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_intra_source_as"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:22.824338" elapsed="0.000032"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:22.824757" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:22.824526" elapsed="0.000308"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:22.824437" elapsed="0.000434"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:29:22.824925" 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-04-17T03:29:22.828639" elapsed="0.000219"/>
</kw>
<msg time="2026-04-17T03:29:22.829079" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:22.827162" elapsed="0.002108"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:22.829667" elapsed="0.000087"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:22.830103" 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-04-17T03:29:22.826217" elapsed="0.004205"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:29:22.825381" elapsed="0.005137"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:29:22.815622" elapsed="0.015027">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_intra_source_as"</status>
</kw>
<msg time="2026-04-17T03:29:22.830809" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:29:22.830872" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_intra_source_as"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:22.814721" elapsed="0.016186"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:29:22.831229" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:22.831059" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:22.831026" elapsed="0.000307"/>
</if>
<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-04-17T03:29:22.832748" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:22.832637" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:22.832618" elapsed="0.000201"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:22.833147" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:29:22.833279" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:29:22.833001" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:22.833763" level="INFO">{1: 36}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:22.833474" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:22.834236" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:22.833983" elapsed="0.000298"/>
</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-04-17T03:29:22.834848" elapsed="0.000350"/>
</kw>
<msg time="2026-04-17T03:29:22.835323" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:29:22.835372" level="INFO">${old_connection_index} = 36</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:22.834447" 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-04-17T03:29:22.836380" elapsed="0.000255"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:29:22.837838" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:29:22.837321" elapsed="0.001480">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:22.836809" elapsed="0.002094"/>
</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-04-17T03:29:22.839626" elapsed="0.000287"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:22.839132" elapsed="0.000970"/>
</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-04-17T03:29:22.835704" elapsed="0.004447"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:22.835473" elapsed="0.004727"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:22.835454" elapsed="0.004773"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:22.841246" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:29:22.840821" elapsed="0.000462"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:29:22.841349" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:29:22.841567" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:29:22.840447" elapsed="0.001153"/>
</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-04-17T03:29:22.841815" elapsed="0.000592"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:22.842786" level="INFO">index=37
host=10.30.170.120
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-04-17T03:29:22.842922" level="INFO">${karaf_connection_object} = index=37
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:29:22.842641" elapsed="0.000493"/>
</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-04-17T03:29:22.843369" elapsed="0.003313"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:29:22.847344" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:29:22.848647" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:29:22.846956" elapsed="0.002297">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:29:22.867392" elapsed="0.000442"/>
</kw>
<msg time="2026-04-17T03:29:22.868336" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:22.865785" elapsed="0.002755"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:22.868714" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:22.868883" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:29:22.850550" elapsed="0.018442"/>
</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-04-17T03:29:22.849706" elapsed="0.019339"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:29:22.832281" elapsed="0.036863">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:22.869565" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:29:22.869647" elapsed="0.000023"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:29:22.813559" elapsed="0.056212">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:29:22.869907" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:29:22.869973" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:22.806958" elapsed="0.063039"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:22.870372" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:22.870090" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:22.870066" elapsed="0.000386"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:29:22.806724" elapsed="0.063753"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:29:22.806471" elapsed="0.064042"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:29:22.803136" elapsed="0.067440"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:29:22.797730" elapsed="0.072905"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:22.797078" elapsed="0.073604"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:29:22.792888" elapsed="0.077851"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:22.871742" 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-04-17T03:29:22.872276" 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-04-17T03:29:22.871518" elapsed="0.000787"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-17T03:29:22.872744" 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-04-17T03:29:22.872516" elapsed="0.000257"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:22.873220" 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-04-17T03:29:22.873353" 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-04-17T03:29:22.872955" elapsed="0.000425"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-17T03:29:22.873745" 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-04-17T03:29:22.873539" elapsed="0.000233"/>
</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-04-17T03:29:22.874140" elapsed="0.003014"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:22.873847" elapsed="0.003347"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:22.873827" elapsed="0.003395"/>
</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-04-17T03:29:22.920858" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:22.920371" elapsed="0.000522"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:22.921744" 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-04-17T03:29:22.921458" elapsed="0.000363">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-04-17T03:29:22.921917" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:22.921101" elapsed="0.000857"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:22.922549" 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-04-17T03:29:22.922129" elapsed="0.000448"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:22.922890" 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-04-17T03:29:22.923083" 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-04-17T03:29:22.922744" elapsed="0.000365"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:22.923521" 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-04-17T03:29:22.923271" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:22.924679" level="INFO">mapping: {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:22.924395" elapsed="0.000329"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:22.925174" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:29:22.924885" elapsed="0.000315"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:22.925876" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:29:22.925572" elapsed="0.000330"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:22.926903" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:29:22.926446" elapsed="0.000511"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:22.927018" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:29:22.927189" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:29:22.926117" 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-04-17T03:29:22.927371" elapsed="0.000243"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:29:22.925433" elapsed="0.002221"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:22.928230" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:29:22.927904" elapsed="0.000352"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:22.929547" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:29:22.929135" elapsed="0.000439"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:22.929626" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:29:22.929782" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:29:22.928448" 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-04-17T03:29:22.929978" elapsed="0.000231"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:29:22.927768" elapsed="0.002483"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:29:22.925255" elapsed="0.005032"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:29:22.930330" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:29:22.930489" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:29:22.924053" elapsed="0.006461"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:22.923652" elapsed="0.006894"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:22.930728" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:22.930573" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:22.923625" elapsed="0.007178"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:22.931583" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:29:22.930967" elapsed="0.000645"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:29:22.931661" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:29:22.919537" elapsed="0.012250"/>
</kw>
<msg time="2026-04-17T03:29:22.931844" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:22.906484" elapsed="0.025414"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:29:22.944536" elapsed="0.000059"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:29:22.957492" elapsed="0.000059"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:29:22.970085" elapsed="0.000058"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:22.970394" 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-04-17T03:29:22.970584" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:22.971040" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:22.970866" elapsed="0.000325"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:22.970848" elapsed="0.000373"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:22.971371" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:22.971542" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:22.971710" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:29:22.970808" elapsed="0.000955"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:29:22.970669" elapsed="0.001122"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:22.971956" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:22.972039" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:29:22.972210" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:29:22.900766" elapsed="0.071473"/>
</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-04-17T03:29:22.997764" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:22.997254" elapsed="0.000545"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:22.998665" 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-04-17T03:29:22.998400" elapsed="0.000344">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-04-17T03:29:22.998838" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:22.998002" elapsed="0.000861"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:22.999445" 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-04-17T03:29:22.999050" elapsed="0.000423"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:22.999783" 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-04-17T03:29:22.999979" 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-04-17T03:29:22.999640" elapsed="0.000374"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:23.000422" 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-04-17T03:29:23.000176" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-17T03:29:23.000977" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:23.000584" elapsed="0.000455"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:23.001512" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:23.001216" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:23.001067" elapsed="0.000576"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:23.000560" elapsed="0.001106"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:23.002310" 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-04-17T03:29:23.001818" elapsed="0.000523"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:29:23.002394" 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_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-04-17T03:29:22.996422" elapsed="0.006114"/>
</kw>
<msg time="2026-04-17T03:29:23.002598" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:22.983545" elapsed="0.019106"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:29:23.015916" elapsed="0.000084"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:29:23.028741" elapsed="0.000063"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_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-04-17T03:29:23.044423" elapsed="0.000112"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:23.044886" elapsed="0.000036"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:23.045199" 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-04-17T03:29:23.045838" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:23.045618" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:23.045590" elapsed="0.000389"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:23.046192" elapsed="0.000030"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:23.046587" elapsed="0.000029"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:23.046830" elapsed="0.000030"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:29:23.045529" elapsed="0.001378"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:29:23.045325" elapsed="0.001639"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:23.047177" elapsed="0.000029"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:23.047287" elapsed="0.000027"/>
</return>
<msg time="2026-04-17T03:29:23.047549" 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-04-17T03:29:22.982479" elapsed="0.065214"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:23.049696" 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-04-17T03:29:23.049204" elapsed="0.000601">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-04-17T03:29:23.049965" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:23.048749" elapsed="0.001256"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:23.050486" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:23.050113" elapsed="0.000454"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:23.051212" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:23.050851" elapsed="0.000389"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:23.050605" elapsed="0.000671"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:23.050084" elapsed="0.001214"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:23.053975" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:29:23.051470" elapsed="0.002536"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:29:23.054067" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:29:23.054266" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:29:23.048235" elapsed="0.006064"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:23.056528" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:29:23.056107" elapsed="0.000498"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:23.057155" 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-04-17T03:29:23.056828" elapsed="0.000406"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:23.057786" 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-04-17T03:29:23.057449" elapsed="0.000401"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:23.058408" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:23.058083" elapsed="0.000388"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:23.059694" 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-04-17T03:29:23.059406" elapsed="0.000325"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:29:23.060155" 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-04-17T03:29:23.059959" elapsed="0.000223"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:23.060375" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:23.061277" 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-04-17T03:29:23.060895" elapsed="0.000439"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:29:23.061395" elapsed="0.000061"/>
</return>
<msg time="2026-04-17T03:29:23.061646" 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-04-17T03:29:23.058795" elapsed="0.002885"/>
</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-04-17T03:29:23.069316" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:23.271176" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:23.673894" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:23.677009" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:29:23.065582" elapsed="0.614573">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:23.061903" elapsed="0.618427">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:29:23.680765" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:23.680397" elapsed="0.000476"/>
</branch>
<status status="FAIL" start="2026-04-17T03:29:23.061872" elapsed="0.619037">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:29:23.681591" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:23.681802" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:23.681744" elapsed="0.000126"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:23.681714" elapsed="0.000199"/>
</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-04-17T03:29:23.682160" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:29:23.682260" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>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="FAIL" start="2026-04-17T03:29:23.054753" elapsed="0.627718">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:23.682592" elapsed="0.000024"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>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="FAIL" start="2026-04-17T03:29:22.885950" elapsed="0.796786">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:23.683256" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:23.683010" elapsed="0.000345"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:23.682989" elapsed="0.000401"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:23.683436" elapsed="0.000022"/>
</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="FAIL" start="2026-04-17T03:29:22.877546" elapsed="0.806031">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:29:23.683801" elapsed="0.000023"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<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="NOT RUN" start="2026-04-17T03:29:23.684078" elapsed="0.000025"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:23.684284" elapsed="0.000023"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations">
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:23.684504" elapsed="0.000032"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:29:23.684801" elapsed="0.000025"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<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="NOT RUN" start="2026-04-17T03:29:23.685092" elapsed="0.000033"/>
</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-04-17T03:29:23.740524" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:23.740056" elapsed="0.000504"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:23.741586" 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-04-17T03:29:23.741264" elapsed="0.000402">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-04-17T03:29:23.741765" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:23.740807" elapsed="0.000991"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:23.742384" 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-04-17T03:29:23.741988" elapsed="0.000423"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:23.742760" 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-04-17T03:29:23.742987" 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-04-17T03:29:23.742604" elapsed="0.000410"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:23.743458" 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-04-17T03:29:23.743199" 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-04-17T03:29:23.744922" level="INFO">mapping: {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:23.744516" elapsed="0.000475"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:23.745456" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:29:23.745161" elapsed="0.000320"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:23.746526" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:29:23.745950" elapsed="0.000603"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:23.747978" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:29:23.747434" elapsed="0.000599"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:23.748161" elapsed="0.000047"/>
</return>
<msg time="2026-04-17T03:29:23.748417" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:29:23.746858" elapsed="0.001585"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:23.748605" elapsed="0.000591"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:29:23.745758" elapsed="0.003481"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:23.750212" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:29:23.749583" elapsed="0.000656"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:23.751859" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:29:23.751073" elapsed="0.000830"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:23.752093" elapsed="0.000045"/>
</return>
<msg time="2026-04-17T03:29:23.752340" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:29:23.750455" elapsed="0.001911"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:23.752533" elapsed="0.000578"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:29:23.749396" elapsed="0.003758"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:29:23.745544" elapsed="0.007649"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:29:23.753240" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:29:23.753435" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:29:23.744002" elapsed="0.009459"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:23.743591" elapsed="0.009909"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:23.753701" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:23.753532" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:23.743564" elapsed="0.010221"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:23.754685" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:29:23.753995" elapsed="0.000720"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:29:23.754767" elapsed="0.000034"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/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-04-17T03:29:23.739145" elapsed="0.015770"/>
</kw>
<msg time="2026-04-17T03:29:23.754997" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:23.725284" 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/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-04-17T03:29:23.769589" elapsed="0.000094"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:29:23.783983" elapsed="0.000064"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:29:23.797701" elapsed="0.000067"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:23.798066" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:23.798262" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:23.798736" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:23.798557" elapsed="0.000236"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:23.798539" elapsed="0.000281"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:23.798992" 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-04-17T03:29:23.799167" 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-04-17T03:29:23.799350" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:29:23.798497" elapsed="0.000908"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:29:23.798349" elapsed="0.001084"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:23.799647" elapsed="0.000032"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:23.799772" elapsed="0.000022"/>
</return>
<msg time="2026-04-17T03:29:23.799988" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:29:23.720377" elapsed="0.079643"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:23.801490" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:29:23.801152" elapsed="0.000407"/>
</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-04-17T03:29:23.807529" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:24.009305" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:24.411378" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:24.413301" level="INFO">${response} = None</msg>
<msg time="2026-04-17T03:29:24.413357" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:23.804252" elapsed="0.611469">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:23.801633" elapsed="0.614198">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:24.416229" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:24.415982" elapsed="0.000315"/>
</branch>
<status status="FAIL" start="2026-04-17T03:29:23.801612" elapsed="0.614710">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:24.420655" 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-04-17T03:29:24.418027" elapsed="0.002672">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:24.417759" elapsed="0.003047">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:29:24.417738" elapsed="0.003107">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-04-17T03:29:24.425052" 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-04-17T03:29:24.421524" elapsed="0.003580">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:24.420954" elapsed="0.004243">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:29:24.420915" elapsed="0.004326">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:24.426084" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:29:24.425532" elapsed="0.000580"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:24.426481" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:24.426206" elapsed="0.000335"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:24.427093" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:24.426740" elapsed="0.000380"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:24.426567" elapsed="0.000589"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:24.426180" elapsed="0.001000"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:24.427757" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:29:24.427368" elapsed="0.000417"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:24.428132" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:24.427860" elapsed="0.000330"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:24.428719" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:24.428399" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:24.428224" elapsed="0.000584"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:24.427840" 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>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:24.429028" elapsed="0.000394"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-17T03:29:24.429917" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:29:24.429595" elapsed="0.000368"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-04-17T03:29:24.432644" 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-04-17T03:29:24.430132" elapsed="0.002550">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-04-17T03:29:24.417216" elapsed="0.015658">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-04-17T03:29:24.432963" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:29:24.435652" level="INFO">${response_text} = None</msg>
<msg time="2026-04-17T03:29:24.435690" 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-04-17T03:29:23.800381" elapsed="0.635434">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-04-17T03:29:24.435901" elapsed="0.000056"/>
</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-04-17T03:29:23.687091" elapsed="0.749038">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:23.686176" elapsed="0.750029"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-04-17T03:29:23.685484" elapsed="0.750786"/>
</kw>
<arg>intra_source_as</arg>
<arg>${MVPN_DIR}</arg>
<status status="FAIL" start="2026-04-17T03:29:22.871086" elapsed="1.565269">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:22.792149" elapsed="1.644394">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:29:24.440365" elapsed="0.000277"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:29:24.440057" elapsed="0.000654"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:24.441897" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:24.441751" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:24.441725" 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-04-17T03:29:24.447378" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:24.447240" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:24.447216" elapsed="0.000242"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:24.448664" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:29:24.448201" elapsed="0.000493"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:29:24.449226" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:29:24.448894" elapsed="0.000359"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:29:24.449298" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:29:24.449467" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:29:24.447764" elapsed="0.001736"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:24.456192" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:24.455993" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:24.455957" elapsed="0.000342"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:24.457901" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:24.457760" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:24.457733" elapsed="0.000276"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:24.458514" level="INFO">${karaf_connection_index} = 37</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:29:24.458175" elapsed="0.000368"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:24.458965" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:29:24.458714" elapsed="0.000279"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:29:24.459897" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:29:24.459570" elapsed="0.001066">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:29:24.460888" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:29:24.460973" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:24.459161" elapsed="0.001946"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:29:24.462075" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:29:24.461702" elapsed="0.001301">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:29:24.463203" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:29:24.463251" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:24.461320" elapsed="0.001956"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:29:24.464342" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_intra_source_as"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:29:24.463663" elapsed="0.000746">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_intra_source_as"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:24.463371" elapsed="0.001113">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_intra_source_as"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:29:24.463344" elapsed="0.001178">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_intra_source_as"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:24.464699" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:24.465014" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:24.464845" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:24.464824" elapsed="0.000268"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:29:24.465130" elapsed="0.000018"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:29:24.468320" elapsed="0.000170"/>
</kw>
<msg time="2026-04-17T03:29:24.468571" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:24.466809" elapsed="0.001913"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:24.469138" elapsed="0.000083"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:24.469496" 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-04-17T03:29:24.466078" elapsed="0.003617"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:29:24.465455" elapsed="0.004310"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:29:24.457359" elapsed="0.012504">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_intra_source_as"</status>
</kw>
<msg time="2026-04-17T03:29:24.470100" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:29:24.470150" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_intra_source_as"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:24.456526" elapsed="0.013649"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:29:24.470404" elapsed="0.000290"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:24.470272" elapsed="0.000457"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:24.470245" elapsed="0.000509"/>
</if>
<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-04-17T03:29:24.471851" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:24.471731" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:24.471708" elapsed="0.000213"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:24.472282" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:29:24.472397" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:29:24.472126" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:24.473037" level="INFO">{1: 37}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:24.472586" elapsed="0.000500"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:24.473499" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:24.473246" elapsed="0.000299"/>
</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-04-17T03:29:24.474156" elapsed="0.000445"/>
</kw>
<msg time="2026-04-17T03:29:24.474734" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:29:24.474798" level="INFO">${old_connection_index} = 37</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:24.473713" elapsed="0.001117"/>
</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-04-17T03:29:24.476192" elapsed="0.000291"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:29:24.477834" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:29:24.477365" elapsed="0.001436">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:24.476721" elapsed="0.002189"/>
</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-04-17T03:29:24.479712" elapsed="0.000404"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:24.479170" elapsed="0.001039"/>
</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-04-17T03:29:24.475435" elapsed="0.004825"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:24.475084" elapsed="0.005237"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:24.474913" elapsed="0.005453"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:24.481616" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:29:24.481226" elapsed="0.000420"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:29:24.481703" elapsed="0.000049"/>
</return>
<msg time="2026-04-17T03:29:24.481884" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:29:24.480664" elapsed="0.001246"/>
</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-04-17T03:29:24.482096" elapsed="0.000460"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:24.482864" level="INFO">index=38
host=10.30.170.120
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-04-17T03:29:24.482999" level="INFO">${karaf_connection_object} = index=38
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:29:24.482735" elapsed="0.000292"/>
</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-04-17T03:29:24.483182" elapsed="0.002986"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:29:24.486765" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:29:24.488278" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:29:24.486418" elapsed="0.002400">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:29:24.504561" elapsed="0.000508"/>
</kw>
<msg time="2026-04-17T03:29:24.505184" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:24.502649" elapsed="0.002707"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:24.505535" elapsed="0.000025"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:24.505708" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:29:24.489949" elapsed="0.015850"/>
</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-04-17T03:29:24.489257" elapsed="0.016594"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:29:24.471337" elapsed="0.034630">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:24.506391" elapsed="0.000033"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:29:24.506562" 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="FAIL" start="2026-04-17T03:29:24.455419" elapsed="0.051270">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:29:24.506812" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:29:24.506858" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:24.449906" elapsed="0.056977"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:24.507322" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:24.506997" elapsed="0.000398"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:24.506970" elapsed="0.000458"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:29:24.449755" elapsed="0.057706"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:29:24.449563" elapsed="0.057938"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:29:24.446751" elapsed="0.060814"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:29:24.441408" elapsed="0.066219"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:24.440905" elapsed="0.066769"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:29:24.437435" elapsed="0.070298"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:24.509766" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:24.509061" elapsed="0.000738"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:24.510473" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:24.510000" elapsed="0.000501"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:24.511071" 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-04-17T03:29:24.510668" elapsed="0.000431"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:24.511497" 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-04-17T03:29:24.511729" 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-04-17T03:29:24.511266" elapsed="0.000499"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:24.512469" 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-04-17T03:29:24.512606" 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-04-17T03:29:24.512249" elapsed="0.000382"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-04-17T03:29:24.512814" elapsed="0.002667"/>
</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-04-17T03:29:24.515684" elapsed="0.002082"/>
</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-04-17T03:29:24.579564" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:24.578868" elapsed="0.000748"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:24.580943" 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-04-17T03:29:24.580457" elapsed="0.000600">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-04-17T03:29:24.581454" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:24.579880" elapsed="0.001600"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:24.582076" 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-04-17T03:29:24.581654" elapsed="0.000451"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:24.582440" 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-04-17T03:29:24.582609" 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-04-17T03:29:24.582288" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:24.583082" 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-04-17T03:29:24.582799" elapsed="0.000336"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:24.584332" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:24.583998" elapsed="0.000382"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:24.584854" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:29:24.584546" elapsed="0.000335"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:24.585729" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:24.585300" elapsed="0.000455"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:24.587090" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:24.586497" elapsed="0.000698"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:24.587293" elapsed="0.000047"/>
</return>
<msg time="2026-04-17T03:29:24.587613" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:24.585990" elapsed="0.001649"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:24.587799" elapsed="0.000424"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:29:24.585146" elapsed="0.003126"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:24.591335" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:29:24.590758" elapsed="0.000609"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:24.592896" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:29:24.592228" elapsed="0.000790"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:24.593108" elapsed="0.000045"/>
</return>
<msg time="2026-04-17T03:29:24.593483" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:29:24.591655" elapsed="0.001857"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:24.593680" elapsed="0.000469"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:29:24.588401" elapsed="0.005793"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:29:24.584962" elapsed="0.009272"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:29:24.594282" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:29:24.594488" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:29:24.583620" elapsed="0.010895"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:24.583226" elapsed="0.011324"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:24.594748" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:24.594582" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:24.583199" elapsed="0.011628"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:24.595762" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:29:24.595076" elapsed="0.000716"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:29:24.595842" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name} exists. If 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-04-17T03:29:24.577759" elapsed="0.018317"/>
</kw>
<msg time="2026-04-17T03:29:24.596141" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:24.564271" elapsed="0.031927"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:29:24.609554" elapsed="0.000073"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:29:24.622718" elapsed="0.000074"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</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-04-17T03:29:24.635788" elapsed="0.000066"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:24.636143" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:24.636338" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:24.636779" elapsed="0.000097"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:24.636619" elapsed="0.000330"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:24.636603" 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-04-17T03:29:24.637165" 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-04-17T03:29:24.637348" 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-04-17T03:29:24.637544" elapsed="0.000030"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:29:24.636564" elapsed="0.001054"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:29:24.636424" elapsed="0.001228"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:24.637816" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:24.637916" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:29:24.638158" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:29:24.559698" elapsed="0.078499"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:24.639877" 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-04-17T03:29:24.639547" elapsed="0.000436">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/mvpn/intra_source_as/rib/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-17T03:29:24.640097" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:24.639127" elapsed="0.001002"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:24.640490" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:24.640211" elapsed="0.000340"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:24.641156" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:24.640778" elapsed="0.000408"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:24.640577" elapsed="0.000645"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:24.640189" elapsed="0.001055"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:24.644102" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:29:24.641406" elapsed="0.002729"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:29:24.644203" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:29:24.644387" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:29:24.638597" elapsed="0.005816"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:24.645956" 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-04-17T03:29:24.645635" elapsed="0.000399">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-04-17T03:29:24.646132" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:24.645253" elapsed="0.000903"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:29:24.646404" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-17T03:29:24.646247" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:24.646224" 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-04-17T03:29:24.646648" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:24.646827" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:29:24.646893" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:29:24.648949" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:29:24.644782" elapsed="0.004196"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:24.650565" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:24.650225" elapsed="0.000390"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:24.651038" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:24.650774" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:29:24.656284" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:24.858094" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:25.260894" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:25.263201" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:29:24.653296" elapsed="0.613749">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:24.651153" elapsed="0.616097">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:25.267765" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:25.267339" elapsed="0.000569"/>
</branch>
<status status="FAIL" start="2026-04-17T03:29:24.651133" elapsed="0.616858">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:25.268833" elapsed="0.000051"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:25.269161" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:25.269079" elapsed="0.000169"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:25.269037" elapsed="0.000253"/>
</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-04-17T03:29:25.269572" elapsed="0.000043"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:29:25.269710" elapsed="0.000031"/>
</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-04-17T03:29:24.649350" elapsed="0.620603">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:25.270102" 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-04-17T03:29:24.529792" elapsed="0.740454">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:25.270641" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:25.270383" elapsed="0.000357"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:25.270357" elapsed="0.000418"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:25.270821" elapsed="0.000021"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-04-17T03:29:24.523395" elapsed="0.747584">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:27.341559" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:27.340967" elapsed="0.000636"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:27.342794" 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-04-17T03:29:27.342499" elapsed="0.000382">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-04-17T03:29:27.343024" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:27.341985" elapsed="0.001073"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:27.343850" 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-04-17T03:29:27.343302" elapsed="0.000587"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:27.344359" 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-04-17T03:29:27.344592" 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-04-17T03:29:27.344146" elapsed="0.000485"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:27.345262" 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-04-17T03:29:27.344872" elapsed="0.000457"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:27.346780" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:27.346370" elapsed="0.000475"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:27.347531" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:29:27.347123" elapsed="0.000446"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:27.348748" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:27.348141" elapsed="0.000644"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:27.350693" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:27.349901" elapsed="0.000929"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:27.350963" elapsed="0.000069"/>
</return>
<msg time="2026-04-17T03:29:27.351424" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:27.349123" elapsed="0.002340"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:27.351701" elapsed="0.000631"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:29:27.347912" elapsed="0.004482"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:27.353980" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:29:27.352800" elapsed="0.001223"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:27.355858" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:29:27.355081" elapsed="0.000962"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:27.356164" elapsed="0.000064"/>
</return>
<msg time="2026-04-17T03:29:27.356616" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:29:27.354352" elapsed="0.002300"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:27.356901" elapsed="0.000645"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:29:27.352583" elapsed="0.005026"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:29:27.347646" elapsed="0.010021"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:29:27.357738" elapsed="0.000050"/>
</return>
<msg time="2026-04-17T03:29:27.358013" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:29:27.345921" elapsed="0.012131"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:27.345470" elapsed="0.012633"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:27.358404" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:27.358150" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:27.345429" elapsed="0.013188"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:27.359698" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:29:27.358798" elapsed="0.000933"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:29:27.359784" elapsed="0.000035"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:29:27.339789" elapsed="0.020273"/>
</kw>
<msg time="2026-04-17T03:29:27.360133" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:27.323981" elapsed="0.036213"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:29:27.375082" elapsed="0.000073"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:29:27.392007" elapsed="0.000087"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_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-04-17T03:29:27.407016" elapsed="0.000080"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:27.407391" 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-04-17T03:29:27.407593" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:27.408078" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:27.407891" elapsed="0.000244"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:27.407872" elapsed="0.000290"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:27.408313" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:27.408497" 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-04-17T03:29:27.408670" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:29:27.407831" elapsed="0.000892"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:29:27.407681" elapsed="0.001070"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:27.408901" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:27.409002" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:29:27.409191" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:29:27.318688" elapsed="0.090534"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:27.411299" 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-04-17T03:29:27.410864" elapsed="0.000547">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-04-17T03:29:27.411554" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:27.410306" elapsed="0.001285"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:27.412129" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:27.411709" elapsed="0.000507"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:27.413041" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:27.412535" elapsed="0.000545"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:27.412252" elapsed="0.000879"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:27.411676" elapsed="0.001489"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:27.417240" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:29:27.413433" elapsed="0.003858"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:29:27.417450" elapsed="0.000071"/>
</return>
<msg time="2026-04-17T03:29:27.417736" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:29:27.409845" elapsed="0.007928"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:27.419879" 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-04-17T03:29:27.419471" elapsed="0.000538">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-04-17T03:29:27.420156" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:27.418882" elapsed="0.001315"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:29:27.420532" elapsed="0.000044"/>
</return>
<status status="PASS" start="2026-04-17T03:29:27.420312" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:27.420279" elapsed="0.000386"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:27.420883" 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-04-17T03:29:27.421163" elapsed="0.000033"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:29:27.421263" elapsed="0.000025"/>
</return>
<msg time="2026-04-17T03:29:27.424222" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:29:27.418335" elapsed="0.005932"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:27.426239" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:27.425901" elapsed="0.000411"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:27.426872" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:27.426531" elapsed="0.000426"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:29:27.433496" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:27.635450" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:28.037860" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:28.040257" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:29:27.429874" elapsed="0.613835">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:27.427065" elapsed="0.616800">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:28.044275" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:28.043951" elapsed="0.000428"/>
</branch>
<status status="FAIL" start="2026-04-17T03:29:27.427033" elapsed="0.617384">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:28.045091" elapsed="0.000040"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:28.045307" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:28.045247" elapsed="0.000127"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:28.045220" elapsed="0.000186"/>
</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-04-17T03:29:28.045678" elapsed="0.000048"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:29:28.045820" elapsed="0.000024"/>
</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-04-17T03:29:27.424805" elapsed="0.621218">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:28.046143" 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-04-17T03:29:27.289113" elapsed="0.757179">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:28.047150" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:28.046436" elapsed="0.000827"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:28.046410" elapsed="0.000890"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:28.047350" elapsed="0.000022"/>
</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-04-17T03:29:27.282190" elapsed="0.765315">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:30.104826" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:30.104382" elapsed="0.000495"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:30.105890" 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-04-17T03:29:30.105583" elapsed="0.000465">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-04-17T03:29:30.106149" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:30.105100" elapsed="0.001075"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:30.106814" 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-04-17T03:29:30.106391" elapsed="0.000452"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:30.107183" 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-04-17T03:29:30.107354" 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-04-17T03:29:30.107033" elapsed="0.000349"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:30.107813" 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-04-17T03:29:30.107545" elapsed="0.000338"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:30.109031" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:30.108660" elapsed="0.000424"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:30.109592" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:29:30.109262" elapsed="0.000368"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:30.110616" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:30.110119" elapsed="0.000525"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:30.112273" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:30.111483" elapsed="0.000897"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:30.112466" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:29:30.112781" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:30.110895" elapsed="0.001915"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:30.113017" elapsed="0.000414"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:29:30.109903" elapsed="0.003572"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:30.114300" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:29:30.113780" elapsed="0.000549"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:30.115718" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:29:30.115080" elapsed="0.000762"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:30.115965" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:29:30.116327" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:29:30.114543" elapsed="0.001815"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:30.116522" elapsed="0.000381"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:29:30.113596" elapsed="0.003383"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:29:30.109691" elapsed="0.007333"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:29:30.117072" elapsed="0.000045"/>
</return>
<msg time="2026-04-17T03:29:30.117329" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:29:30.108322" elapsed="0.009048"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:30.107987" elapsed="0.009429"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:30.117659" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:30.117452" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:30.107960" elapsed="0.009811"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:30.118655" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:29:30.117992" elapsed="0.000703"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:29:30.118760" elapsed="0.000041"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as/rib/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:29:30.103682" elapsed="0.015261"/>
</kw>
<msg time="2026-04-17T03:29:30.119019" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:30.089709" elapsed="0.029382"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:29:30.133435" elapsed="0.000062"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:29:30.147438" elapsed="0.000078"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</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-04-17T03:29:30.161763" elapsed="0.000063"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:30.162118" 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-04-17T03:29:30.162347" 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-04-17T03:29:30.162915" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:30.162692" elapsed="0.000324"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:30.162667" elapsed="0.000384"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:30.163233" 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-04-17T03:29:30.163416" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:30.163611" elapsed="0.000027"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:29:30.162615" elapsed="0.001066"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:29:30.162449" elapsed="0.001270"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:30.163948" elapsed="0.000030"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:30.164157" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:29:30.164398" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:29:30.084827" elapsed="0.079615"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:30.166512" 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-04-17T03:29:30.166118" elapsed="0.000502">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-04-17T03:29:30.166750" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:30.165474" elapsed="0.001314"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:30.167301" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:30.166899" elapsed="0.000481"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:30.168151" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:30.167686" elapsed="0.000503"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:30.167418" elapsed="0.000820"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:30.166869" elapsed="0.001400"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:30.172195" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:29:30.168494" elapsed="0.003749"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:29:30.172336" elapsed="0.000063"/>
</return>
<msg time="2026-04-17T03:29:30.172600" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:29:30.164983" elapsed="0.007652"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:30.174784" 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-04-17T03:29:30.174379" elapsed="0.000513">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-04-17T03:29:30.175051" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:30.173722" elapsed="0.001365"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:29:30.175417" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-04-17T03:29:30.175201" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:30.175170" 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-04-17T03:29:30.175748" elapsed="0.000030"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:30.176016" elapsed="0.000032"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:29:30.176113" elapsed="0.000023"/>
</return>
<msg time="2026-04-17T03:29:30.178957" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:29:30.173192" elapsed="0.005808"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:30.181221" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:30.180800" elapsed="0.000478"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:30.181805" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:30.181482" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:29:30.188553" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:30.390356" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:30.792872" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:30.795654" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:29:30.184955" elapsed="0.615789">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:30.182022" elapsed="0.619061">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:30.801629" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:30.801191" elapsed="0.000591"/>
</branch>
<status status="FAIL" start="2026-04-17T03:29:30.181981" elapsed="0.619855">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:30.802826" elapsed="0.000059"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:30.803165" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:30.803079" elapsed="0.000180"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:30.803038" elapsed="0.000269"/>
</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-04-17T03:29:30.803636" elapsed="0.000047"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:29:30.803790" elapsed="0.000032"/>
</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-04-17T03:29:30.179542" elapsed="0.624521">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:30.804236" elapsed="0.000034"/>
</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-04-17T03:29:30.060523" elapsed="0.743930">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:30.805672" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:30.804708" elapsed="0.001426"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:30.804655" elapsed="0.001557"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:30.806302" elapsed="0.000038"/>
</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-04-17T03:29:30.054820" elapsed="0.751724">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:29:30.806782" level="FAIL">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-17T03:29:24.518009" elapsed="6.289102">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:29:30.807405" elapsed="0.000023"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:29:30.807599" elapsed="0.000020"/>
</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="NOT RUN" start="2026-04-17T03:29:30.807779" elapsed="0.000020"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:29:30.807963" elapsed="0.000021"/>
</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-04-17T03:29:30.808229" elapsed="0.002915"/>
</kw>
<arg>intra_source_as</arg>
<arg>${MVPN_DIR}</arg>
<status status="FAIL" start="2026-04-17T03:29:24.508478" elapsed="6.302757">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:24.436872" elapsed="6.374565">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:29:30.815170" elapsed="0.000322"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:29:30.814861" elapsed="0.000719"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:30.817195" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:30.817007" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:30.816975" elapsed="0.000328"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:30.824401" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:30.824271" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:30.824249" elapsed="0.000227"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:30.825597" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:29:30.825163" elapsed="0.000464"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:29:30.826151" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:29:30.825796" elapsed="0.000383"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:29:30.826298" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:29:30.826471" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:29:30.824740" elapsed="0.001757"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:30.832334" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:30.832217" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:30.832196" elapsed="0.000207"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:30.833621" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:30.833511" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:30.833493" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:30.834227" level="INFO">${karaf_connection_index} = 38</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:29:30.833839" elapsed="0.000416"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:30.834645" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:29:30.834421" elapsed="0.000249"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:29:30.835493" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:29:30.835207" elapsed="0.000966">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:29:30.836363" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:29:30.836409" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:30.834833" elapsed="0.001600"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:29:30.837217" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:29:30.836967" elapsed="0.000903">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:29:30.838112" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:29:30.838161" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:30.836606" elapsed="0.001579"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:29:30.839220" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_intra_source_as_4"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:29:30.838502" elapsed="0.000842">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_intra_source_as_4"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:30.838267" elapsed="0.001236">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_intra_source_as_4"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:29:30.838245" elapsed="0.001335">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_intra_source_as_4"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:30.840045" elapsed="0.000056"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:30.840573" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:30.840249" elapsed="0.000439"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:30.840211" elapsed="0.000527"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:29:30.840814" 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-04-17T03:29:30.845049" elapsed="0.000220"/>
</kw>
<msg time="2026-04-17T03:29:30.845366" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:30.843855" 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-04-17T03:29:30.845901" elapsed="0.000113"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:30.846310" 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-04-17T03:29:30.843089" elapsed="0.003428"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:29:30.841485" elapsed="0.005102"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:29:30.833186" elapsed="0.013494">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_intra_source_as_4"</status>
</kw>
<msg time="2026-04-17T03:29:30.846894" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:29:30.847019" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Odl_To_Play_intra_source_as_4"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:30.832559" elapsed="0.014498"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:29:30.847280" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:30.847154" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:30.847131" elapsed="0.000223"/>
</if>
<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-04-17T03:29:30.848657" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:30.848545" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:30.848526" elapsed="0.000208"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:30.849149" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:29:30.849297" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:29:30.848964" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:30.849860" level="INFO">{1: 38}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:30.849520" elapsed="0.000443"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:30.850474" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:30.850202" elapsed="0.000318"/>
</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-04-17T03:29:30.851301" elapsed="0.000320"/>
</kw>
<msg time="2026-04-17T03:29:30.851725" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:29:30.851773" level="INFO">${old_connection_index} = 38</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:30.850717" elapsed="0.001079"/>
</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-04-17T03:29:30.852736" elapsed="0.000218"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:29:30.854283" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:29:30.853692" elapsed="0.001601">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:30.853176" elapsed="0.002223"/>
</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-04-17T03:29:30.856095" elapsed="0.000289"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:30.855588" elapsed="0.000883"/>
</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-04-17T03:29:30.852201" elapsed="0.004318"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:30.851875" elapsed="0.004696"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:30.851855" elapsed="0.004748"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:30.857559" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:29:30.857233" elapsed="0.000353"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:29:30.857638" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:29:30.857802" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:29:30.856843" elapsed="0.000985"/>
</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-04-17T03:29:30.858027" elapsed="0.000559"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:30.858894" level="INFO">index=39
host=10.30.170.120
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-04-17T03:29:30.859065" level="INFO">${karaf_connection_object} = index=39
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:29:30.858767" elapsed="0.000324"/>
</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-04-17T03:29:30.859245" elapsed="0.002479"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:29:30.862368" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:29:30.863711" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:29:30.861994" elapsed="0.002385">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:29:30.881299" elapsed="0.000430"/>
</kw>
<msg time="2026-04-17T03:29:30.881840" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:30.879277" elapsed="0.002832"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:30.882355" elapsed="0.000027"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:30.882538" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:29:30.865864" elapsed="0.016765"/>
</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-04-17T03:29:30.864909" elapsed="0.017770"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:29:30.848154" elapsed="0.034621">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:30.883222" elapsed="0.000037"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:29:30.883327" elapsed="0.000036"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:29:30.831846" elapsed="0.051661">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:29:30.883665" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:29:30.883712" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:30.826887" elapsed="0.056848"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:30.884142" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:30.883829" elapsed="0.000368"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:30.883805" elapsed="0.000417"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:29:30.826738" elapsed="0.057509"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:29:30.826554" elapsed="0.057729"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:29:30.823833" elapsed="0.060512"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:29:30.816537" elapsed="0.067867"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:30.815810" elapsed="0.068643"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:29:30.812514" elapsed="0.071995"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:30.885561" 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-04-17T03:29:30.885787" 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-04-17T03:29:30.885339" elapsed="0.000475"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-17T03:29:30.886497" 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-04-17T03:29:30.886268" elapsed="0.000256"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:30.886947" 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-04-17T03:29:30.887153" 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-04-17T03:29:30.886682" elapsed="0.000498"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-17T03:29:30.887547" 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-04-17T03:29:30.887340" elapsed="0.000248"/>
</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-04-17T03:29:30.887965" elapsed="0.003072"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:30.887684" elapsed="0.003393"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:30.887662" elapsed="0.003443"/>
</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-04-17T03:29:30.933479" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:30.933039" elapsed="0.000474"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:30.934369" 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-04-17T03:29:30.934062" elapsed="0.000387">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-04-17T03:29:30.934547" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:30.933693" elapsed="0.000879"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:30.935160" 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-04-17T03:29:30.934744" elapsed="0.000444"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:30.935499" 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-04-17T03:29:30.935673" 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-04-17T03:29:30.935355" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:30.936134" 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-04-17T03:29:30.935863" 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-04-17T03:29:30.937252" level="INFO">mapping: {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:30.936986" elapsed="0.000313"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:30.937737" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:29:30.937467" elapsed="0.000296"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:30.938490" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:29:30.938180" elapsed="0.000336"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:30.939512" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:29:30.939054" elapsed="0.000484"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:30.939594" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:29:30.939762" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:29:30.938710" elapsed="0.001077"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:30.939981" elapsed="0.000250"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:29:30.938005" elapsed="0.002270"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:30.940827" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:29:30.940527" elapsed="0.000325"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:30.942013" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:29:30.941588" elapsed="0.000452"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:30.942218" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:29:30.942382" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:29:30.941056" 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-04-17T03:29:30.942728" elapsed="0.000248"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:29:30.940391" elapsed="0.002627"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:29:30.937814" elapsed="0.005239"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:29:30.943096" elapsed="0.000027"/>
</return>
<msg time="2026-04-17T03:29:30.943254" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:29:30.936630" elapsed="0.006649"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:30.936265" elapsed="0.007046"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:30.943493" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:30.943339" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:30.936239" elapsed="0.007331"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:30.944366" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:29:30.943717" elapsed="0.000678"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:29:30.944445" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:29:30.932278" elapsed="0.012293"/>
</kw>
<msg time="2026-04-17T03:29:30.944627" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:30.919272" elapsed="0.025407"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:29:30.957448" 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/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-04-17T03:29:30.970614" elapsed="0.000056"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</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-04-17T03:29:30.987131" elapsed="0.000064"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:30.987491" 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-04-17T03:29:30.987708" 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-04-17T03:29:30.988175" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:30.988015" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:30.987997" 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-04-17T03:29:30.988409" 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-04-17T03:29:30.988689" 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-04-17T03:29:30.988866" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:29:30.987957" elapsed="0.000963"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:29:30.987801" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:30.989120" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:30.989202" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:29:30.989365" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:29:30.914849" elapsed="0.074546"/>
</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-04-17T03:29:31.016167" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:31.015631" elapsed="0.000586"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:31.017282" 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-04-17T03:29:31.016849" elapsed="0.000527">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-04-17T03:29:31.017479" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:31.016410" elapsed="0.001093"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:31.018203" 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-04-17T03:29:31.017674" elapsed="0.000566"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:31.018603" 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-04-17T03:29:31.018832" 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-04-17T03:29:31.018434" elapsed="0.000444"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:31.019410" 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-04-17T03:29:31.019089" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-17T03:29:31.020058" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:31.019592" elapsed="0.000541"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:31.020708" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:31.020342" elapsed="0.000399"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:31.020163" elapsed="0.000615"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:31.019563" elapsed="0.001259"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:31.021551" 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-04-17T03:29:31.021074" elapsed="0.000508"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:29:31.021635" 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/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-04-17T03:29:31.014719" elapsed="0.007085"/>
</kw>
<msg time="2026-04-17T03:29:31.021867" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:31.000993" elapsed="0.020929"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:29:31.035649" elapsed="0.000063"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:29:31.048965" elapsed="0.000065"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:29:31.067071" elapsed="0.000058"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:31.067381" 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-04-17T03:29:31.067569" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:31.068018" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:31.067847" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:31.067829" elapsed="0.000273"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:31.068251" 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-04-17T03:29:31.068422" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:31.068591" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:29:31.067791" elapsed="0.000853"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:29:31.067653" elapsed="0.001018"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:31.068820" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:31.068899" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:29:31.069092" 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-04-17T03:29:30.999862" elapsed="0.069262"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:31.071183" 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-04-17T03:29:31.070786" elapsed="0.000476">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-04-17T03:29:31.071363" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:31.070099" elapsed="0.001289"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:31.071736" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:31.071461" elapsed="0.000334"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:31.072447" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:31.072065" elapsed="0.000416"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:31.071820" elapsed="0.000701"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:31.071442" elapsed="0.001101"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:31.075168" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:29:31.072717" elapsed="0.002479"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:29:31.075252" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:29:31.075631" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:29:31.069703" elapsed="0.005954"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:31.077298" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:29:31.077031" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:31.077748" 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-04-17T03:29:31.077506" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:31.078323" 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-04-17T03:29:31.077983" elapsed="0.000389"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:31.078782" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:31.078531" elapsed="0.000296"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:31.079686" 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-04-17T03:29:31.079480" elapsed="0.000233"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:29:31.080064" 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-04-17T03:29:31.079868" elapsed="0.000222"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:31.080246" elapsed="0.000217"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:31.080874" 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-04-17T03:29:31.080621" elapsed="0.000297"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:29:31.080978" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:29:31.081197" 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-04-17T03:29:31.079058" elapsed="0.002174"/>
</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-04-17T03:29:31.087857" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:31.290041" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:31.692777" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:31.695702" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:29:31.084042" elapsed="0.615369">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:31.081401" elapsed="0.618179">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:29:31.700034" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:31.699645" elapsed="0.000504"/>
</branch>
<status status="FAIL" start="2026-04-17T03:29:31.081380" elapsed="0.618808">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:29:31.700856" elapsed="0.000048"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:31.701197" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:31.701115" elapsed="0.000174"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:31.701072" elapsed="0.000259"/>
</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-04-17T03:29:31.701567" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:29:31.701668" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>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="FAIL" start="2026-04-17T03:29:31.076037" elapsed="0.625807">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:31.702004" elapsed="0.000027"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>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="FAIL" start="2026-04-17T03:29:30.899839" elapsed="0.802331">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:31.702880" elapsed="0.000074"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:31.702520" elapsed="0.000507"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:31.702484" elapsed="0.000582"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:31.703118" 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="FAIL" start="2026-04-17T03:29:30.891412" elapsed="0.811863">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:29:31.703566" elapsed="0.000034"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<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="NOT RUN" start="2026-04-17T03:29:31.703919" elapsed="0.000057"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:31.704209" elapsed="0.000031"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations">
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:31.704485" elapsed="0.000034"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:29:31.704761" elapsed="0.000030"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<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="NOT RUN" start="2026-04-17T03:29:31.705114" elapsed="0.000045"/>
</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-04-17T03:29:31.754266" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:31.753776" elapsed="0.000581"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:31.755216" 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-04-17T03:29:31.754915" elapsed="0.000376">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-04-17T03:29:31.755389" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:31.754547" elapsed="0.000867"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:31.756011" 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-04-17T03:29:31.755586" elapsed="0.000470"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:31.756396" 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-04-17T03:29:31.756568" 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-04-17T03:29:31.756240" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:31.757035" 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-04-17T03:29:31.756759" elapsed="0.000332"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:31.758243" level="INFO">mapping: {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:31.757964" elapsed="0.000352"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:31.758964" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:29:31.758673" elapsed="0.000319"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:31.759967" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:29:31.759379" elapsed="0.000617"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:31.761377" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:29:31.760774" elapsed="0.000648"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:31.761542" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:29:31.761787" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:29:31.760277" elapsed="0.001536"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:31.761991" elapsed="0.000583"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:29:31.759237" elapsed="0.003381"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:31.763478" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:29:31.762878" elapsed="0.000633"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:31.765022" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:29:31.764297" elapsed="0.000770"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:31.765191" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:29:31.765429" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:29:31.763724" elapsed="0.001731"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:31.765613" elapsed="0.000515"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:29:31.762739" elapsed="0.003433"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:29:31.759045" elapsed="0.007170"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:29:31.766263" elapsed="0.000075"/>
</return>
<msg time="2026-04-17T03:29:31.766478" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:29:31.757560" elapsed="0.008944"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:31.757178" elapsed="0.009358"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:31.766727" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:31.766566" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:31.757151" elapsed="0.009654"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:31.767676" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:29:31.766991" elapsed="0.000715"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:29:31.767757" 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-04-17T03:29:31.752876" elapsed="0.015010"/>
</kw>
<msg time="2026-04-17T03:29:31.767977" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:31.739275" elapsed="0.028774"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:29:31.781727" elapsed="0.000067"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:29:31.795297" elapsed="0.000064"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:29:31.808787" elapsed="0.000060"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:31.809171" elapsed="0.000039"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:31.809429" 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-04-17T03:29:31.810022" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:31.809794" elapsed="0.000303"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:31.809771" elapsed="0.000361"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:31.810392" 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-04-17T03:29:31.810626" 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-04-17T03:29:31.810853" elapsed="0.000026"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:29:31.809719" elapsed="0.001204"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:29:31.809541" elapsed="0.001440"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:31.811159" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:31.811243" elapsed="0.000022"/>
</return>
<msg time="2026-04-17T03:29:31.811452" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:29:31.734441" elapsed="0.077045"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:31.812991" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:29:31.812661" elapsed="0.000385"/>
</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-04-17T03:29:31.818333" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:32.019884" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:32.423368" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:32.426590" level="INFO">${response} = None</msg>
<msg time="2026-04-17T03:29:32.426711" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:31.815478" elapsed="0.615246">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:31.813119" elapsed="0.617785">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:32.431487" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:32.431132" elapsed="0.000479"/>
</branch>
<status status="FAIL" start="2026-04-17T03:29:31.813099" elapsed="0.618551">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:32.438182" 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-04-17T03:29:32.434193" elapsed="0.004051">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:32.433725" elapsed="0.004633">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:29:32.433693" elapsed="0.004718">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-04-17T03:29:32.441610" 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-04-17T03:29:32.439059" elapsed="0.002586">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:32.438630" elapsed="0.003083">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:29:32.438596" elapsed="0.003151">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:32.442549" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:29:32.442008" elapsed="0.000569"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:32.442916" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:32.442654" elapsed="0.000338"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:32.443530" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:32.443191" elapsed="0.000366"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:32.443017" elapsed="0.000577"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:32.442634" elapsed="0.000981"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:32.444187" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:29:32.443789" elapsed="0.000427"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:32.444660" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:32.444287" elapsed="0.000431"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:32.445234" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:32.444908" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:32.444742" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:32.444268" elapsed="0.001054"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:32.445493" elapsed="0.000358"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-17T03:29:32.446380" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:29:32.446039" elapsed="0.000368"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-04-17T03:29:32.449312" 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-04-17T03:29:32.446628" elapsed="0.002723">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-04-17T03:29:32.432907" elapsed="0.016610">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-04-17T03:29:32.449590" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:29:32.452589" level="INFO">${response_text} = None</msg>
<msg time="2026-04-17T03:29:32.452623" 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-04-17T03:29:31.811886" elapsed="0.640853">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-04-17T03:29:32.452817" elapsed="0.000031"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="FAIL" start="2026-04-17T03:29:31.707341" elapsed="0.745687">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:31.706514" elapsed="0.746595"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-04-17T03:29:31.705614" elapsed="0.747565"/>
</kw>
<arg>intra_source_as_4</arg>
<arg>${MVPN_DIR}</arg>
<status status="FAIL" start="2026-04-17T03:29:30.884818" elapsed="1.568441">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:30.811923" elapsed="1.641518">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:29:32.457198" elapsed="0.000288"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:29:32.456886" 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-04-17T03:29:32.458758" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:32.458615" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:32.458591" elapsed="0.000242"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:32.464223" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:32.464095" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:32.464073" elapsed="0.000225"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:32.465577" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:29:32.465055" elapsed="0.000558"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:29:32.466200" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:29:32.465828" elapsed="0.000398"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:29:32.466273" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:29:32.466463" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:29:32.464569" elapsed="0.001919"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:32.472604" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:32.472483" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:32.472459" elapsed="0.000222"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:32.474101" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:32.473990" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:32.473970" elapsed="0.000223"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:32.474696" level="INFO">${karaf_connection_index} = 39</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:29:32.474350" elapsed="0.000374"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:32.475169" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:29:32.474912" elapsed="0.000284"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:29:32.476127" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:29:32.475724" elapsed="0.001240">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:29:32.477179" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:29:32.477225" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:32.475366" elapsed="0.001953"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:29:32.478210" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:29:32.477855" elapsed="0.001207">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:29:32.479258" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:29:32.479312" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:32.477499" elapsed="0.001837"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:29:32.480463" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_intra_source_as_4"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:29:32.479659" elapsed="0.000871">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_intra_source_as_4"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:32.479418" elapsed="0.001185">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_intra_source_as_4"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:29:32.479397" elapsed="0.001241">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_intra_source_as_4"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:32.480811" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:32.481083" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:32.480898" elapsed="0.000244"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:32.480881" elapsed="0.000284"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:29:32.481202" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:29:32.484266" elapsed="0.000193"/>
</kw>
<msg time="2026-04-17T03:29:32.484538" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:32.483029" 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-04-17T03:29:32.484983" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:32.485331" 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-04-17T03:29:32.482203" elapsed="0.003322"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:29:32.481513" elapsed="0.004077"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:29:32.473621" elapsed="0.012058">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_intra_source_as_4"</status>
</kw>
<msg time="2026-04-17T03:29:32.485796" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:29:32.485856" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_intra_source_as_4"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:32.472876" elapsed="0.013009"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:29:32.486157" elapsed="0.000306"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:32.486003" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:32.485979" elapsed="0.000547"/>
</if>
<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-04-17T03:29:32.487532" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:32.487420" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:32.487401" elapsed="0.000204"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:32.487945" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:29:32.488094" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:29:32.487786" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:32.488616" level="INFO">{1: 39}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:32.488286" elapsed="0.000377"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:32.489158" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:32.488823" elapsed="0.000389"/>
</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-04-17T03:29:32.489817" elapsed="0.000440"/>
</kw>
<msg time="2026-04-17T03:29:32.490363" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:29:32.490411" level="INFO">${old_connection_index} = 39</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:32.489386" elapsed="0.001091"/>
</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-04-17T03:29:32.491502" elapsed="0.000201"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:29:32.492842" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:29:32.492376" elapsed="0.001423">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:32.491875" elapsed="0.002026"/>
</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-04-17T03:29:32.494620" elapsed="0.000420"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:32.494100" elapsed="0.001035"/>
</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-04-17T03:29:32.490806" elapsed="0.004378"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:32.490566" elapsed="0.004668"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:32.490544" elapsed="0.004721"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:32.496319" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:29:32.495982" elapsed="0.000364"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:29:32.496400" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:29:32.496573" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:29:32.495542" elapsed="0.001055"/>
</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-04-17T03:29:32.496789" elapsed="0.000551"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:32.497673" level="INFO">index=40
host=10.30.170.120
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-04-17T03:29:32.497778" level="INFO">${karaf_connection_object} = index=40
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:29:32.497542" elapsed="0.000262"/>
</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-04-17T03:29:32.497976" elapsed="0.002725"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:29:32.501247" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:29:32.502505" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:29:32.500907" elapsed="0.002213">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:29:32.518515" elapsed="0.000570"/>
</kw>
<msg time="2026-04-17T03:29:32.519230" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:32.516619" elapsed="0.002838"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:32.519698" elapsed="0.000035"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:32.520257" elapsed="0.000034"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:29:32.504273" elapsed="0.016114"/>
</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-04-17T03:29:32.503533" elapsed="0.016925"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:29:32.487063" elapsed="0.033526">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:32.521180" elapsed="0.000039"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:29:32.521387" 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="FAIL" start="2026-04-17T03:29:32.472084" elapsed="0.049465">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:29:32.521692" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:29:32.521753" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:32.466964" elapsed="0.054815"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:32.522208" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:32.521873" elapsed="0.000392"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:32.521850" elapsed="0.000441"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:29:32.466765" elapsed="0.055553"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:29:32.466551" elapsed="0.055804"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:29:32.463653" elapsed="0.058764"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:29:32.458217" elapsed="0.064314"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:32.457713" elapsed="0.064869"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:29:32.454507" elapsed="0.068135"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:32.524115" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:32.523423" elapsed="0.000723"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:32.524781" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:32.524318" elapsed="0.000491"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:32.525509" 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-04-17T03:29:32.525072" elapsed="0.000465"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:32.526219" 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-04-17T03:29:32.526509" 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-04-17T03:29:32.525722" elapsed="0.000816"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:32.526897" 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-04-17T03:29:32.527064" 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-04-17T03:29:32.526701" elapsed="0.000391"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-04-17T03:29:32.527254" elapsed="0.002572"/>
</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-04-17T03:29:32.530073" elapsed="0.001697"/>
</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-04-17T03:29:32.589368" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:32.588887" elapsed="0.000520"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:32.590266" 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-04-17T03:29:32.589971" elapsed="0.000377">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-04-17T03:29:32.590601" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:32.589593" elapsed="0.001035"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:32.591232" 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-04-17T03:29:32.590800" elapsed="0.000460"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:32.591601" 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-04-17T03:29:32.591769" 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-04-17T03:29:32.591450" elapsed="0.000346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:32.592230" 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-04-17T03:29:32.591976" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:32.593499" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:32.593129" elapsed="0.000420"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:32.594115" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:29:32.593756" elapsed="0.000387"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:32.595226" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:32.594742" elapsed="0.000511"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:32.596556" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:32.595980" elapsed="0.000683"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:32.596747" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:29:32.597082" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:32.595467" elapsed="0.001641"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:32.597269" elapsed="0.000432"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:29:32.594385" elapsed="0.003359"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:32.600745" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:29:32.600219" elapsed="0.000556"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:32.602143" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:29:32.601558" elapsed="0.000686"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:32.602331" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:29:32.602739" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:29:32.601032" elapsed="0.001737"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:32.602966" elapsed="0.000480"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:29:32.597874" elapsed="0.005617"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:29:32.594199" elapsed="0.009332"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:29:32.603579" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:29:32.603769" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:29:32.592773" elapsed="0.011024"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:32.592363" elapsed="0.011469"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:32.604072" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:32.603863" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:32.592336" elapsed="0.011833"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:32.605044" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:29:32.604328" elapsed="0.000753"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:29:32.605133" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:29:32.588067" elapsed="0.017351"/>
</kw>
<msg time="2026-04-17T03:29:32.605486" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:32.575008" elapsed="0.030536"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:29:32.619535" elapsed="0.000062"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:29:32.632581" elapsed="0.000075"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</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-04-17T03:29:32.645277" elapsed="0.000055"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:32.645574" 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-04-17T03:29:32.645765" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:32.646226" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:32.646068" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:32.646049" 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-04-17T03:29:32.646457" elapsed="0.000042"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:32.646660" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:32.646827" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:29:32.646007" elapsed="0.000872"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:29:32.645851" elapsed="0.001056"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:32.647073" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:32.647154" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:29:32.647325" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:29:32.570340" elapsed="0.077016"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:32.649016" 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-04-17T03:29:32.648603" elapsed="0.000493">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-04-17T03:29:32.649194" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:32.648191" elapsed="0.001029"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:32.649567" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:32.649292" elapsed="0.000333"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:32.650203" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:32.649843" elapsed="0.000390"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:32.649649" elapsed="0.000620"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:32.649274" elapsed="0.001017"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:32.653386" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:29:32.650456" elapsed="0.002959"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:29:32.653470" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:29:32.653636" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:29:32.647728" elapsed="0.005933"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:32.655030" 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-04-17T03:29:32.654743" elapsed="0.000357">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-04-17T03:29:32.655196" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:32.654354" elapsed="0.000867"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:29:32.655437" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:29:32.655295" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:32.655275" 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-04-17T03:29:32.655674" 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-04-17T03:29:32.655870" elapsed="0.000029"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:29:32.655969" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:29:32.658011" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:29:32.654010" elapsed="0.004029"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:32.659626" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:32.659350" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:32.660114" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:32.659834" elapsed="0.000326"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:29:32.665437" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:32.867162" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:33.269566" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:33.272541" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:29:32.662347" elapsed="0.613804">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:32.660230" elapsed="0.616065">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:33.276666" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:33.276356" elapsed="0.000388"/>
</branch>
<status status="FAIL" start="2026-04-17T03:29:32.660210" elapsed="0.616559">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:33.277426" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:33.277618" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:33.277565" elapsed="0.000126"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:33.277538" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:33.278070" elapsed="0.000041"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:29:33.278188" elapsed="0.000040"/>
</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-04-17T03:29:32.658390" elapsed="0.620012">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:33.278538" elapsed="0.000042"/>
</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-04-17T03:29:32.544572" elapsed="0.734157">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:33.279153" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:33.278857" elapsed="0.000393"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:33.278833" elapsed="0.000447"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:33.279322" elapsed="0.000020"/>
</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-04-17T03:29:32.537820" elapsed="0.741649">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:35.344616" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:35.344089" elapsed="0.000563"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:35.345679" 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-04-17T03:29:35.345393" elapsed="0.000366">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-04-17T03:29:35.345861" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:35.344982" elapsed="0.000905"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:35.346573" 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-04-17T03:29:35.346106" elapsed="0.000496"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:35.346991" 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-04-17T03:29:35.347201" 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-04-17T03:29:35.346808" elapsed="0.000421"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:35.347699" 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-04-17T03:29:35.347434" 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-04-17T03:29:35.349162" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:35.348811" elapsed="0.000399"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:35.349709" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:29:35.349378" elapsed="0.000368"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:35.350761" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:35.350274" elapsed="0.000518"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:35.352595" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:35.351796" elapsed="0.000930"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:35.352846" elapsed="0.000061"/>
</return>
<msg time="2026-04-17T03:29:35.353246" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:35.351145" 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-04-17T03:29:35.353490" elapsed="0.000486"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:29:35.350066" elapsed="0.003971"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:35.355379" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:29:35.354395" elapsed="0.001023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:35.357091" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:29:35.356382" elapsed="0.000823"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:35.357290" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:29:35.357609" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:29:35.355692" elapsed="0.001944"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:35.357804" elapsed="0.000418"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:29:35.354198" elapsed="0.004070"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:29:35.349816" elapsed="0.008491"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:29:35.358354" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:29:35.358522" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:29:35.348367" elapsed="0.010181"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:35.347855" elapsed="0.010728"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:35.358779" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:35.358615" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:35.347822" elapsed="0.011213"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:35.359997" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:29:35.359227" elapsed="0.000802"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:29:35.360081" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:29:35.342788" elapsed="0.017426"/>
</kw>
<msg time="2026-04-17T03:29:35.360278" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:35.325436" elapsed="0.034901"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:29:35.380736" elapsed="0.000088"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:29:35.393739" elapsed="0.000041"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:29:35.407379" elapsed="0.000048"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:35.407678" 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-04-17T03:29:35.407910" elapsed="0.000043"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:35.408401" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:35.408233" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:35.408212" elapsed="0.000282"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:35.408664" 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-04-17T03:29:35.408883" 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-04-17T03:29:35.409086" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:29:35.408166" elapsed="0.000976"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:29:35.408026" elapsed="0.001146"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:35.409326" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:35.409411" elapsed="0.000024"/>
</return>
<msg time="2026-04-17T03:29:35.409635" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:29:35.319370" elapsed="0.090314"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:35.411645" 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-04-17T03:29:35.411309" elapsed="0.000434">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-04-17T03:29:35.411846" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:35.410789" 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-04-17T03:29:35.412248" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:35.411965" elapsed="0.000343"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:35.412886" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:35.412547" elapsed="0.000365"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:35.412333" elapsed="0.000635"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:35.411944" elapsed="0.001046"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:35.416122" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:29:35.413157" elapsed="0.002995"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:29:35.416209" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:29:35.416381" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:29:35.410282" elapsed="0.006124"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:35.417841" 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-04-17T03:29:35.417500" elapsed="0.000424">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-04-17T03:29:35.418064" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:35.417114" elapsed="0.000984"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:29:35.418362" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-17T03:29:35.418195" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:35.418170" elapsed="0.000281"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:35.418607" elapsed="0.000026"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:35.418798" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:29:35.418865" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:29:35.420868" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:29:35.416751" elapsed="0.004143"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:35.422465" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:35.422152" elapsed="0.000388"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:35.423053" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:35.422738" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:29:35.428420" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:35.630242" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:36.033230" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:36.035975" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:29:35.425414" elapsed="0.615971">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:35.423208" elapsed="0.618330">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:36.041985" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:36.041612" elapsed="0.000493"/>
</branch>
<status status="FAIL" start="2026-04-17T03:29:35.423189" elapsed="0.618955">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:36.042832" elapsed="0.000045"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:36.043075" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:36.043016" elapsed="0.000124"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:36.042986" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:36.043408" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:29:36.043543" elapsed="0.000030"/>
</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-04-17T03:29:35.421241" elapsed="0.622484">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:36.043837" 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-04-17T03:29:35.294885" elapsed="0.749125">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:36.044904" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:36.044203" elapsed="0.000839"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:36.044170" elapsed="0.000907"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:36.045124" elapsed="0.000021"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-04-17T03:29:35.288466" elapsed="0.756861">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:38.104152" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:38.103674" elapsed="0.000515"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:38.105005" 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-04-17T03:29:38.104726" elapsed="0.000358">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-04-17T03:29:38.105181" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:38.104370" elapsed="0.000836"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:38.105770" 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-04-17T03:29:38.105376" elapsed="0.000421"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:38.106124" 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-04-17T03:29:38.106306" 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-04-17T03:29:38.105979" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:38.106755" 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-04-17T03:29:38.106497" 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-04-17T03:29:38.107958" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:38.107581" elapsed="0.000426"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:38.108445" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:29:38.108173" elapsed="0.000299"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:38.109269" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:38.108840" elapsed="0.000456"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:38.110717" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:38.109959" elapsed="0.000859"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:38.110899" elapsed="0.000054"/>
</return>
<msg time="2026-04-17T03:29:38.111223" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:38.109489" elapsed="0.001762"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:38.111412" elapsed="0.000417"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:29:38.108701" elapsed="0.003171"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:38.112554" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:29:38.112147" elapsed="0.000434"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:38.113799" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:29:38.113248" elapsed="0.000652"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:38.113995" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:29:38.114291" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:29:38.112774" elapsed="0.001543"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:38.114474" elapsed="0.000436"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:29:38.112007" elapsed="0.002963"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:29:38.108526" elapsed="0.006480"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:29:38.115048" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:29:38.115280" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:29:38.107246" elapsed="0.008060"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:38.106883" elapsed="0.008456"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:38.115518" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:38.115364" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:38.106860" elapsed="0.008735"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:38.116457" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:29:38.115740" elapsed="0.000756"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:29:38.116548" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:29:38.102914" elapsed="0.013762"/>
</kw>
<msg time="2026-04-17T03:29:38.116733" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:38.089825" elapsed="0.026957"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:29:38.129467" elapsed="0.000033"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_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-04-17T03:29:38.141678" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_source_as_4/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:38.154054" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:38.154278" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:38.154465" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:38.154867" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:38.154714" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:38.154697" 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-04-17T03:29:38.155109" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:38.155280" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:38.155448" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:29:38.154663" elapsed="0.000837"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:29:38.154551" elapsed="0.000981"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:38.155680" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:38.155968" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:29:38.156122" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:29:38.084780" elapsed="0.071371"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:38.157564" 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-04-17T03:29:38.157285" elapsed="0.000351">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-04-17T03:29:38.157730" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:38.156886" elapsed="0.000869"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:38.158103" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:38.157826" elapsed="0.000334"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:38.158670" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:38.158371" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:38.158185" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:38.157808" elapsed="0.000945"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:38.161365" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:29:38.158906" elapsed="0.002487"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:29:38.161445" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:29:38.161604" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:29:38.156501" elapsed="0.005128"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:38.162864" 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-04-17T03:29:38.162630" elapsed="0.000312">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-04-17T03:29:38.163038" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:38.162284" elapsed="0.000779"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:29:38.163268" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-17T03:29:38.163133" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:38.163116" elapsed="0.000235"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:38.163498" elapsed="0.000026"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:38.163675" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:29:38.163740" elapsed="0.000014"/>
</return>
<msg time="2026-04-17T03:29:38.165721" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:29:38.161953" elapsed="0.003795"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:38.167183" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:38.166912" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:38.167626" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:38.167384" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:29:38.173363" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:38.374917" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:38.777462" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:38.780235" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:29:38.169946" elapsed="0.613626">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:38.167758" elapsed="0.615958">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:38.784134" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:38.783778" elapsed="0.000460"/>
</branch>
<status status="FAIL" start="2026-04-17T03:29:38.167739" elapsed="0.616535">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:38.784882" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:38.785101" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:38.785047" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:38.785020" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:38.785447" elapsed="0.000049"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:29:38.785585" elapsed="0.000024"/>
</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-04-17T03:29:38.166083" elapsed="0.619687">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:38.785907" elapsed="0.000060"/>
</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-04-17T03:29:38.061440" elapsed="0.724692">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:38.787012" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:38.786315" elapsed="0.000869"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:38.786282" elapsed="0.000939"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:38.787271" elapsed="0.000021"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-04-17T03:29:38.056355" elapsed="0.731066">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:29:38.787577" level="FAIL">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-17T03:29:32.531992" elapsed="6.255728">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:29:38.788063" elapsed="0.000044"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:29:38.788431" elapsed="0.000040"/>
</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="NOT RUN" start="2026-04-17T03:29:38.788776" elapsed="0.000044"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:29:38.789100" elapsed="0.000031"/>
</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-04-17T03:29:38.789478" elapsed="0.002822"/>
</kw>
<arg>intra_source_as_4</arg>
<arg>${MVPN_DIR}</arg>
<status status="FAIL" start="2026-04-17T03:29:32.522947" elapsed="6.269464">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:32.453869" elapsed="6.338745">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:29:38.795909" elapsed="0.000308"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:29:38.795633" 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-04-17T03:29:38.797502" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:38.797332" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:38.797302" elapsed="0.000292"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:38.803645" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:38.803491" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:38.803466" elapsed="0.000275"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:38.805297" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:29:38.804670" elapsed="0.000668"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:29:38.806031" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:29:38.805575" elapsed="0.000493"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:29:38.806214" elapsed="0.000052"/>
</return>
<msg time="2026-04-17T03:29:38.806451" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:29:38.804122" elapsed="0.002364"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:38.813217" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:38.813103" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:38.813084" elapsed="0.000204"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:38.814565" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:38.814456" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:38.814438" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:38.815121" level="INFO">${karaf_connection_index} = 40</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:29:38.814787" elapsed="0.000362"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:38.815543" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:29:38.815317" elapsed="0.000252"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:29:38.816391" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:29:38.816121" elapsed="0.001018">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:29:38.817335" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:29:38.817382" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:38.815735" elapsed="0.001672"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:29:38.818206" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:29:38.817957" elapsed="0.000905">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:29:38.819075" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:29:38.819134" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:38.817585" elapsed="0.001585"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:29:38.820187" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_intra_ipv6"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:29:38.819498" elapsed="0.000754">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_intra_ipv6"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:38.819265" elapsed="0.001060">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_intra_ipv6"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:29:38.819245" elapsed="0.001114">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_intra_ipv6"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:38.820528" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:38.820759" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:38.820614" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:38.820597" elapsed="0.000239"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:29:38.820869" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:29:38.823556" elapsed="0.000357"/>
</kw>
<msg time="2026-04-17T03:29:38.824027" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:38.822438" elapsed="0.001760"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:38.824582" elapsed="0.000119"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:38.825034" 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-04-17T03:29:38.821783" elapsed="0.003453"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:29:38.821170" elapsed="0.004139"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:29:38.814146" elapsed="0.011252">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_intra_ipv6"</status>
</kw>
<msg time="2026-04-17T03:29:38.825565" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:29:38.825612" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Play_To_Odl_intra_ipv6"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:38.813448" elapsed="0.012189"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:29:38.825831" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:38.825718" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:38.825699" elapsed="0.000200"/>
</if>
<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-04-17T03:29:38.826986" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:38.826860" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:38.826843" elapsed="0.000211"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:38.827376" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:29:38.827494" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:29:38.827230" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:38.828102" level="INFO">{1: 40}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:38.827715" elapsed="0.000434"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:38.828567" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:38.828311" elapsed="0.000299"/>
</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-04-17T03:29:38.829368" elapsed="0.000278"/>
</kw>
<msg time="2026-04-17T03:29:38.829747" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:29:38.829793" level="INFO">${old_connection_index} = 40</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:38.828773" elapsed="0.001043"/>
</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-04-17T03:29:38.830683" elapsed="0.000236"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:29:38.832076" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:29:38.831625" elapsed="0.001411">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:38.831130" elapsed="0.002009"/>
</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-04-17T03:29:38.833790" elapsed="0.000295"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:38.833316" elapsed="0.000855"/>
</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-04-17T03:29:38.830135" elapsed="0.004083"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:38.829892" elapsed="0.004375"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:38.829874" elapsed="0.004417"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:38.835175" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:29:38.834842" elapsed="0.000359"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:29:38.835250" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:29:38.835406" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:29:38.834504" elapsed="0.000926"/>
</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-04-17T03:29:38.835592" elapsed="0.000469"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:38.836350" level="INFO">index=41
host=10.30.170.120
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-04-17T03:29:38.836451" level="INFO">${karaf_connection_object} = index=41
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:29:38.836239" elapsed="0.000238"/>
</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-04-17T03:29:38.836630" elapsed="0.002813"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:29:38.840036" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:29:38.841360" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:29:38.839708" elapsed="0.002096">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:29:38.858271" elapsed="0.000415"/>
</kw>
<msg time="2026-04-17T03:29:38.858786" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:38.856689" elapsed="0.002270"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:38.859131" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:38.859328" elapsed="0.000029"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:29:38.843043" elapsed="0.016403"/>
</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-04-17T03:29:38.842192" elapsed="0.017315"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:29:38.826560" elapsed="0.033040">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:38.860026" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:29:38.860107" 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="FAIL" start="2026-04-17T03:29:38.812732" elapsed="0.047492">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:29:38.860339" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:29:38.860384" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:38.807045" elapsed="0.053362"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:38.860808" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:38.860492" elapsed="0.000371"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:38.860472" elapsed="0.000416"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:29:38.806815" elapsed="0.054098"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:29:38.806565" elapsed="0.054498"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:29:38.802967" elapsed="0.058158"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:29:38.796970" elapsed="0.064215"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:38.796432" elapsed="0.064802"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:29:38.793314" elapsed="0.067978"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:38.862459" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:38.861973" elapsed="0.000514"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:38.863341" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:38.862657" elapsed="0.000722"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:38.864199" 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-04-17T03:29:38.863581" elapsed="0.000648"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:38.864601" 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-04-17T03:29:38.864787" 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-04-17T03:29:38.864394" elapsed="0.000461"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:38.865229" 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-04-17T03:29:38.865398" 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-04-17T03:29:38.865033" elapsed="0.000400"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-04-17T03:29:38.865592" elapsed="0.002844"/>
</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-04-17T03:29:38.868690" elapsed="0.001898"/>
</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-04-17T03:29:38.928005" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:38.927520" elapsed="0.000523"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:38.929053" 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-04-17T03:29:38.928725" elapsed="0.000408">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-04-17T03:29:38.929232" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:38.928269" elapsed="0.000995"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:38.929839" 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-04-17T03:29:38.929441" elapsed="0.000426"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:38.930217" 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-04-17T03:29:38.930389" 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-04-17T03:29:38.930068" elapsed="0.000348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:38.930840" 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-04-17T03:29:38.930585" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:38.932034" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:38.931661" elapsed="0.000423"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:38.932531" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:29:38.932251" elapsed="0.000306"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:38.933370" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:38.932950" elapsed="0.000447"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:38.934631" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:38.934073" elapsed="0.000659"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:38.934813" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:29:38.935135" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:38.933592" elapsed="0.001571"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:38.935323" elapsed="0.000389"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:29:38.932786" elapsed="0.002967"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:38.936508" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:29:38.936087" elapsed="0.000450"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:38.937954" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:29:38.937395" elapsed="0.000712"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:38.938187" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:29:38.938481" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:29:38.936914" elapsed="0.001593"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:38.938663" elapsed="0.000384"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:29:38.935868" elapsed="0.003222"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:29:38.932609" elapsed="0.006517"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:29:38.939169" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:29:38.939331" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:29:38.931322" elapsed="0.008035"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:38.930984" elapsed="0.008406"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:38.939570" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:38.939415" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:38.930960" elapsed="0.008688"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:38.940413" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:29:38.939796" elapsed="0.000647"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:29:38.940491" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:29:38.926832" elapsed="0.013783"/>
</kw>
<msg time="2026-04-17T03:29:38.940670" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:38.913559" elapsed="0.027162"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:29:38.953480" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_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-04-17T03:29:38.965895" elapsed="0.000041"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:29:38.978689" elapsed="0.000042"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:38.978973" 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-04-17T03:29:38.979168" 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-04-17T03:29:38.979632" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:38.979469" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:38.979452" 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-04-17T03:29:38.979978" elapsed="0.000050"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:38.980189" 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-04-17T03:29:38.980395" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:29:38.979412" elapsed="0.001039"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:29:38.979271" elapsed="0.001208"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:38.980632" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:38.980712" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:29:38.980881" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:29:38.908969" elapsed="0.071941"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:38.982559" 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-04-17T03:29:38.982155" elapsed="0.000507">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-04-17T03:29:38.982792" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:38.981661" elapsed="0.001166"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:38.983313" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:38.982946" elapsed="0.000447"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:38.984160" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:38.983685" elapsed="0.000510"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:38.983426" elapsed="0.000819"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:38.982902" elapsed="0.001373"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:38.987457" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:29:38.984492" elapsed="0.003002"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:29:38.987572" elapsed="0.000054"/>
</return>
<msg time="2026-04-17T03:29:38.987810" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:29:38.981293" elapsed="0.006552"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:38.989439" 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-04-17T03:29:38.989134" elapsed="0.000373">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-04-17T03:29:38.989606" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:38.988660" elapsed="0.000970"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:29:38.989841" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:29:38.989702" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:38.989684" elapsed="0.000260"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:38.990101" 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-04-17T03:29:38.990291" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:29:38.990361" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:29:38.992436" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:29:38.988221" elapsed="0.004243"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:38.994060" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:38.993780" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:38.994561" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:38.994286" elapsed="0.000335"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:29:39.000248" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6</msg>
<msg time="2026-04-17T03:29:39.201667" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6</msg>
<msg time="2026-04-17T03:29:39.604532" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6</msg>
<msg time="2026-04-17T03:29:39.606655" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:29:38.997016" elapsed="0.613280">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:38.994701" elapsed="0.615759">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:39.610841" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:39.610524" elapsed="0.000437"/>
</branch>
<status status="FAIL" start="2026-04-17T03:29:38.994682" elapsed="0.616315">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:39.611643" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:39.612066" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:39.612010" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:39.611981" elapsed="0.000244"/>
</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-04-17T03:29:39.612449" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:29:39.612553" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:29:38.992883" elapsed="0.619810">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:39.612776" 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-04-17T03:29:38.884364" elapsed="0.728553">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:39.613395" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:39.613142" elapsed="0.000333"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:39.613117" elapsed="0.000385"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:39.613536" elapsed="0.000016"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-04-17T03:29:38.879643" elapsed="0.734002">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:41.682462" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:41.682044" elapsed="0.000453"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:41.683298" 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-04-17T03:29:41.683039" elapsed="0.000335">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-04-17T03:29:41.683472" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:41.682675" elapsed="0.000822"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:41.684081" 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-04-17T03:29:41.683667" elapsed="0.000442"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:41.684422" 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-04-17T03:29:41.684796" 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-04-17T03:29:41.684278" elapsed="0.000550"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:41.685347" 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-04-17T03:29:41.685038" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:41.686518" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:41.686183" elapsed="0.000382"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:41.687043" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:29:41.686736" elapsed="0.000334"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:41.687856" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:41.687442" elapsed="0.000440"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:41.689481" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:41.688692" elapsed="0.000926"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:41.689727" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:29:41.690072" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:41.688165" 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-04-17T03:29:41.690260" elapsed="0.000396"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:29:41.687302" elapsed="0.003456"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:41.691706" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:29:41.691037" elapsed="0.000697"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:41.693068" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:29:41.692456" elapsed="0.000717"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:41.693255" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:29:41.693563" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:29:41.691955" elapsed="0.001635"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:41.693780" elapsed="0.000408"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:29:41.690879" elapsed="0.003355"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:29:41.687125" elapsed="0.007145"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:29:41.694314" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:29:41.694480" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:29:41.685832" elapsed="0.008675"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:41.685504" elapsed="0.009036"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:41.694726" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:41.694565" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:41.685480" elapsed="0.009325"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:41.695704" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:29:41.694970" elapsed="0.000772"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:29:41.695806" 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_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-04-17T03:29:41.681375" elapsed="0.014648"/>
</kw>
<msg time="2026-04-17T03:29:41.696098" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:41.668467" elapsed="0.027701"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:29:41.709618" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_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-04-17T03:29:41.723848" elapsed="0.000041"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:29:41.736565" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:41.736840" 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-04-17T03:29:41.737038" 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-04-17T03:29:41.737426" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:41.737274" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:41.737258" 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-04-17T03:29:41.737650" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:41.737821" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:41.738003" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:29:41.737228" elapsed="0.000862"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:29:41.737120" elapsed="0.001008"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:41.738295" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:41.738375" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:29:41.738514" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:29:41.663775" elapsed="0.074768"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:41.740032" 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-04-17T03:29:41.739730" elapsed="0.000378">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-04-17T03:29:41.740204" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:41.739310" elapsed="0.000919"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:41.740558" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:41.740299" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:41.741188" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:41.740872" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:41.740639" elapsed="0.000611"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:41.740282" elapsed="0.000989"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:41.743790" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:29:41.741424" elapsed="0.002394"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:29:41.743871" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:29:41.744047" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:29:41.738959" elapsed="0.005113"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:41.745342" 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-04-17T03:29:41.745105" elapsed="0.000301">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-04-17T03:29:41.745500" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:41.744737" elapsed="0.000787"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:29:41.745731" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:29:41.745595" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:41.745577" elapsed="0.000283"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:41.746029" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:41.746204" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:29:41.746270" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:29:41.748234" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:29:41.744384" elapsed="0.003878"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:41.749777" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:41.749516" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:41.750262" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:41.750004" 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-04-17T03:29:41.755441" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6</msg>
<msg time="2026-04-17T03:29:41.957164" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6</msg>
<msg time="2026-04-17T03:29:42.359914" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6</msg>
<msg time="2026-04-17T03:29:42.362380" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:29:41.752494" elapsed="0.613364">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:41.750374" elapsed="0.615717">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:42.366593" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:42.366161" elapsed="0.000532"/>
</branch>
<status status="FAIL" start="2026-04-17T03:29:41.750356" elapsed="0.616369">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:42.367413" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:42.367603" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:42.367548" elapsed="0.000130"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:42.367521" elapsed="0.000187"/>
</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-04-17T03:29:42.367871" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:29:42.367963" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:29:41.748596" elapsed="0.619544">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:42.368378" 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-04-17T03:29:41.638825" elapsed="0.729698">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:42.369574" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:42.368662" elapsed="0.001026"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:42.368638" elapsed="0.001087"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:42.369775" elapsed="0.000024"/>
</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-04-17T03:29:41.633968" elapsed="0.735991">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:44.426110" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_ipv6/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:44.425683" elapsed="0.000463"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:44.426944" 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-04-17T03:29:44.426671" elapsed="0.000350">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-04-17T03:29:44.427120" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:44.426324" elapsed="0.000821"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:44.427738" 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-04-17T03:29:44.427318" elapsed="0.000449"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:44.428102" 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-04-17T03:29:44.428274" 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-04-17T03:29:44.427953" elapsed="0.000349"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:44.428722" 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-04-17T03:29:44.428468" 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-04-17T03:29:44.429982" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:44.429622" elapsed="0.000410"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:44.430480" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:29:44.430201" elapsed="0.000306"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:44.431321" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:29:44.430880" elapsed="0.000469"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:44.432943" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:44.432169" elapsed="0.000881"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:44.433135" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:29:44.433483" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:44.431659" 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-04-17T03:29:44.433679" elapsed="0.000417"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:29:44.430740" elapsed="0.003401"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:44.434824" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:29:44.434400" elapsed="0.000452"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:44.436166" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:29:44.435540" elapsed="0.000730"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:44.436349" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:29:44.436646" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:29:44.435073" elapsed="0.001601"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:44.436835" elapsed="0.000395"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:29:44.434259" elapsed="0.003015"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:29:44.430561" elapsed="0.006748"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:29:44.437353" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:29:44.437551" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:29:44.429231" elapsed="0.008348"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:44.428860" elapsed="0.008753"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:44.437795" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:44.437640" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:44.428836" elapsed="0.009036"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:44.438640" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:29:44.438036" elapsed="0.000635"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:29:44.438723" elapsed="0.000033"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_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-04-17T03:29:44.425004" elapsed="0.013852"/>
</kw>
<msg time="2026-04-17T03:29:44.438913" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:44.412123" elapsed="0.026872"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:29:44.452598" elapsed="0.000033"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/intra_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-04-17T03:29:44.465399" 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_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-04-17T03:29:44.478115" elapsed="0.000046"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:44.478398" 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-04-17T03:29:44.478593" 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-04-17T03:29:44.479081" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:44.478900" elapsed="0.000265"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:44.478881" 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-04-17T03:29:44.479402" 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-04-17T03:29:44.479627" elapsed="0.000038"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:44.479856" elapsed="0.000024"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:29:44.478842" elapsed="0.001074"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:29:44.478691" elapsed="0.001276"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:44.480133" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:44.480221" elapsed="0.000024"/>
</return>
<msg time="2026-04-17T03:29:44.480416" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:29:44.407721" elapsed="0.072734"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:44.482084" 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-04-17T03:29:44.481740" elapsed="0.000427">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-04-17T03:29:44.482267" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:44.481258" elapsed="0.001033"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:44.482682" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:44.482365" elapsed="0.000381"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:44.483321" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:44.483005" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:44.482773" elapsed="0.000611"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:44.482345" elapsed="0.001061"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:44.486100" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:29:44.483561" elapsed="0.002566"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:29:44.486183" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:29:44.486387" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:29:44.480840" elapsed="0.005575"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:44.487780" 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-04-17T03:29:44.487533" elapsed="0.000380">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-04-17T03:29:44.488031" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:44.487158" elapsed="0.000898"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:29:44.488270" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:29:44.488129" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:44.488109" elapsed="0.000246"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:44.488506" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:44.488684" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:29:44.488751" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:29:44.490742" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:29:44.486764" elapsed="0.004007"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:44.492251" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:29:44.491987" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:44.492717" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:44.492456" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:29:44.498112" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6</msg>
<msg time="2026-04-17T03:29:44.700143" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6</msg>
<msg time="2026-04-17T03:29:45.102842" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6</msg>
<msg time="2026-04-17T03:29:45.105889" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:29:44.495169" elapsed="0.614627">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:44.492834" elapsed="0.617147">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:45.110401" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:45.110052" elapsed="0.000450"/>
</branch>
<status status="FAIL" start="2026-04-17T03:29:44.492816" elapsed="0.617721">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:45.111203" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:45.111419" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:45.111361" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:45.111329" elapsed="0.000308"/>
</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-04-17T03:29:45.111865" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:29:45.111994" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:29:44.491135" elapsed="0.621042">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:45.112292" 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-04-17T03:29:44.384402" elapsed="0.728030">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:45.113308" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:45.112975" elapsed="0.000452"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:45.112542" elapsed="0.000923"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:45.113516" elapsed="0.000023"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-04-17T03:29:44.377667" elapsed="0.736044">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:29:45.113886" level="FAIL">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-17T03:29:38.870827" elapsed="6.243248">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:29:45.114389" elapsed="0.000033"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:29:45.114685" elapsed="0.000030"/>
</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="NOT RUN" start="2026-04-17T03:29:45.114985" elapsed="0.000032"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:29:45.115239" elapsed="0.000029"/>
</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-04-17T03:29:45.115606" elapsed="0.002892"/>
</kw>
<arg>intra_ipv6</arg>
<arg>${MVPN_DIR}</arg>
<arg>ipv6</arg>
<status status="FAIL" start="2026-04-17T03:29:38.861553" elapsed="6.257035">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:38.792842" elapsed="6.326006">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:29:45.122642" elapsed="0.000347"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:29:45.122335" elapsed="0.000916"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:45.124580" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:45.124418" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:45.124389" elapsed="0.000266"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:45.131187" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:45.130983" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:45.130955" elapsed="0.000334"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:45.132812" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:29:45.132226" elapsed="0.000626"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:29:45.133570" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:29:45.133134" elapsed="0.000472"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:29:45.133715" elapsed="0.000053"/>
</return>
<msg time="2026-04-17T03:29:45.133975" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:29:45.131638" elapsed="0.002373"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:45.140471" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:45.140341" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:45.140319" elapsed="0.000226"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:45.141822" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:45.141713" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:45.141694" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:45.142386" level="INFO">${karaf_connection_index} = 41</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:29:45.142070" elapsed="0.000343"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:45.142823" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:29:45.142578" elapsed="0.000276"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:29:45.143725" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:29:45.143444" elapsed="0.000968">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:29:45.144603" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:29:45.144650" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:45.143036" elapsed="0.001637"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:29:45.145519" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:29:45.145254" elapsed="0.000976">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:29:45.146419" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:29:45.146467" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:45.144847" elapsed="0.001645"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:29:45.147496" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Kill_Talking_BGP_Speaker"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:29:45.146823" elapsed="0.000736">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Kill_Talking_BGP_Speaker"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:45.146575" elapsed="0.001056">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Kill_Talking_BGP_Speaker"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:29:45.146553" elapsed="0.001179">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Kill_Talking_BGP_Speaker"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:45.147906" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:45.148162" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:45.148014" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:45.147996" elapsed="0.000242"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:29:45.148274" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:29:45.151277" elapsed="0.000164"/>
</kw>
<msg time="2026-04-17T03:29:45.151516" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:45.150094" elapsed="0.001564"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:45.151960" elapsed="0.000081"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:45.152371" 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-04-17T03:29:45.149277" elapsed="0.003337"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:29:45.148587" elapsed="0.004103"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:29:45.141368" elapsed="0.011434">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Kill_Talking_BGP_Speaker"</status>
</kw>
<msg time="2026-04-17T03:29:45.152922" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:29:45.152991" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Kill_Talking_BGP_Speaker"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:45.140715" elapsed="0.012301"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:29:45.153255" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:45.153106" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:45.153083" elapsed="0.000244"/>
</if>
<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-04-17T03:29:45.154645" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:45.154532" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:45.154514" elapsed="0.000199"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:45.155147" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:29:45.155257" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:29:45.154886" elapsed="0.000400"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:45.155741" level="INFO">{1: 41}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:45.155446" elapsed="0.000345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:45.156211" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:45.155963" elapsed="0.000291"/>
</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-04-17T03:29:45.156846" elapsed="0.000377"/>
</kw>
<msg time="2026-04-17T03:29:45.157335" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:29:45.157387" level="INFO">${old_connection_index} = 41</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:45.156418" elapsed="0.000999"/>
</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-04-17T03:29:45.158388" elapsed="0.000221"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:29:45.159952" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:29:45.159489" elapsed="0.001487">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:45.158816" elapsed="0.002266"/>
</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-04-17T03:29:45.161796" elapsed="0.000315"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:45.161266" elapsed="0.000932"/>
</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-04-17T03:29:45.157803" elapsed="0.004443"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:45.157502" elapsed="0.004870"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:45.157481" elapsed="0.004923"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:45.163417" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:29:45.163081" elapsed="0.000363"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:29:45.163498" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:29:45.163669" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:29:45.162649" elapsed="0.001045"/>
</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-04-17T03:29:45.163857" elapsed="0.000463"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:45.164625" level="INFO">index=42
host=10.30.170.120
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-04-17T03:29:45.164728" level="INFO">${karaf_connection_object} = index=42
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:29:45.164499" elapsed="0.000259"/>
</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-04-17T03:29:45.164914" elapsed="0.005046"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:29:45.170565" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:29:45.171863" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:29:45.170210" elapsed="0.002135">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:29:45.187250" elapsed="0.000420"/>
</kw>
<msg time="2026-04-17T03:29:45.187782" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:45.185681" elapsed="0.002637"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:45.188492" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:45.188660" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:29:45.173393" elapsed="0.015354"/>
</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-04-17T03:29:45.172727" elapsed="0.016069"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:29:45.154187" elapsed="0.034704">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:45.189315" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:29:45.189394" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:29:45.139953" elapsed="0.049557">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:29:45.189628" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:29:45.189731" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:45.134541" elapsed="0.055226"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:45.190212" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:45.189871" elapsed="0.000398"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:45.189847" elapsed="0.000450"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:29:45.134337" elapsed="0.055984"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:29:45.134090" elapsed="0.056266"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:29:45.130422" elapsed="0.059993"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:29:45.123887" elapsed="0.066658"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:45.123411" elapsed="0.067190"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:29:45.119749" elapsed="0.070911"/>
</kw>
<kw name="Kill_BGP_Speaker" owner="BGPSpeaker">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:45.192068" 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-04-17T03:29:45.191652" elapsed="0.000445"/>
</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-04-17T03:29:45.192300" elapsed="0.000535"/>
</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-04-17T03:29:45.191377" elapsed="0.001589"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:29:45.212188" level="INFO">^C
[?2004h[jenkins@releng-26932-188-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-04-17T03:29:45.193489" elapsed="0.018846"/>
</kw>
<msg time="2026-04-17T03:29:45.212494" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:29:45.212541" level="INFO">${message} = ^C
[?2004h[jenkins@releng-26932-188-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${status}</var>
<var>${message}</var>
<arg>SSHLibrary.Read_Until_Prompt</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:45.193137" elapsed="0.019431"/>
</kw>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:29:45.213451" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-04-17T03:29:45.225993" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:29:45.226244" level="INFO">${output_log} = 2026-04-17 03:28:04,910 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:28:04,911 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.238
2026-04-17 03:28:04,911 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-04-17T03:29:45.213268" elapsed="0.013020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:45.227325" level="INFO">2026-04-17 03:28:04,910 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:28:04,911 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.238
2026-04-17 03:28:04,911 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-04-17 03:28:04,911 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.120
2026-04-17 03:28:04,911 DEBUG BGP-Thread-1 (job): Remote port: 1790
Exception in thread Thread-1 (job):
Traceback (most recent call last):
  File "/usr/lib/python3.10/threading.py", line 1016, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.10/threading.py", line 953, in run
    self._target(*self._args, **self._kwargs)
  File "/home/jenkins/play.py", line 2406, in job
    bgp_socket = establish_connection(arguments)
  File "/home/jenkins/play.py", line 284, in establish_connection
    talking_socket.connect((str(arguments.peerip), arguments.peerport))
ConnectionRefusedError: [Errno 111] Connection refused
10.30.171.144 - - [17/Apr/2026 03:28:10] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:12] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:12] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:18] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:18] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:20] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:20] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:26] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:26] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:28] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:28] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:34] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:34] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:36] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:36] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:42] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:42] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:44] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:44] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:50] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:50] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:52] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:52] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:58] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:58] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:29:00] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:29:00] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:29:06] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:29:06] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:29:08] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:29:08] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:29:14] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:29:14] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:29:16] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:29:16] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:29:22] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:29:22] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:29:24] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:29:24] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:29:30] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:29:30] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:29:32] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:29:32] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:29:38] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:29:38] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:29:38] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:29:45] "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-04-17T03:29:45.226634" elapsed="0.000882"/>
</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-04-17T03:29:45.212875" elapsed="0.014874"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<status status="PASS" start="2026-04-17T03:29:45.228230" elapsed="0.000083"/>
</return>
<status status="PASS" start="2026-04-17T03:29:45.227907" elapsed="0.000476"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:45.227862" elapsed="0.000577"/>
</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-04-17T03:29:45.228781" elapsed="0.000047"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was not seen within timeout period.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:45.229195" elapsed="0.000058"/>
</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-04-17T03:29:45.191021" elapsed="0.038368"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:29:45.243976" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-04-17T03:29:45.272898" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:29:45.273323" level="INFO">${output_log} = 2026-04-17 03:28:04,910 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:28:04,911 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.238
2026-04-17 03:28:04,911 DEBUG BGP-Thr...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-17T03:29:45.243795" elapsed="0.029597"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:45.274729" level="INFO">2026-04-17 03:28:04,910 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:28:04,911 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.238
2026-04-17 03:28:04,911 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-04-17 03:28:04,911 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.120
2026-04-17 03:28:04,911 DEBUG BGP-Thread-1 (job): Remote port: 1790
Exception in thread Thread-1 (job):
Traceback (most recent call last):
  File "/usr/lib/python3.10/threading.py", line 1016, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.10/threading.py", line 953, in run
    self._target(*self._args, **self._kwargs)
  File "/home/jenkins/play.py", line 2406, in job
    bgp_socket = establish_connection(arguments)
  File "/home/jenkins/play.py", line 284, in establish_connection
    talking_socket.connect((str(arguments.peerip), arguments.peerport))
ConnectionRefusedError: [Errno 111] Connection refused
10.30.171.144 - - [17/Apr/2026 03:28:10] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:12] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:12] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:18] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:18] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:20] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:20] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:26] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:26] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:28] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:28] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:34] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:34] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:36] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:36] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:42] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:42] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:44] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:44] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:50] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:50] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:52] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:52] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:58] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:28:58] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:29:00] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:29:00] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:29:06] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:29:06] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:29:08] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:29:08] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:29:14] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:29:14] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:29:16] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:29:16] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:29:22] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:29:22] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:29:24] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:29:24] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:29:30] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:29:30] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:29:32] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:29:32] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:29:38] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:29:38] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:29:38] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:29:45] "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-04-17T03:29:45.273995" elapsed="0.000966"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:45.276463" 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-04-17T03:29:45.275474" elapsed="0.001131"/>
</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-04-17T03:29:45.243341" elapsed="0.033425"/>
</kw>
<doc>Abort the Python speaker</doc>
<status status="PASS" start="2026-04-17T03:29:45.119240" elapsed="0.157841"/>
</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-04-17T03:29:45.285250" elapsed="0.000383"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:29:45.284572" elapsed="0.001196"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:45.287810" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:45.287620" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:45.287585" elapsed="0.000337"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:45.295833" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:45.295687" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:45.295659" elapsed="0.000265"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:45.297243" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:29:45.296737" elapsed="0.000537"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:29:45.297810" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:29:45.297447" elapsed="0.000400"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:29:45.297911" elapsed="0.000064"/>
</return>
<msg time="2026-04-17T03:29:45.298117" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:29:45.296264" elapsed="0.001878"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:45.305029" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:45.304863" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:45.304835" elapsed="0.000299"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:45.306924" elapsed="0.000050"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:45.306768" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:45.306744" elapsed="0.000299"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:45.307540" level="INFO">${karaf_connection_index} = 42</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:29:45.307205" elapsed="0.000365"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:45.308107" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:29:45.307778" elapsed="0.000366"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:29:45.309308" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:29:45.308892" elapsed="0.001442">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:29:45.310630" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:29:45.310705" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:45.308376" elapsed="0.002367"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:29:45.311994" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:29:45.311595" elapsed="0.001379">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:29:45.313248" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:29:45.313312" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:45.311052" elapsed="0.002294"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:29:45.314854" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Delete_Bgp_Peer_Configuration"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:29:45.313902" elapsed="0.001054">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Delete_Bgp_Peer_Configuration"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:45.313485" elapsed="0.001565">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Delete_Bgp_Peer_Configuration"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:29:45.313445" elapsed="0.001653">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Delete_Bgp_Peer_Configuration"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:45.315343" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:45.315670" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:45.315463" elapsed="0.000378"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:45.315436" elapsed="0.000447"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:29:45.315972" 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-04-17T03:29:45.319582" elapsed="0.000227"/>
</kw>
<msg time="2026-04-17T03:29:45.319898" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:45.318223" elapsed="0.001896"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:45.320409" elapsed="0.000085"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:45.320796" 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-04-17T03:29:45.317313" elapsed="0.003723"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:29:45.316445" elapsed="0.004663"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:29:45.306362" elapsed="0.014846">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Delete_Bgp_Peer_Configuration"</status>
</kw>
<msg time="2026-04-17T03:29:45.321362" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:29:45.321423" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Delete_Bgp_Peer_Configuration"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:45.305376" elapsed="0.016081"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:29:45.321808" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:45.321590" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:45.321554" elapsed="0.000364"/>
</if>
<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-04-17T03:29:45.323384" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:45.323248" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:45.323223" elapsed="0.000247"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:45.323832" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:29:45.324104" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:29:45.323651" elapsed="0.000483"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:45.324612" level="INFO">{1: 42}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:45.324302" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:45.325122" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:45.324814" elapsed="0.000353"/>
</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-04-17T03:29:45.325842" elapsed="0.000407"/>
</kw>
<msg time="2026-04-17T03:29:45.326389" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:29:45.326454" level="INFO">${old_connection_index} = 42</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:45.325337" elapsed="0.001151"/>
</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-04-17T03:29:45.327651" elapsed="0.000210"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:29:45.329211" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:29:45.328618" elapsed="0.001958">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:45.328064" elapsed="0.002661"/>
</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-04-17T03:29:45.331766" elapsed="0.000426"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:45.331033" elapsed="0.001278"/>
</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-04-17T03:29:45.326981" elapsed="0.005382"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:45.326612" elapsed="0.005813"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:45.326579" elapsed="0.005893"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:45.333636" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:29:45.333261" elapsed="0.000543"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:29:45.333868" elapsed="0.000047"/>
</return>
<msg time="2026-04-17T03:29:45.334071" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:29:45.332803" elapsed="0.001293"/>
</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-04-17T03:29:45.334284" elapsed="0.000578"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:45.335246" level="INFO">index=43
host=10.30.170.120
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-04-17T03:29:45.335353" level="INFO">${karaf_connection_object} = index=43
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:29:45.335087" elapsed="0.000293"/>
</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-04-17T03:29:45.335536" elapsed="0.002753"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:29:45.338745" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:29:45.340236" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:29:45.338468" elapsed="0.002412">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:29:45.363877" elapsed="0.000589"/>
</kw>
<msg time="2026-04-17T03:29:45.364616" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:45.361568" elapsed="0.003276"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:45.365128" elapsed="0.000037"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:45.365380" elapsed="0.000031"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:29:45.342659" elapsed="0.022855"/>
</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-04-17T03:29:45.341499" elapsed="0.024091"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:29:45.322596" elapsed="0.043182">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:45.366390" elapsed="0.000038"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:29:45.366502" 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="FAIL" start="2026-04-17T03:29:45.304329" elapsed="0.062340">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:29:45.366838" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:29:45.366901" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:45.298596" elapsed="0.068692"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:45.367813" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:45.367421" elapsed="0.000467"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:45.367388" elapsed="0.000558"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:29:45.298415" elapsed="0.069571"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:29:45.298210" elapsed="0.069826"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:29:45.295111" elapsed="0.073011"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:29:45.287128" elapsed="0.081080"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:45.286117" elapsed="0.082161"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:29:45.279721" elapsed="0.088633"/>
</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-04-17T03:29:45.420642" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:45.420060" elapsed="0.000628"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:45.421595" 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-04-17T03:29:45.421296" elapsed="0.000384">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-04-17T03:29:45.421833" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:45.420898" elapsed="0.000966"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:45.422641" 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-04-17T03:29:45.422101" elapsed="0.000578"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:45.423083" 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-04-17T03:29:45.423273" 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-04-17T03:29:45.422872" elapsed="0.000428"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:45.424805" 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-04-17T03:29:45.423511" elapsed="0.001551"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:45.428358" level="INFO">mapping: {'IP': '10.30.171.238', '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-04-17T03:29:45.427550" elapsed="0.000929"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:45.429703" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:29:45.428983" elapsed="0.000863"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:45.431435" level="INFO">${value} = 10.30.171.238</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:29:45.430872" elapsed="0.000603"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:45.433430" level="INFO">${encoded} = 10.30.171.238</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:29:45.433064" elapsed="0.000407"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:45.433555" elapsed="0.000061"/>
</return>
<msg time="2026-04-17T03:29:45.433899" level="INFO">${encoded_value} = 10.30.171.238</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:29:45.431852" elapsed="0.002110"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:45.434211" elapsed="0.000401"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.238</var>
<status status="PASS" start="2026-04-17T03:29:45.430541" elapsed="0.004135"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:45.435636" 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-04-17T03:29:45.435114" elapsed="0.000567"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:45.437130" 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-04-17T03:29:45.436720" elapsed="0.000451"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:45.437259" elapsed="0.000060"/>
</return>
<msg time="2026-04-17T03:29:45.437515" 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-04-17T03:29:45.436199" elapsed="0.001353"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:45.437848" elapsed="0.000438"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:29:45.434880" elapsed="0.003474"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:45.439143" 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-04-17T03:29:45.438788" elapsed="0.000394"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:45.440161" 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-04-17T03:29:45.439913" elapsed="0.000274"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:45.440241" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:29:45.440401" 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-04-17T03:29:45.439453" elapsed="0.000973"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:45.440609" elapsed="0.000250"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:29:45.438529" elapsed="0.002382"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:45.441546" 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-04-17T03:29:45.441221" elapsed="0.000360"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:45.442425" 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-04-17T03:29:45.442202" elapsed="0.000249"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:45.442502" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:29:45.442659" 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-04-17T03:29:45.441825" 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-04-17T03:29:45.442867" elapsed="0.000259"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:29:45.441079" elapsed="0.002090"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:45.443761" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:29:45.443422" elapsed="0.000365"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:45.444590" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:29:45.444352" elapsed="0.000266"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:45.444697" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:29:45.444874" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:29:45.443998" 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-04-17T03:29:45.445111" elapsed="0.000253"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:29:45.443285" elapsed="0.002122"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:45.446087" 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-04-17T03:29:45.445685" elapsed="0.000430"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:45.446882" 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-04-17T03:29:45.446660" elapsed="0.000249"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:45.446988" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:29:45.447161" 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-04-17T03:29:45.446310" 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-04-17T03:29:45.447343" elapsed="0.000516"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:29:45.445544" elapsed="0.002358"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:29:45.430039" elapsed="0.017918"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:29:45.448009" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:29:45.448227" level="INFO">${mapping_to_use} = {'IP': '10.30.171.238', '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-04-17T03:29:45.426563" elapsed="0.021695"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:45.425342" elapsed="0.022954"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:45.448511" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:45.448329" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:45.425275" elapsed="0.023318"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:45.449525" 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-04-17T03:29:45.448749" elapsed="0.000807"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:29:45.449611" 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/bgp_peer.vanadium/${file_name} exists. 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-04-17T03:29:45.419149" elapsed="0.030662"/>
</kw>
<msg time="2026-04-17T03:29:45.449966" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:45.403608" elapsed="0.046419"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:29:45.463841" elapsed="0.000066"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:29:45.477858" elapsed="0.000056"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</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-04-17T03:29:45.490838" elapsed="0.000064"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:45.491228" 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-04-17T03:29:45.491459" 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-04-17T03:29:45.491966" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:45.491787" elapsed="0.000240"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:45.491769" 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-04-17T03:29:45.492203" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:45.492375" 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-04-17T03:29:45.492567" elapsed="0.000040"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:29:45.491725" elapsed="0.000916"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:29:45.491552" elapsed="0.001117"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:45.492819" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:45.492901" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:29:45.493098" 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-04-17T03:29:45.398900" elapsed="0.094239"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:45.494579" 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.238</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:45.494240" elapsed="0.000494"/>
</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-04-17T03:29:45.500056" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:29:45.701673" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:29:46.104975" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:29:46.107236" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:45.496986" elapsed="0.613990">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:45.494811" elapsed="0.616316">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:46.111512" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:46.111194" elapsed="0.000417"/>
</branch>
<status status="FAIL" start="2026-04-17T03:29:45.494791" elapsed="0.616856">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:29:46.112338" elapsed="0.000043"/>
</kw>
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:46.112462" elapsed="0.000029"/>
</return>
<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-04-17T03:29:45.493499" elapsed="0.619179">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:46.112799" elapsed="0.000026"/>
</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="FAIL" start="2026-04-17T03:29:45.368816" elapsed="0.744210">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="FAIL" start="2026-04-17T03:29:45.277996" elapsed="0.835333">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:29:46.119248" elapsed="0.000460"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:29:46.118740" elapsed="0.001113"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:46.121631" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:46.121445" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:46.121413" elapsed="0.000322"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:46.127202" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:46.127087" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:46.127068" elapsed="0.000204"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:46.128373" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:29:46.127947" elapsed="0.000456"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:29:46.128919" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:29:46.128572" elapsed="0.000396"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:29:46.129017" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:29:46.129225" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:29:46.127528" elapsed="0.001728"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:46.135833" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:46.135693" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:46.135667" 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-04-17T03:29:46.137397" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:46.137282" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:46.137264" elapsed="0.000203"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:46.138074" level="INFO">${karaf_connection_index} = 43</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:29:46.137622" elapsed="0.000492"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:46.138656" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:29:46.138351" elapsed="0.000342"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:29:46.140078" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:29:46.139405" elapsed="0.001495">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:29:46.141142" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:29:46.141202" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:46.138920" elapsed="0.002308"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:29:46.142240" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:29:46.141975" elapsed="0.000917">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:29:46.143100" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:29:46.143147" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:46.141449" elapsed="0.001721"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:29:46.144207" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Deconfigure_App_Peer"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:29:46.143512" elapsed="0.000782">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Deconfigure_App_Peer"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:46.143253" elapsed="0.001127">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Deconfigure_App_Peer"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:29:46.143231" elapsed="0.001185">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Deconfigure_App_Peer"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:46.144594" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:46.144829" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:46.144685" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:46.144666" elapsed="0.000334"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:29:46.145064" elapsed="0.000023"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:29:46.148271" elapsed="0.000161"/>
</kw>
<msg time="2026-04-17T03:29:46.148503" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:46.146908" 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-04-17T03:29:46.148921" elapsed="0.000110"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:46.149307" 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-04-17T03:29:46.146250" elapsed="0.003255"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:29:46.145417" elapsed="0.004157"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:29:46.136956" elapsed="0.012711">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Deconfigure_App_Peer"</status>
</kw>
<msg time="2026-04-17T03:29:46.149778" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:29:46.149822" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.060 Bgp Functional Mvpn.Deconfigure_App_Peer"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:46.136148" elapsed="0.013699"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:29:46.150148" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:46.150026" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:46.149999" elapsed="0.000219"/>
</if>
<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-04-17T03:29:46.151165" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:46.151055" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:46.151037" elapsed="0.000196"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:46.151531" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:29:46.151637" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:29:46.151394" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:46.152114" level="INFO">{1: 43}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:46.151821" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:46.152564" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:46.152313" elapsed="0.000295"/>
</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-04-17T03:29:46.153400" elapsed="0.000365"/>
</kw>
<msg time="2026-04-17T03:29:46.153899" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:29:46.154157" level="INFO">${old_connection_index} = 43</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:46.152843" elapsed="0.001339"/>
</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-04-17T03:29:46.155131" elapsed="0.000201"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:29:46.156678" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:29:46.156006" elapsed="0.001687">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:46.155504" elapsed="0.002293"/>
</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-04-17T03:29:46.158622" elapsed="0.000289"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:46.158129" elapsed="0.000892"/>
</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-04-17T03:29:46.154584" elapsed="0.004486"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:46.154264" elapsed="0.004858"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:46.154244" elapsed="0.004908"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:46.160153" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:29:46.159750" elapsed="0.000433"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:29:46.160328" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:29:46.160509" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:29:46.159390" elapsed="0.001151"/>
</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-04-17T03:29:46.160733" elapsed="0.000494"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:46.161588" level="INFO">index=44
host=10.30.170.120
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-04-17T03:29:46.161691" level="INFO">${karaf_connection_object} = index=44
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:29:46.161451" elapsed="0.000267"/>
</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-04-17T03:29:46.161997" elapsed="0.002328"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:29:46.164855" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:29:46.166204" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:29:46.164519" elapsed="0.002104">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:29:46.184631" elapsed="0.000556"/>
</kw>
<msg time="2026-04-17T03:29:46.185322" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:46.182733" elapsed="0.002805"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:46.185763" elapsed="0.000031"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:46.186038" elapsed="0.000028"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:29:46.167675" elapsed="0.018478"/>
</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-04-17T03:29:46.167008" elapsed="0.019212"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:29:46.150714" elapsed="0.035626">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:46.186876" elapsed="0.000034"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:29:46.186997" 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="FAIL" start="2026-04-17T03:29:46.135216" elapsed="0.051918">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:29:46.187271" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:29:46.187317" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:46.129702" elapsed="0.057638"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:46.187746" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:46.187429" elapsed="0.000391"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:46.187406" elapsed="0.000442"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:29:46.129541" elapsed="0.058332"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:29:46.129337" elapsed="0.058571"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:29:46.126690" elapsed="0.061302"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:29:46.120949" elapsed="0.067105"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:46.120144" elapsed="0.067959"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:29:46.114796" elapsed="0.073364"/>
</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-04-17T03:29:46.238616" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/app_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:46.238043" elapsed="0.000616"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:46.239782" 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-04-17T03:29:46.239414" elapsed="0.000478">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-04-17T03:29:46.240046" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:46.238898" elapsed="0.001179"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:46.240802" 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-04-17T03:29:46.240306" elapsed="0.000531"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:46.241255" 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-04-17T03:29:46.241455" 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-04-17T03:29:46.241071" elapsed="0.000418"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:46.242113" 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-04-17T03:29:46.241698" elapsed="0.000478"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:46.243671" level="INFO">mapping: {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:46.243288" elapsed="0.000448"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:46.244376" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:29:46.243987" elapsed="0.000424"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:46.245373" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:29:46.244925" elapsed="0.000484"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:46.246401" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:29:46.246140" elapsed="0.000297"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:46.246511" elapsed="0.000054"/>
</return>
<msg time="2026-04-17T03:29:46.246742" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:29:46.245693" elapsed="0.001086"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:46.247183" elapsed="0.000347"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:29:46.244722" elapsed="0.002861"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:46.248350" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:29:46.247923" elapsed="0.000458"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:46.249638" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:29:46.249092" elapsed="0.000579"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:46.249732" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:29:46.250053" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:29:46.248632" elapsed="0.001478"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:46.250362" elapsed="0.000366"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:29:46.247738" elapsed="0.003053"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:29:46.244483" elapsed="0.006359"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:29:46.250907" elapsed="0.000063"/>
</return>
<msg time="2026-04-17T03:29:46.251174" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:29:46.242788" elapsed="0.008424"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:46.242286" elapsed="0.009050"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:46.251608" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:46.251376" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:46.242252" elapsed="0.009469"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:46.252999" 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-04-17T03:29:46.251964" elapsed="0.001080"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:29:46.253119" elapsed="0.000050"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:29:46.236883" elapsed="0.016459"/>
</kw>
<msg time="2026-04-17T03:29:46.253430" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:46.221479" elapsed="0.032028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-04-17T03:29:46.270878" elapsed="0.000071"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:29:46.288535" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/mvpn/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-04-17T03:29:46.300981" elapsed="0.000054"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:46.301283" 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-04-17T03:29:46.301476" 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-04-17T03:29:46.301908" elapsed="0.000096"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:46.301751" elapsed="0.000294"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:46.301734" elapsed="0.000337"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:46.302222" 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-04-17T03:29:46.302394" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:46.302563" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:29:46.301696" elapsed="0.000921"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:29:46.301564" elapsed="0.001080"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:46.302794" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:46.302877" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:29:46.303147" 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-04-17T03:29:46.216315" elapsed="0.086863"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:46.304485" 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.120</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:46.304166" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:29:46.309668" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:29:46.511350" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:29:46.913915" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:29:46.916710" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:46.306750" elapsed="0.613966">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:46.304608" elapsed="0.616300">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:29:46.921482" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:46.921015" elapsed="0.000586"/>
</branch>
<status status="FAIL" start="2026-04-17T03:29:46.304590" elapsed="0.617052">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:29:46.927559" elapsed="0.000118"/>
</kw>
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:46.927805" elapsed="0.000045"/>
</return>
<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-04-17T03:29:46.303498" elapsed="0.624615">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:46.928213" elapsed="0.000023"/>
</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="FAIL" start="2026-04-17T03:29:46.188505" elapsed="0.739883">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Revert the BGP configuration to the original state: without application peer</doc>
<status status="FAIL" start="2026-04-17T03:29:46.113829" elapsed="0.814993">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:29:46.930219" elapsed="0.000661"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-17T03:29:46.931254" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-17T03:29:46.931138" elapsed="0.000321"/>
</kw>
<doc>Suite teardown keyword</doc>
<status status="PASS" start="2026-04-17T03:29:46.929733" elapsed="0.001807"/>
</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="FAIL" start="2026-04-17T03:27:58.827880" elapsed="108.103702"/>
</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-04-17T03:29:47.035659" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:29:47.031110" elapsed="0.004620"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-17T03:29:47.030814" elapsed="0.005001"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-17T03:29:47.041026" 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-04-17T03:29:47.037197" elapsed="0.003866"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-17T03:29:47.041303" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:47.041166" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:47.041135" elapsed="0.000246"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:47.041949" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:29:47.041555" elapsed="0.000440"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-17T03:29:47.042529" 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-04-17T03:29:47.042203" elapsed="0.000353"/>
</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-04-17T03:29:47.043110" elapsed="0.000303"/>
</kw>
<msg time="2026-04-17T03:29:47.043514" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:29:47.043561" level="INFO">${possibly_int_of_members} = 1</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:47.042728" elapsed="0.000857"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:47.044265" 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-04-17T03:29:47.043785" elapsed="0.000509"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:29:47.045497" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:29:47.045151" elapsed="0.000383"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:29:47.046039" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:29:47.045710" elapsed="0.000356"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:47.046613" 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-04-17T03:29:47.046286" elapsed="0.000355"/>
</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-04-17T03:29:47.049974" elapsed="0.000253"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:47.050742" level="INFO">${member_ip} = 10.30.170.120</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:47.050399" elapsed="0.000370"/>
</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-04-17T03:29:47.050944" elapsed="0.000242"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:47.052285" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:47.051821" elapsed="0.000491"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-17T03:29:47.052363" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:29:47.052559" 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-04-17T03:29:47.051467" elapsed="0.001120"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:29:47.053608" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.120:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a44167564d0&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-04-17T03:29:47.052758" elapsed="0.001016"/>
</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-04-17T03:29:47.054011" elapsed="0.000257"/>
</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-04-17T03:29:47.049367" elapsed="0.005003"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:29:47.049139" elapsed="0.005285"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-04-17T03:29:47.046701" elapsed="0.007759"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:47.055104" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:29:47.054637" elapsed="0.000525"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:47.055810" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.120'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:29:47.055378" elapsed="0.000477"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:47.056511" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:29:47.056073" elapsed="0.000492"/>
</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-04-17T03:29:47.044613" elapsed="0.012015"/>
</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-04-17T03:29:47.036773" elapsed="0.019914"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:47.056895" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:47.056762" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:47.056740" elapsed="0.000255"/>
</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-04-17T03:29:47.060503" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:29:47.060082" elapsed="0.000453"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:29:47.061036" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:29:47.060702" elapsed="0.000361"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:29:47.061110" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:29:47.061277" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:29:47.059715" elapsed="0.001587"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:47.062457" level="INFO">${member_ip} = 10.30.170.120</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-04-17T03:29:47.062129" elapsed="0.000359"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:47.063303" 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-04-17T03:29:47.063408" 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-04-17T03:29:47.063119" elapsed="0.000315"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:47.067035" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:47.066419" elapsed="0.000723"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:47.066397" elapsed="0.000861"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:47.067993" 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-04-17T03:29:47.068291" 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-04-17T03:29:47.067503" elapsed="0.000850"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:47.069383" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.120" 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-04-17T03:29:47.068632" elapsed="0.000860"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:47.070915" 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-04-17T03:29:47.069772" elapsed="0.001248"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-17T03:29:47.073104" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:29:47.073304" 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-04-17T03:29:47.072421" elapsed="0.000928"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:47.073759" elapsed="0.000619"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:29:47.075677" level="INFO">Logging into '10.30.170.120:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:29:47.780100" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 17 03:29:47 UTC 2026

  System load:  0.0                Processes:             121
  Usage of /:   10.4% of 77.35GB   Users logged in:       0
  Memory usage: 2%                 IPv4 address for ens3: 10.30.170.120
  Swap usage:   0%                 IPv6 address for ens3: 2607:f0d0:1002:11::2


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:27:59 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:29:47.075334" elapsed="0.704966"/>
</kw>
<msg time="2026-04-17T03:29:47.780394" 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-04-17T03:29:47.074756" elapsed="0.705826"/>
</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-04-17T03:29:47.071477" elapsed="0.709268"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:29:47.781639" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-17T03:29:47.794874" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-17T03:29:47.795186" level="INFO">${stdout} = </msg>
<msg time="2026-04-17T03:29:47.795337" 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-04-17T03:29:47.781146" elapsed="0.014263"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:29:47.795916" elapsed="0.000782"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:47.798744" 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-04-17T03:29:47.797693" elapsed="0.001216"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-17T03:29:47.799559" elapsed="0.000075"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:47.799181" elapsed="0.000566"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:47.799142" elapsed="0.000661"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:29:47.800347" elapsed="0.000098"/>
</return>
<status status="PASS" start="2026-04-17T03:29:47.799972" elapsed="0.000592"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:47.799897" elapsed="0.000725"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-17T03:29:47.800711" elapsed="0.000024"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:47.805686" 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="PASS" start="2026-04-17T03:29:47.806952" elapsed="0.000312"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:29:47.807533" elapsed="0.000229"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:29:47.801452" elapsed="0.006383"/>
</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-04-17T03:29:47.065367" elapsed="0.742861"/>
</kw>
<msg time="2026-04-17T03:29:47.808290" 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-04-17T03:29:47.064631" elapsed="0.743724"/>
</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-04-17T03:29:47.064133" elapsed="0.744306"/>
</kw>
<msg time="2026-04-17T03:29:47.808482" 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-04-17T03:29:47.063597" elapsed="0.744933"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:47.811347" elapsed="0.000334"/>
</kw>
<kw name="Open 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-04-17T03:29:47.811872" elapsed="0.000381"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:29:47.812414" 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-04-17T03:29:47.808841" elapsed="0.003758"/>
</kw>
<msg time="2026-04-17T03:29:47.812708" 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-04-17T03:29:47.062722" elapsed="0.750019"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:47.813489" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:47.813207" elapsed="0.000335"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-17T03:29:47.813593" 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-04-17T03:29:47.061729" elapsed="0.752018"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:29:47.061503" elapsed="0.752284"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:29:47.061360" elapsed="0.752467"/>
</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-04-17T03:29:47.057244" elapsed="0.756656"/>
</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-04-17T03:29:47.814095" elapsed="0.000242"/>
</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-04-17T03:29:47.830983" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:47.830743" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:47.830705" elapsed="0.000399"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:47.831576" 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-04-17T03:29:47.831734" 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-04-17T03:29:47.831357" elapsed="0.000404"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:47.832393" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:47.831985" elapsed="0.000458"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:47.832898" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:47.832637" elapsed="0.000326"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:47.833895" 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-04-17T03:29:47.833649" elapsed="0.000404">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-17T03:29:47.834192" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:29:47.834238" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:47.833187" elapsed="0.001074"/>
</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-04-17T03:29:47.834749" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:47.834425" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:47.834333" elapsed="0.000683"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:47.835962" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:29:47.835644" elapsed="0.000347"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:29:47.836044" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:29:47.836230" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:29:47.835309" elapsed="0.000955"/>
</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-04-17T03:29:47.836439" elapsed="0.000485"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:47.837340" level="INFO">index=4
host=10.30.170.120
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-04-17T03:29:47.837453" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.120
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-04-17T03:29:47.837181" elapsed="0.000298"/>
</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-04-17T03:29:47.837636" elapsed="0.003021"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:29:47.841213" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:29:47.842271" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:29:47.840874" elapsed="0.001951">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:47.846975" 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-04-17T03:29:47.847611" elapsed="0.000181"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:29:47.847967" elapsed="0.000107"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:29:47.844132" elapsed="0.003998"/>
</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-04-17T03:29:47.843347" elapsed="0.004832"/>
</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="FAIL" start="2026-04-17T03:29:47.830197" elapsed="0.018086">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:29:48.868139" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:48.867990" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:48.867959" elapsed="0.000271"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:48.868641" 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-04-17T03:29:48.868766" 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-04-17T03:29:48.868447" elapsed="0.000345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:48.869299" 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-04-17T03:29:48.868980" elapsed="0.000369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:48.869823" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:48.869510" elapsed="0.000359"/>
</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-04-17T03:29:48.870507" elapsed="0.000298"/>
</kw>
<msg time="2026-04-17T03:29:48.870913" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:29:48.870977" level="INFO">${old_connection_index} = 4</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:48.870058" elapsed="0.000943"/>
</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-04-17T03:29:48.871915" elapsed="0.000162"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:29:48.872883" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:29:48.872679" elapsed="0.000977">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:48.872280" elapsed="0.001443"/>
</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-04-17T03:29:48.874318" elapsed="0.000123"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:48.873906" elapsed="0.000612"/>
</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-04-17T03:29:48.871389" elapsed="0.003199"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:48.871101" elapsed="0.003736"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:48.871071" elapsed="0.003831"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:48.875881" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:29:48.875578" elapsed="0.000330"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:29:48.875976" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:29:48.876144" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:29:48.875252" elapsed="0.000923"/>
</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-04-17T03:29:48.876340" elapsed="0.000479"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:48.877128" level="INFO">index=6
host=10.30.170.120
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-04-17T03:29:48.877241" level="INFO">${karaf_connection_object} = index=6
host=10.30.170.120
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-04-17T03:29:48.877011" elapsed="0.000275"/>
</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-04-17T03:29:48.877467" elapsed="0.002815"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:29:48.880754" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:29:48.882080" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:29:48.880461" elapsed="0.002161">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:48.886001" elapsed="0.000378"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-17T03:29:48.886550" elapsed="0.000194"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:29:48.886918" elapsed="0.000123"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:29:48.883692" elapsed="0.003404"/>
</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-04-17T03:29:48.883046" elapsed="0.004097"/>
</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="FAIL" start="2026-04-17T03:29:48.867524" elapsed="0.019708">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:29:49.910343" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:49.910182" elapsed="0.000244"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:49.910150" elapsed="0.000303"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:49.910900" 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-04-17T03:29:49.911080" 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-04-17T03:29:49.910699" elapsed="0.000408"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:49.911597" level="INFO">{1: 6}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:49.911277" elapsed="0.000367"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:49.912143" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:49.911804" elapsed="0.000387"/>
</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-04-17T03:29:49.912997" elapsed="0.000236"/>
</kw>
<msg time="2026-04-17T03:29:49.913339" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:29:49.913386" level="INFO">${old_connection_index} = 6</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:49.912366" elapsed="0.001043"/>
</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-04-17T03:29:49.914364" elapsed="0.000143"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:29:49.915361" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:29:49.915165" elapsed="0.000725">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:49.914682" elapsed="0.001299"/>
</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-04-17T03:29:49.916679" elapsed="0.000126"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:49.916211" elapsed="0.000642"/>
</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-04-17T03:29:49.913805" elapsed="0.003104"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:49.913492" elapsed="0.003507"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:49.913471" elapsed="0.003569"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:49.918153" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:29:49.917756" elapsed="0.000434"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:29:49.918256" elapsed="0.000051"/>
</return>
<msg time="2026-04-17T03:29:49.918477" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:29:49.917366" elapsed="0.001145"/>
</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-04-17T03:29:49.918732" elapsed="0.000685"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:49.919824" level="INFO">index=8
host=10.30.170.120
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-04-17T03:29:49.919992" level="INFO">${karaf_connection_object} = index=8
host=10.30.170.120
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-04-17T03:29:49.919661" elapsed="0.000371"/>
</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-04-17T03:29:49.920249" elapsed="0.003232"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:29:49.924077" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:29:49.925329" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:29:49.923691" elapsed="0.002173">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:49.929292" elapsed="0.000380"/>
</kw>
<kw name="Open 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-04-17T03:29:49.929843" elapsed="0.000185"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:29:49.930183" elapsed="0.000103"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:29:49.926882" elapsed="0.003458"/>
</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-04-17T03:29:49.926252" elapsed="0.004135"/>
</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="FAIL" start="2026-04-17T03:29:49.909576" elapsed="0.020904">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:29:50.948782" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:50.948587" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:50.948549" elapsed="0.000359"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:50.949630" 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-04-17T03:29:50.949798" 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-04-17T03:29:50.949348" elapsed="0.000487"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:50.950510" level="INFO">{1: 8}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:50.950081" elapsed="0.000495"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:50.951167" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:50.950796" elapsed="0.000459"/>
</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-04-17T03:29:50.952135" elapsed="0.000263"/>
</kw>
<msg time="2026-04-17T03:29:50.952538" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:29:50.952604" level="INFO">${old_connection_index} = 8</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:50.951507" elapsed="0.001130"/>
</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-04-17T03:29:50.953820" elapsed="0.000212"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:29:50.955005" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:29:50.954736" elapsed="0.001046">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:50.954274" elapsed="0.001595"/>
</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-04-17T03:29:50.956588" elapsed="0.000142"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:50.956128" elapsed="0.000665"/>
</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-04-17T03:29:50.953096" elapsed="0.003760"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:50.952746" elapsed="0.004179"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:50.952719" elapsed="0.004265"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:50.958118" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:29:50.957718" elapsed="0.000437"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:29:50.958228" elapsed="0.000052"/>
</return>
<msg time="2026-04-17T03:29:50.958454" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:29:50.957304" elapsed="0.001184"/>
</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-04-17T03:29:50.958705" elapsed="0.000644"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:50.959748" level="INFO">index=10
host=10.30.170.120
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-04-17T03:29:50.959886" level="INFO">${karaf_connection_object} = index=10
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:29:50.959589" elapsed="0.000334"/>
</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-04-17T03:29:50.960159" elapsed="0.003578"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:29:50.964405" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:29:50.965718" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:29:50.964015" elapsed="0.002317">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:50.970733" elapsed="0.000524"/>
</kw>
<kw name="Open 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-04-17T03:29:50.971488" elapsed="0.000230"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:29:50.971955" elapsed="0.000144"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:29:50.967683" elapsed="0.004493"/>
</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-04-17T03:29:50.966789" elapsed="0.005567"/>
</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="FAIL" start="2026-04-17T03:29:50.948013" elapsed="0.024467">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:29:50.972611" level="FAIL">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<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="FAIL" start="2026-04-17T03:29:47.815249" elapsed="3.157495">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:47.814788" elapsed="3.158047"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:29:47.814619" elapsed="3.158275"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-04-17T03:29:47.814445" elapsed="3.158519"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-17T03:29:47.036230" elapsed="3.936823"/>
</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-04-17T03:29:50.976794" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:50.976627" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:50.976596" elapsed="0.000298"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:50.983500" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:50.983345" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:50.983317" elapsed="0.000280"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:50.985055" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:29:50.984445" elapsed="0.000647"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:29:50.985730" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:29:50.985320" elapsed="0.000448"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:29:50.985825" elapsed="0.000049"/>
</return>
<msg time="2026-04-17T03:29:50.986069" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:29:50.983968" elapsed="0.002134"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:50.994112" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:50.993917" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:50.993886" elapsed="0.000334"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:50.996124" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:50.995883" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:50.995858" elapsed="0.000364"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:50.996893" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:29:50.996434" elapsed="0.000516"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:50.997676" 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-04-17T03:29:50.997365" elapsed="0.000348"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:29:50.999360" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:29:50.998675" elapsed="0.001833">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:29:51.000708" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:29:51.000774" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:50.997962" elapsed="0.002846"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:29:51.002410" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:29:51.001831" elapsed="0.001738">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:29:51.003755" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:29:51.003907" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:51.001100" elapsed="0.002862"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:29:51.005561" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/070_bgp_functional_l3vpn_mcast.robot"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:29:51.004443" elapsed="0.001230">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/070_bgp_functional_l3vpn_mcast.robot"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:51.004080" elapsed="0.001780">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/070_bgp_functional_l3vpn_mcast.robot"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:29:51.004048" elapsed="0.001863">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/070_bgp_functional_l3vpn_mcast.robot"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:51.006170" elapsed="0.000031"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:51.006496" elapsed="0.000067"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:51.006292" elapsed="0.000403"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:51.006269" elapsed="0.000465"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:29:51.006785" 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>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:51.009745" elapsed="0.000655"/>
</kw>
<kw name="Open 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-04-17T03:29:51.010868" elapsed="0.000450"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:29:51.011721" elapsed="0.000309"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:29:51.008532" elapsed="0.003605"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:29:51.007251" elapsed="0.005047"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:29:50.995480" elapsed="0.016945">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/070_bgp_functional_l3vpn_mcast.robot"</status>
</kw>
<msg time="2026-04-17T03:29:51.012562" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:29:51.012614" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/070_bgp_functional_l3vpn_mcast.robot"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:50.994471" elapsed="0.018170"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:29:51.012895" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:51.012747" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:51.012719" elapsed="0.000402"/>
</if>
<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-04-17T03:29:51.014128" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:51.014005" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:51.013983" elapsed="0.000222"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:51.016626" 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-04-17T03:29:51.016806" 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-04-17T03:29:51.014398" elapsed="0.002447"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:51.017635" level="INFO">{1: 10}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:51.017202" elapsed="0.000496"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:51.018272" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:51.017913" elapsed="0.000421"/>
</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-04-17T03:29:51.019146" elapsed="0.000467"/>
</kw>
<msg time="2026-04-17T03:29:51.019749" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:29:51.019812" level="INFO">${old_connection_index} = 10</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:51.018564" elapsed="0.001281"/>
</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-04-17T03:29:51.021813" elapsed="0.000379"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:29:51.024124" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:29:51.023709" elapsed="0.001155">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:51.022600" elapsed="0.002437"/>
</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-04-17T03:29:51.026397" elapsed="0.000273"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:51.025385" elapsed="0.001384"/>
</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-04-17T03:29:51.020506" elapsed="0.006379"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:51.019979" elapsed="0.007000"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:51.019944" elapsed="0.007080"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:51.028494" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:29:51.027844" elapsed="0.000690"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:29:51.028600" elapsed="0.000054"/>
</return>
<msg time="2026-04-17T03:29:51.028824" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:29:51.027403" elapsed="0.001454"/>
</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-04-17T03:29:51.029105" elapsed="0.000584"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:51.030476" level="INFO">index=13
host=10.30.170.120
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-04-17T03:29:51.030617" level="INFO">${karaf_connection_object} = index=13
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:29:51.030105" elapsed="0.000549"/>
</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-04-17T03:29:51.030869" elapsed="0.003409"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:29:51.034914" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:29:51.036249" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:29:51.034535" elapsed="0.002307">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:51.042149" elapsed="0.000976"/>
</kw>
<kw name="Open 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-04-17T03:29:51.043526" elapsed="0.000621"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:29:51.044448" elapsed="0.000258"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:29:51.038184" elapsed="0.006641"/>
</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-04-17T03:29:51.037326" elapsed="0.007569"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:29:51.013668" elapsed="0.031395">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:51.045611" elapsed="0.000038"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:29:51.045719" elapsed="0.000029"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:29:50.993448" elapsed="0.052431">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:29:51.046083" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:29:51.046145" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:50.986629" elapsed="0.059550"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:51.046769" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:51.046388" elapsed="0.000459"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:51.046359" elapsed="0.000523"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:29:50.986425" elapsed="0.060490"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:29:50.986182" elapsed="0.060802"/>
</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-04-17T03:29:50.982871" elapsed="0.064193"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-17T03:29:50.973898" elapsed="0.073247"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:50.973275" elapsed="0.073929"/>
</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-04-17T03:29:47.030450" elapsed="4.016899"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:51.048140" level="INFO">${mininet_conn_id} = 15</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-04-17T03:29:51.047573" elapsed="0.000601"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:51.048889" level="INFO">${mininet_conn_id} = 15</msg>
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:29:51.048418" elapsed="0.000551"/>
</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-04-17T03:29:51.051556" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:29:51.051662" 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-04-17T03:29:51.051146" 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>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:51.051918" elapsed="0.000553"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:29:51.053644" level="INFO">Logging into '10.30.171.238:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:29:51.685774" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 17 03:29:51 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:28:02 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:29:51.053219" elapsed="0.632761"/>
</kw>
<msg time="2026-04-17T03:29:51.686083" 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-04-17T03:29:51.052705" elapsed="0.633466"/>
</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-04-17T03:29:51.050535" elapsed="0.635783"/>
</kw>
<msg time="2026-04-17T03:29:51.686371" 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-04-17T03:29:51.049767" elapsed="0.636652"/>
</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-04-17T03:29:51.049252" elapsed="0.637246"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:29:51.687151" level="INFO">Creating Session using : alias=config-session, url=http://10.30.170.120:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a44169ea8d0&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-04-17T03:29:51.686755" elapsed="0.000592"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-04-17T03:29:51.698123" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-04-17T03:29:51.714259" 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-04-17T03:29:51.687615" elapsed="0.026837"/>
</kw>
<kw name="Assure_Library_Ipaddr" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:29:51.716921" level="INFO">Executing command 'bash -c 'cd "." &amp;&amp; python -c "import ipaddr"''.</msg>
<msg time="2026-04-17T03:29:51.749566" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:29:51.749961" level="INFO">${stdout} = </msg>
<msg time="2026-04-17T03:29:51.750071" level="INFO">${stderr} = </msg>
<msg time="2026-04-17T03:29:51.750163" 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-04-17T03:29:51.716705" elapsed="0.033510"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:29:51.752518" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-04-17T03:29:51.751819" elapsed="0.000860"/>
</kw>
<msg time="2026-04-17T03:29:51.753022" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-04-17T03:29:51.753164" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:51.750851" elapsed="0.002379"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:51.754657" 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-04-17T03:29:51.753642" elapsed="0.001075"/>
</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-04-17T03:29:51.755820" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:51.754901" elapsed="0.001079"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:51.754853" elapsed="0.001169"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-04-17T03:29:51.756273" elapsed="0.000053"/>
</return>
<status status="PASS" start="2026-04-17T03:29:51.756105" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:51.756082" elapsed="0.000330"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-04-17T03:29:51.756547" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:51.756494" elapsed="0.000113"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:51.756472" elapsed="0.000167"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:51.756860" elapsed="0.000031"/>
</kw>
<msg time="2026-04-17T03:29:51.757113" 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-04-17T03:29:51.716244" elapsed="0.040907"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-04-17T03:29:51.757389" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-17T03:29:51.757255" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:51.757230" elapsed="0.000273"/>
</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-04-17T03:29:51.757748" elapsed="0.000054"/>
</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-04-17T03:29:51.715160" elapsed="0.042794"/>
</kw>
<doc>Initialize SetupUtils. Suite setup keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:47.029888" elapsed="4.728155"/>
</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-04-17T03:29:51.763504" elapsed="0.000377"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:29:51.763034" elapsed="0.000953"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:51.765206" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:51.765027" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:51.764999" elapsed="0.000280"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:51.770622" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:51.770506" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:51.770484" elapsed="0.000208"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:51.771859" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:29:51.771393" elapsed="0.000496"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:29:51.772395" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:29:51.772085" elapsed="0.000336"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:29:51.772467" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:29:51.772630" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:29:51.770963" elapsed="0.001693"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:51.778719" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:51.778607" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:51.778587" 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-04-17T03:29:51.780161" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:51.780051" elapsed="0.000244"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:51.780033" elapsed="0.000289"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:51.780899" level="INFO">${karaf_connection_index} = 13</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:29:51.780477" elapsed="0.000481"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:51.781412" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:29:51.781174" elapsed="0.000264"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:29:51.782259" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:29:51.781977" elapsed="0.001096">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:29:51.783302" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:29:51.783353" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:51.781606" elapsed="0.001771"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:29:51.784238" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:29:51.783956" elapsed="0.000940">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:29:51.785112" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:29:51.785159" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:51.783579" elapsed="0.001603"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:29:51.786244" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Configure_App_Peer"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:29:51.785492" elapsed="0.000818">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Configure_App_Peer"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:51.785261" elapsed="0.001122">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Configure_App_Peer"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:29:51.785240" elapsed="0.001177">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Configure_App_Peer"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:51.786585" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:51.786814" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:51.786671" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:51.786655" elapsed="0.000234"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:29:51.786922" 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-04-17T03:29:51.790177" elapsed="0.000153"/>
</kw>
<msg time="2026-04-17T03:29:51.790399" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:51.788873" 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-04-17T03:29:51.790883" elapsed="0.000199"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:51.791366" 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-04-17T03:29:51.787903" elapsed="0.003687"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:29:51.787292" 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="FAIL" start="2026-04-17T03:29:51.779706" elapsed="0.012042">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Configure_App_Peer"</status>
</kw>
<msg time="2026-04-17T03:29:51.791858" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:29:51.791902" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Configure_App_Peer"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:51.778969" elapsed="0.012976"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:29:51.792190" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:51.792061" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:51.792035" elapsed="0.000420"/>
</if>
<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-04-17T03:29:51.793579" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:51.793471" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:51.793453" elapsed="0.000267"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:51.794035" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:29:51.794142" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:29:51.793883" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:51.794601" level="INFO">{1: 13}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:51.794327" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:51.795209" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:51.794818" elapsed="0.000436"/>
</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-04-17T03:29:51.795832" elapsed="0.000291"/>
</kw>
<msg time="2026-04-17T03:29:51.796224" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:29:51.796270" level="INFO">${old_connection_index} = 13</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:51.795446" elapsed="0.000847"/>
</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-04-17T03:29:51.797419" elapsed="0.000204"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:29:51.798717" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:29:51.798301" elapsed="0.001473">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:51.797795" elapsed="0.002079"/>
</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-04-17T03:29:51.800582" elapsed="0.000282"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:51.800103" elapsed="0.000899"/>
</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-04-17T03:29:51.796642" elapsed="0.004429"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:51.796368" elapsed="0.004769"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:51.796349" elapsed="0.004816"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:51.802131" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:29:51.801760" elapsed="0.000399"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:29:51.802208" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:29:51.802367" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:29:51.801381" elapsed="0.001010"/>
</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-04-17T03:29:51.802549" elapsed="0.000471"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:51.803303" level="INFO">index=16
host=10.30.170.120
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-04-17T03:29:51.803403" level="INFO">${karaf_connection_object} = index=16
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:29:51.803194" elapsed="0.000254"/>
</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-04-17T03:29:51.803600" elapsed="0.002310"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:29:51.806374" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:29:51.807695" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:29:51.806107" elapsed="0.002005">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:29:51.822123" elapsed="0.000408"/>
</kw>
<msg time="2026-04-17T03:29:51.822627" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:51.820620" elapsed="0.002161"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:51.822990" elapsed="0.000028"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:51.823221" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:29:51.808946" elapsed="0.014360"/>
</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-04-17T03:29:51.808411" elapsed="0.014943"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:29:51.792920" elapsed="0.030541">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:51.823844" elapsed="0.000035"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:29:51.824337" 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="FAIL" start="2026-04-17T03:29:51.778251" elapsed="0.046220">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:29:51.824608" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:29:51.824661" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:51.773077" elapsed="0.051608"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:51.825061" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:51.824772" elapsed="0.000345"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:51.824751" elapsed="0.000391"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:29:51.772897" elapsed="0.052270"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:29:51.772717" elapsed="0.052483"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:29:51.770067" elapsed="0.055193"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:29:51.764649" elapsed="0.060669"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:51.764164" elapsed="0.061201"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:29:51.759145" elapsed="0.066274"/>
</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-04-17T03:29:51.860909" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:51.860514" elapsed="0.000441"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:51.861989" 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-04-17T03:29:51.861707" elapsed="0.000360">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-04-17T03:29:51.862161" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:51.861360" elapsed="0.000835"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:51.862746" 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-04-17T03:29:51.862359" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:51.863092" 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-04-17T03:29:51.863277" 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-04-17T03:29:51.862949" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:51.863745" 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-04-17T03:29:51.863490" 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-04-17T03:29:51.864840" level="INFO">mapping: {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:51.864581" elapsed="0.000303"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:51.865553" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:29:51.865060" elapsed="0.000520"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:51.866280" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:29:51.865971" elapsed="0.000336"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:51.867066" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:29:51.866828" elapsed="0.000264"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:51.867144" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:29:51.867303" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:29:51.866502" elapsed="0.000826"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:51.867510" elapsed="0.000240"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:29:51.865813" elapsed="0.001979"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:51.868363" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:29:51.868060" elapsed="0.000329"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:51.869131" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:29:51.868903" elapsed="0.000253"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:51.869205" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:29:51.869356" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:29:51.868578" elapsed="0.000803"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:51.869532" elapsed="0.000224"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:29:51.867906" elapsed="0.001891"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:29:51.865634" elapsed="0.004197"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:29:51.869873" elapsed="0.000027"/>
</return>
<msg time="2026-04-17T03:29:51.870054" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:29:51.864254" elapsed="0.005831"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:51.863917" elapsed="0.006201"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:51.870293" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:51.870143" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:51.863896" elapsed="0.006474"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:51.871123" 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-04-17T03:29:51.870514" elapsed="0.000638"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:29:51.871201" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:29:51.859869" elapsed="0.011457"/>
</kw>
<msg time="2026-04-17T03:29:51.871381" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:51.846645" elapsed="0.024783"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:29:51.883777" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:51.896035" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:51.908223" elapsed="0.000032"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:51.908444" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:51.908622" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:51.909038" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:51.908864" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:51.908849" 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-04-17T03:29:51.909264" elapsed="0.000019"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:51.909430" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:51.909595" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:29:51.908815" elapsed="0.000831"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:29:51.908703" elapsed="0.000969"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:51.909818" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:51.909894" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:29:51.910049" 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-04-17T03:29:51.841850" elapsed="0.068227"/>
</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-04-17T03:29:51.936635" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:51.936242" elapsed="0.000422"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:51.937430" 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-04-17T03:29:51.937185" elapsed="0.000320">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-04-17T03:29:51.937598" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:51.936829" elapsed="0.000795"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:51.938193" 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-04-17T03:29:51.937788" elapsed="0.000433"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:51.938570" 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-04-17T03:29:51.938802" 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-04-17T03:29:51.938400" elapsed="0.000431"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:51.939264" 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-04-17T03:29:51.939010" 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-04-17T03:29:51.939747" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:51.939386" elapsed="0.000421"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:51.940342" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:51.940018" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:51.939833" elapsed="0.000571"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:51.939365" elapsed="0.001060"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:51.941173" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.120&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-04-17T03:29:51.940574" elapsed="0.000630"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:29:51.941255" elapsed="0.000035"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/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-04-17T03:29:51.935598" elapsed="0.005791"/>
</kw>
<msg time="2026-04-17T03:29:51.941443" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:51.922944" elapsed="0.018547"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:29:51.953992" elapsed="0.000048"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:29:51.967204" elapsed="0.000038"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/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-04-17T03:29:51.981252" elapsed="0.000043"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:51.981522" 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-04-17T03:29:51.981722" 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-04-17T03:29:51.982208" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:51.982039" elapsed="0.000232"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:51.982020" 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-04-17T03:29:51.982458" 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-04-17T03:29:51.982718" 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-04-17T03:29:51.982975" elapsed="0.000027"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:29:51.981977" elapsed="0.001065"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:29:51.981815" elapsed="0.001260"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:51.983241" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:51.983329" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:29:51.983539" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.120&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-04-17T03:29:51.920287" elapsed="0.063290"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:51.985235" 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-04-17T03:29:51.984860" elapsed="0.000463">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-04-17T03:29:51.985432" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:51.984414" elapsed="0.001045"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:51.985841" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:51.985542" elapsed="0.000363"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:51.986538" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:51.986179" elapsed="0.000388"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:51.985964" elapsed="0.000643"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:51.985518" elapsed="0.001113"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:51.989199" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:29:51.986803" elapsed="0.002432"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:29:51.989301" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:29:51.989487" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:29:51.984005" elapsed="0.005510"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:51.991179" 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.120</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:51.990820" elapsed="0.000419"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:51.991740" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.120&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-04-17T03:29:51.991418" elapsed="0.000378"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:51.992312" 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-04-17T03:29:51.992004" elapsed="0.000357"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:51.992793" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:51.992526" elapsed="0.000315"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:51.993810" 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-04-17T03:29:51.993577" elapsed="0.000263"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:29:51.994260" 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-04-17T03:29:51.994061" elapsed="0.000226"/>
</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-04-17T03:29:51.994451" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:51.995254" 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-04-17T03:29:51.994958" elapsed="0.000346"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:29:51.995353" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:29:51.995552" 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-04-17T03:29:51.993108" elapsed="0.002471"/>
</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-04-17T03:29:52.001254" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:29:52.202870" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:29:52.605623" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:29:52.607745" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:29:51.998135" elapsed="0.612816">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:51.995661" elapsed="0.615452">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:52.611516" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:52.611180" elapsed="0.000442"/>
</branch>
<status status="FAIL" start="2026-04-17T03:29:51.995639" elapsed="0.616047">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:52.612344" elapsed="0.000042"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:52.612543" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:52.612490" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:52.612461" 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-04-17T03:29:52.612864" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:29:52.612986" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:29:51.989899" elapsed="0.623255">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:52.613334" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:29:51.830402" elapsed="0.783072">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:52.613900" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:52.613628" elapsed="0.000384"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:52.613603" elapsed="0.000443"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:52.614092" elapsed="0.000019"/>
</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="FAIL" start="2026-04-17T03:29:51.825733" elapsed="0.788495">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Configures bgp application peer.</doc>
<status status="FAIL" start="2026-04-17T03:29:51.758133" elapsed="0.856337">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:29:52.619784" elapsed="0.000415"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:29:52.619149" elapsed="0.001141"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:52.621806" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:52.621624" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:52.621592" elapsed="0.000316"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:52.629134" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:52.628957" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:52.628909" elapsed="0.000330"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:52.630826" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:29:52.630214" elapsed="0.000652"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:29:52.631564" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:29:52.631128" elapsed="0.000473"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:29:52.631731" elapsed="0.000054"/>
</return>
<msg time="2026-04-17T03:29:52.631990" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:29:52.629615" elapsed="0.002412"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:52.639220" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:52.639081" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:52.639053" 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-04-17T03:29:52.641073" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:52.640889" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:52.640863" elapsed="0.000301"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:52.641674" level="INFO">${karaf_connection_index} = 16</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:29:52.641330" elapsed="0.000372"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:52.642187" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:29:52.641891" elapsed="0.000324"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:29:52.643320" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:29:52.642979" elapsed="0.001151">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:29:52.644331" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:29:52.644380" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:52.642531" elapsed="0.001873"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:29:52.645317" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:29:52.644997" elapsed="0.001001">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:29:52.646189" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:29:52.646236" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:52.644588" elapsed="0.001671"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:29:52.647569" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Reconfigure_ODL_To_Accept_Connection"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:29:52.646623" elapsed="0.001074">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Reconfigure_ODL_To_Accept_Connection"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:52.646342" elapsed="0.001454">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Reconfigure_ODL_To_Accept_Connection"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:29:52.646319" elapsed="0.001522">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Reconfigure_ODL_To_Accept_Connection"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:52.648092" elapsed="0.000032"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:52.648418" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:52.648214" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:52.648189" elapsed="0.000334"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:29:52.648572" elapsed="0.000023"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:29:52.651553" elapsed="0.000230"/>
</kw>
<msg time="2026-04-17T03:29:52.651878" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:52.650419" 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-04-17T03:29:52.652390" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:52.652776" elapsed="0.000081"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:29:52.649738" elapsed="0.003256"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:29:52.648994" elapsed="0.004072"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:29:52.640519" elapsed="0.012636">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Reconfigure_ODL_To_Accept_Connection"</status>
</kw>
<msg time="2026-04-17T03:29:52.653264" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:29:52.653307" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Reconfigure_ODL_To_Accept_Connection"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:52.639527" elapsed="0.013804"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:29:52.653527" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:52.653413" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:52.653393" elapsed="0.000202"/>
</if>
<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-04-17T03:29:52.654640" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:52.654499" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:52.654475" elapsed="0.000252"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:52.655156" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:29:52.655303" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:29:52.654970" elapsed="0.000441"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:52.655994" level="INFO">{1: 16}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:52.655632" elapsed="0.000431"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:52.656607" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:52.656271" elapsed="0.000398"/>
</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-04-17T03:29:52.657323" elapsed="0.000290"/>
</kw>
<msg time="2026-04-17T03:29:52.657716" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:29:52.657762" level="INFO">${old_connection_index} = 16</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:52.656843" elapsed="0.000942"/>
</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-04-17T03:29:52.658772" elapsed="0.000287"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:29:52.660600" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:29:52.660048" elapsed="0.001593">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:52.659292" elapsed="0.002491"/>
</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-04-17T03:29:52.662842" elapsed="0.000417"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:52.662150" elapsed="0.001228"/>
</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-04-17T03:29:52.658212" elapsed="0.005234"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:52.657867" elapsed="0.005652"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:52.657846" elapsed="0.005719"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:52.664912" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:29:52.664469" elapsed="0.000501"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:29:52.665043" elapsed="0.000049"/>
</return>
<msg time="2026-04-17T03:29:52.665226" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:29:52.663950" elapsed="0.001301"/>
</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-04-17T03:29:52.665420" elapsed="0.000445"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:52.668415" level="INFO">index=17
host=10.30.170.120
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-04-17T03:29:52.668538" level="INFO">${karaf_connection_object} = index=17
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:29:52.666137" elapsed="0.002428"/>
</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-04-17T03:29:52.668740" elapsed="0.002456"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:29:52.671827" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:29:52.673174" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:29:52.671436" elapsed="0.002322">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:29:52.692082" elapsed="0.000552"/>
</kw>
<msg time="2026-04-17T03:29:52.692773" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:52.689956" elapsed="0.003265"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:52.693467" elapsed="0.000035"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:52.693716" elapsed="0.000031"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:29:52.675161" elapsed="0.018682"/>
</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-04-17T03:29:52.674293" elapsed="0.019623"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:29:52.654121" elapsed="0.040035">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:52.694711" elapsed="0.000036"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:29:52.694818" 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="FAIL" start="2026-04-17T03:29:52.638487" elapsed="0.056508">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:29:52.695166" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:29:52.695230" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:52.632591" elapsed="0.062673"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:52.695823" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:52.695382" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:52.695353" elapsed="0.001017"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:29:52.632375" elapsed="0.064045"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:29:52.632112" elapsed="0.064356"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:29:52.628353" elapsed="0.068191"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:29:52.621203" elapsed="0.075421"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:52.620524" elapsed="0.076170"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:29:52.615998" elapsed="0.080771"/>
</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-04-17T03:29:52.738821" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:52.738267" elapsed="0.000591"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:52.740092" 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-04-17T03:29:52.739459" elapsed="0.000719">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-04-17T03:29:52.740279" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:52.739073" elapsed="0.001231"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:52.740949" 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-04-17T03:29:52.740505" elapsed="0.000475"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:52.741304" 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-04-17T03:29:52.741502" 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-04-17T03:29:52.741154" elapsed="0.000375"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:52.741974" 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-04-17T03:29:52.741693" 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-04-17T03:29:52.743259" level="INFO">mapping: {'IP': '10.30.171.238', '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-04-17T03:29:52.742906" elapsed="0.000400"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:52.743839" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:29:52.743539" elapsed="0.000343"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:52.744783" level="INFO">${value} = 10.30.171.238</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:29:52.744476" elapsed="0.000334"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:52.745669" level="INFO">${encoded} = 10.30.171.238</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:29:52.745435" elapsed="0.000260"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:52.745751" elapsed="0.000048"/>
</return>
<msg time="2026-04-17T03:29:52.745970" level="INFO">${encoded_value} = 10.30.171.238</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:29:52.745033" elapsed="0.000965"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:52.746160" elapsed="0.000257"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.238</var>
<status status="PASS" start="2026-04-17T03:29:52.744179" elapsed="0.002280"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:52.747063" 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-04-17T03:29:52.746709" elapsed="0.000381"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:52.747912" 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-04-17T03:29:52.747646" elapsed="0.000314"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:52.748026" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:29:52.748186" 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-04-17T03:29:52.747296" 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-04-17T03:29:52.748376" elapsed="0.000289"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:29:52.746575" elapsed="0.002134"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:52.749328" 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-04-17T03:29:52.749000" elapsed="0.000356"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:52.750413" 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-04-17T03:29:52.750008" elapsed="0.000431"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:52.750490" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:29:52.750642" 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-04-17T03:29:52.749642" elapsed="0.001025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:52.750835" elapsed="0.000253"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:29:52.748823" elapsed="0.002307"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:52.751981" 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-04-17T03:29:52.751417" elapsed="0.000611"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:52.753011" 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-04-17T03:29:52.752734" elapsed="0.000314"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:52.753108" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:29:52.753270" 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-04-17T03:29:52.752230" elapsed="0.001065"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:52.753459" elapsed="0.000259"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:29:52.751257" elapsed="0.002505"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:52.754485" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:29:52.754094" elapsed="0.000418"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:52.755309" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:29:52.755084" elapsed="0.000251"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:52.755384" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:29:52.755540" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:29:52.754708" elapsed="0.000858"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:52.755764" elapsed="0.000312"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:29:52.753877" elapsed="0.002305"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:52.756817" 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-04-17T03:29:52.756465" elapsed="0.000379"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:52.757615" 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-04-17T03:29:52.757401" elapsed="0.000240"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:52.757705" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:29:52.757862" 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-04-17T03:29:52.757066" 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-04-17T03:29:52.758143" elapsed="0.000320"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:29:52.756325" elapsed="0.002194"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:29:52.743966" elapsed="0.014602"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:29:52.758624" elapsed="0.000050"/>
</return>
<msg time="2026-04-17T03:29:52.758854" level="INFO">${mapping_to_use} = {'IP': '10.30.171.238', '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-04-17T03:29:52.742519" elapsed="0.016369"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:52.742143" elapsed="0.016816"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:52.759189" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:52.759002" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:52.742116" elapsed="0.017168"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:52.760257" 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-04-17T03:29:52.759448" elapsed="0.000840"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:29:52.760337" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:29:52.737239" elapsed="0.023229"/>
</kw>
<msg time="2026-04-17T03:29:52.760528" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:52.722786" elapsed="0.037798"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:29:52.774015" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:29:52.787480" 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/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-04-17T03:29:52.800847" elapsed="0.000060"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:52.801203" 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-04-17T03:29:52.801584" 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-04-17T03:29:52.802193" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:52.802024" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:52.802003" elapsed="0.000291"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:52.802458" 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-04-17T03:29:52.802667" 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-04-17T03:29:52.802850" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:29:52.801908" elapsed="0.000996"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:29:52.801702" elapsed="0.001247"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:52.803101" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:52.803182" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:29:52.803363" 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-04-17T03:29:52.717477" elapsed="0.085916"/>
</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-04-17T03:29:52.833362" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:52.832838" elapsed="0.000569"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:52.834287" 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-04-17T03:29:52.833968" elapsed="0.000400">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-04-17T03:29:52.834466" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:52.833592" elapsed="0.000899"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:52.835099" 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-04-17T03:29:52.834660" elapsed="0.000467"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:52.835437" 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-04-17T03:29:52.835622" 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-04-17T03:29:52.835292" elapsed="0.000359"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:52.836117" 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-04-17T03:29:52.835835" elapsed="0.000334"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-17T03:29:52.836634" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:52.836253" elapsed="0.000442"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:52.837219" level="INFO">${mapping_to_use} = {'IP': '10.30.171.238', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:52.836872" elapsed="0.000375"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:52.836722" elapsed="0.000665"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:52.836227" elapsed="0.001186"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:52.838479" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.238&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/pee...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:29:52.837568" elapsed="0.000943"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:29:52.838565" 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_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-04-17T03:29:52.831800" elapsed="0.006918"/>
</kw>
<msg time="2026-04-17T03:29:52.838778" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:52.817458" elapsed="0.021387"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:29:52.852237" elapsed="0.000260"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:29:52.866992" elapsed="0.000069"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:29:52.880738" elapsed="0.000063"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:52.881224" 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-04-17T03:29:52.881430" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:52.881969" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:52.881750" elapsed="0.000393"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:52.881731" elapsed="0.000447"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:52.882378" 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-04-17T03:29:52.882559" 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-04-17T03:29:52.882728" elapsed="0.000025"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:29:52.881688" elapsed="0.001107"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:29:52.881518" elapsed="0.001314"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:52.883024" elapsed="0.000055"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:52.883205" elapsed="0.000045"/>
</return>
<msg time="2026-04-17T03:29:52.883547" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.238&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/pee...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:29:52.814355" elapsed="0.069232"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:52.885416" 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-04-17T03:29:52.885049" elapsed="0.000449">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-04-17T03:29:52.885598" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:52.884601" elapsed="0.001022"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:52.886005" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:52.885705" elapsed="0.000359"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:52.886626" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:52.886295" elapsed="0.000358"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:52.886089" elapsed="0.000600"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:52.885682" elapsed="0.001029"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:52.889337" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:29:52.886871" elapsed="0.002498"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:29:52.889432" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:29:52.889625" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:29:52.884207" elapsed="0.005444"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:52.891339" 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.238</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:52.891025" elapsed="0.000385"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:52.891923" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.238&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-04-17T03:29:52.891618" elapsed="0.000376"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:52.892419" 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-04-17T03:29:52.892159" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:52.892872" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:52.892620" elapsed="0.000298"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:52.893908" 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-04-17T03:29:52.893688" elapsed="0.000267"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:29:52.894307" 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-04-17T03:29:52.894119" elapsed="0.000215"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:52.894519" elapsed="0.000246"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:52.895265" 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-04-17T03:29:52.894961" elapsed="0.000353"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:29:52.895365" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:29:52.895563" 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-04-17T03:29:52.893185" elapsed="0.002405"/>
</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-04-17T03:29:52.902188" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:29:53.104439" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:29:53.506899" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:29:53.509213" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:29:52.898217" elapsed="0.614599">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:52.895675" elapsed="0.617331">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:53.513439" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:53.513082" elapsed="0.000465"/>
</branch>
<status status="FAIL" start="2026-04-17T03:29:52.895653" elapsed="0.617929">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:53.514279" elapsed="0.000043"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:53.514511" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:53.514452" elapsed="0.000123"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:53.514421" elapsed="0.000183"/>
</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-04-17T03:29:53.514823" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:29:53.514918" elapsed="0.000045"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:29:52.890102" elapsed="0.625012">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:53.515224" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:29:52.703332" elapsed="0.812029">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:53.516053" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:53.515589" elapsed="0.000599"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:53.515552" elapsed="0.000775"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:53.516399" elapsed="0.000030"/>
</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="FAIL" start="2026-04-17T03:29:52.697156" elapsed="0.819435">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Configures BGP peer module with initiate-connection set to false.</doc>
<status status="FAIL" start="2026-04-17T03:29:52.614981" elapsed="0.901920">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:29:53.523224" elapsed="0.000344"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:29:53.522825" elapsed="0.000831"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:53.525038" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:53.524856" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:53.524824" elapsed="0.000305"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:53.531328" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:53.531208" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:53.531187" elapsed="0.000218"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:53.532649" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:29:53.532195" elapsed="0.000487"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:29:53.533233" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:29:53.532875" elapsed="0.000387"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:29:53.533313" elapsed="0.000045"/>
</return>
<msg time="2026-04-17T03:29:53.533498" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:29:53.531682" elapsed="0.001843"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:53.539972" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:53.539784" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:53.539762" elapsed="0.000293"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:53.541646" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:53.541517" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:53.541496" elapsed="0.000231"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:53.542316" level="INFO">${karaf_connection_index} = 17</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:29:53.541918" elapsed="0.000431"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:53.542822" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:29:53.542558" elapsed="0.000296"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:29:53.543861" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:29:53.543519" elapsed="0.001186">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:29:53.544949" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:29:53.545004" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:53.543078" elapsed="0.001953"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:29:53.545985" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:29:53.545681" elapsed="0.001070">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:29:53.546980" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:29:53.547034" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:53.545257" elapsed="0.001882"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:29:53.548589" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Start_Bgp_Peer"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:29:53.547537" elapsed="0.001127">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Start_Bgp_Peer"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:53.547247" elapsed="0.001502">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Start_Bgp_Peer"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:29:53.547216" elapsed="0.001574">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Start_Bgp_Peer"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:53.549012" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:53.549287" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:53.549116" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:53.549095" elapsed="0.000277"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:29:53.549413" elapsed="0.000020"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:29:53.552693" elapsed="0.000202"/>
</kw>
<msg time="2026-04-17T03:29:53.553005" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:53.551210" elapsed="0.001974"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:53.553568" elapsed="0.000098"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:53.554058" elapsed="0.000107"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:29:53.550458" elapsed="0.003873"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:29:53.549781" elapsed="0.004646"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:29:53.540972" elapsed="0.013584">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Start_Bgp_Peer"</status>
</kw>
<msg time="2026-04-17T03:29:53.554712" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:29:53.554777" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Start_Bgp_Peer"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:53.540243" elapsed="0.014569"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:29:53.555110" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:53.554948" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:53.554898" elapsed="0.000312"/>
</if>
<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-04-17T03:29:53.556331" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:53.556204" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:53.556182" elapsed="0.000227"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:53.556767" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:29:53.556892" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:29:53.556607" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:53.557466" level="INFO">{1: 17}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:53.557138" elapsed="0.000381"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:53.558029" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:53.557712" elapsed="0.000370"/>
</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-04-17T03:29:53.558741" elapsed="0.000323"/>
</kw>
<msg time="2026-04-17T03:29:53.559179" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:29:53.559231" level="INFO">${old_connection_index} = 17</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:53.558281" elapsed="0.000975"/>
</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-04-17T03:29:53.560396" elapsed="0.000221"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:29:53.561865" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:29:53.561443" elapsed="0.001354">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:53.560896" elapsed="0.002004"/>
</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-04-17T03:29:53.563562" elapsed="0.000283"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:53.563093" elapsed="0.000961"/>
</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-04-17T03:29:53.559611" elapsed="0.004491"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:53.559344" elapsed="0.004808"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:53.559322" elapsed="0.004857"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:53.565098" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:29:53.564763" elapsed="0.000363"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:29:53.565177" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:29:53.565339" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:29:53.564411" elapsed="0.000953"/>
</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-04-17T03:29:53.565519" elapsed="0.000447"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:53.566474" level="INFO">index=18
host=10.30.170.120
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-04-17T03:29:53.566579" level="INFO">${karaf_connection_object} = index=18
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:29:53.566143" elapsed="0.000463"/>
</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-04-17T03:29:53.566759" elapsed="0.002364"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:29:53.569566" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:29:53.571001" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:29:53.569294" elapsed="0.002138">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:29:53.588366" elapsed="0.000419"/>
</kw>
<msg time="2026-04-17T03:29:53.588894" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:53.586709" elapsed="0.002411"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:53.589479" elapsed="0.000026"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:53.589655" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:29:53.572539" elapsed="0.017213"/>
</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-04-17T03:29:53.571767" elapsed="0.018040"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:29:53.555748" elapsed="0.034160">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:53.590459" elapsed="0.000035"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:29:53.590554" 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="FAIL" start="2026-04-17T03:29:53.539392" elapsed="0.051293">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:29:53.590817" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:29:53.590866" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:53.533989" elapsed="0.056903"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:53.591413" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:53.591093" elapsed="0.000384"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:53.591066" elapsed="0.000438"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:29:53.533799" elapsed="0.057732"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:29:53.533592" elapsed="0.057976"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:29:53.530783" elapsed="0.060851"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:29:53.524470" elapsed="0.067226"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:53.523848" elapsed="0.067900"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:29:53.518814" elapsed="0.072990"/>
</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-04-17T03:29:53.594038" level="INFO">${command} = python3 play.py --amount 0 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --peerport=1790 --debug --l3vpn_mcast --wfr 1 &amp;&gt; play.py.out</msg>
<var>${command}</var>
<arg>python3 play.py ${arguments} &amp;&gt; ${BGPSpeaker__OUTPUT_LOG}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:53.593681" elapsed="0.000387"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:53.594475" level="INFO">python3 play.py --amount 0 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --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-04-17T03:29:53.594227" elapsed="0.000295"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:29:53.599372" level="INFO">python3 play.py --amount 0 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --peerport=1790 --debug --l3vpn_mcast --wfr 1 &amp;&gt; play.py.out</msg>
<msg time="2026-04-17T03:29:53.599493" level="INFO">${output} =  python3 play.py --amount 0 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --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-04-17T03:29:53.594675" elapsed="0.004848"/>
</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-04-17T03:29:53.593233" elapsed="0.006363"/>
</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-04-17T03:29:59.602502" 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-04-17T03:29:53.601770" elapsed="6.001814">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-04-17T03:29:59.604053" elapsed="0.000049"/>
</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-04-17T03:29:53.601469" elapsed="6.002816">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-04-17T03:29:53.600863" elapsed="6.003619"/>
</kw>
<msg time="2026-04-17T03:29:59.604650" 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-04-17T03:29:53.600321" elapsed="6.004365"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-04-17T03:29:59.604962" elapsed="0.000048"/>
</return>
<status status="PASS" start="2026-04-17T03:29:59.604811" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:59.604775" elapsed="0.000321"/>
</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-04-17T03:29:59.605657" elapsed="0.000042"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was seen but it was not expected yet</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:59.605916" elapsed="0.000494"/>
</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-04-17T03:29:53.599895" elapsed="6.006606"/>
</kw>
<doc>Starts bgp peer and verifies that the peer runs.</doc>
<status status="PASS" start="2026-04-17T03:29:53.592856" elapsed="6.013716"/>
</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-04-17T03:29:53.592393" elapsed="6.014241"/>
</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-04-17T03:29:53.517362" elapsed="6.089442"/>
</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-04-17T03:29:59.611918" elapsed="0.000421"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:29:59.611362" elapsed="0.001066"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:59.613993" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:59.613784" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:59.613756" elapsed="0.000344"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:59.621319" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:59.621136" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:59.621106" elapsed="0.000324"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:59.623091" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:29:59.622459" elapsed="0.000671"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:29:59.623763" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:29:59.623357" elapsed="0.000442"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:29:59.623856" elapsed="0.000048"/>
</return>
<msg time="2026-04-17T03:29:59.624105" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:29:59.621888" elapsed="0.002255"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:29:59.631538" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:59.631403" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:59.631378" 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-04-17T03:29:59.633148" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:59.633029" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:59.633009" elapsed="0.000211"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:59.633880" level="INFO">${karaf_connection_index} = 18</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:29:59.633439" elapsed="0.000473"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:59.634412" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:29:59.634132" elapsed="0.000316"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:29:59.635479" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:29:59.635142" elapsed="0.001161">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:29:59.636563" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:29:59.636628" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:59.634683" elapsed="0.001978"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:29:59.637904" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:29:59.637464" elapsed="0.001409">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:29:59.639152" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:29:59.639215" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:59.636920" elapsed="0.002328"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:29:59.640417" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Odl_To_Play_l3vpn_mcast"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:29:59.639645" elapsed="0.000860">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Odl_To_Play_l3vpn_mcast"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:59.639364" elapsed="0.001234">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Odl_To_Play_l3vpn_mcast"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:29:59.639332" elapsed="0.001316">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Odl_To_Play_l3vpn_mcast"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:59.640886" elapsed="0.000033"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:59.641234" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:59.641031" elapsed="0.000365"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:59.641006" elapsed="0.000425"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:29:59.641482" 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-04-17T03:29:59.644746" elapsed="0.000161"/>
</kw>
<msg time="2026-04-17T03:29:59.645010" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:59.643498" elapsed="0.001654"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:59.645441" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:59.645814" 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-04-17T03:29:59.642658" elapsed="0.003425"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:29:59.641985" elapsed="0.004164"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:29:59.632612" elapsed="0.013625">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Odl_To_Play_l3vpn_mcast"</status>
</kw>
<msg time="2026-04-17T03:29:59.646349" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:29:59.646394" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Odl_To_Play_l3vpn_mcast"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:59.631817" elapsed="0.014602"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:29:59.646617" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:59.646502" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:59.646481" elapsed="0.000204"/>
</if>
<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-04-17T03:29:59.647850" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:29:59.647737" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:59.647718" elapsed="0.000233"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:59.648265" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:29:59.648375" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:29:59.648126" elapsed="0.000277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:59.648843" level="INFO">{1: 18}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:59.648560" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:59.649307" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:59.649063" elapsed="0.000288"/>
</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-04-17T03:29:59.650045" elapsed="0.000283"/>
</kw>
<msg time="2026-04-17T03:29:59.650429" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:29:59.650475" level="INFO">${old_connection_index} = 18</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:59.649514" elapsed="0.000984"/>
</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-04-17T03:29:59.651380" elapsed="0.000242"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:29:59.653117" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:29:59.652545" elapsed="0.002081">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:59.651850" elapsed="0.002917"/>
</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-04-17T03:29:59.655803" elapsed="0.000458"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:59.655049" elapsed="0.001349"/>
</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-04-17T03:29:59.650801" elapsed="0.005672"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:59.650573" elapsed="0.005993"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:59.650555" elapsed="0.006058"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:59.658161" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:29:59.657560" elapsed="0.000640"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:29:59.658271" elapsed="0.000054"/>
</return>
<msg time="2026-04-17T03:29:59.658547" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:29:59.656980" elapsed="0.001605"/>
</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-04-17T03:29:59.658830" elapsed="0.000690"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:29:59.659945" level="INFO">index=19
host=10.30.170.120
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-04-17T03:29:59.660120" level="INFO">${karaf_connection_object} = index=19
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:29:59.659763" elapsed="0.000408"/>
</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-04-17T03:29:59.660413" elapsed="0.004728"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:29:59.665689" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:29:59.666961" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:29:59.665363" elapsed="0.002097">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:29:59.684897" elapsed="0.000547"/>
</kw>
<msg time="2026-04-17T03:29:59.685624" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:59.682679" elapsed="0.003159"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:59.686100" elapsed="0.000034"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:59.686295" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:29:59.668465" elapsed="0.017920"/>
</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-04-17T03:29:59.667806" elapsed="0.018628"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:29:59.647392" elapsed="0.039135">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:59.687015" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:29:59.687097" elapsed="0.000024"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:29:59.630892" elapsed="0.056328">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:29:59.687373" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:29:59.687419" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:59.624705" elapsed="0.062744"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:59.687848" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:59.687568" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:59.687541" elapsed="0.000637"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:29:59.624494" elapsed="0.063732"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:29:59.624226" elapsed="0.064049"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:29:59.620476" elapsed="0.067884"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:29:59.613352" elapsed="0.075091"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:29:59.612676" elapsed="0.075835"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:29:59.608052" elapsed="0.080538"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:59.690046" 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-04-17T03:29:59.690350" 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-04-17T03:29:59.689725" elapsed="0.000661"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-17T03:29:59.690947" 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-04-17T03:29:59.690618" elapsed="0.000369"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:59.691464" 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-04-17T03:29:59.691653" 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-04-17T03:29:59.691208" elapsed="0.000482"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-17T03:29:59.692439" 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-04-17T03:29:59.691910" elapsed="0.000566"/>
</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-04-17T03:29:59.692952" elapsed="0.003229"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:59.692591" elapsed="0.003640"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:59.692558" elapsed="0.003704"/>
</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-04-17T03:29:59.738142" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:59.737494" elapsed="0.000699"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:59.739327" 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-04-17T03:29:59.738960" elapsed="0.000473">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-04-17T03:29:59.739564" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:59.738443" elapsed="0.001154"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:59.740446" 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-04-17T03:29:59.739837" elapsed="0.000650"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:59.740957" 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-04-17T03:29:59.741191" 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-04-17T03:29:59.740726" elapsed="0.000502"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:59.741860" 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-04-17T03:29:59.741449" elapsed="0.000502"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:59.743479" level="INFO">mapping: {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:59.743101" elapsed="0.000435"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:29:59.744122" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:29:59.743739" elapsed="0.000411"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:59.744981" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:29:59.744614" elapsed="0.000402"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:59.746340" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:29:59.745782" elapsed="0.000587"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:59.746425" elapsed="0.000054"/>
</return>
<msg time="2026-04-17T03:29:59.746614" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:29:59.745266" 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-04-17T03:29:59.746798" elapsed="0.000306"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:29:59.744446" elapsed="0.002703"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:29:59.747748" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:29:59.747414" elapsed="0.000360"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:29:59.749198" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:29:59.748678" elapsed="0.000549"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:29:59.749283" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:29:59.749451" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:29:59.748066" elapsed="0.001411"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:29:59.749697" elapsed="0.000266"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:29:59.747275" elapsed="0.002731"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:29:59.744210" elapsed="0.005834"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:29:59.750089" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:29:59.750255" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:29:59.742570" elapsed="0.007716"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:59.742064" elapsed="0.008256"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:59.750513" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:59.750351" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:59.742029" elapsed="0.008564"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:59.751444" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:29:59.750746" elapsed="0.000729"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:29:59.751524" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:29:59.736456" elapsed="0.015198"/>
</kw>
<msg time="2026-04-17T03:29:59.751717" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:59.722302" elapsed="0.029470"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:29:59.764597" elapsed="0.000064"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:29:59.777094" 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/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-04-17T03:29:59.790515" elapsed="0.000059"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:59.790829" 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-04-17T03:29:59.791049" 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-04-17T03:29:59.791489" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:59.791332" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:59.791315" 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-04-17T03:29:59.791722" 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-04-17T03:29:59.791897" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:59.792088" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:29:59.791278" elapsed="0.000865"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:29:59.791144" elapsed="0.001027"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:59.792322" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:59.792402" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:29:59.792564" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:29:59.716541" elapsed="0.076052"/>
</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-04-17T03:29:59.819987" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:59.819409" elapsed="0.000620"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:59.821189" 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-04-17T03:29:59.820860" elapsed="0.000431">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-04-17T03:29:59.821406" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:59.820259" elapsed="0.001173"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:59.822078" 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-04-17T03:29:59.821654" elapsed="0.000453"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:29:59.822418" 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-04-17T03:29:59.822602" 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-04-17T03:29:59.822273" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:59.823069" 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-04-17T03:29:59.822792" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-17T03:29:59.823637" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:59.823277" elapsed="0.000421"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:59.824213" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:59.823883" elapsed="0.000357"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:59.823725" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:59.823254" elapsed="0.001046"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:29:59.824969" 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-04-17T03:29:59.824454" elapsed="0.000551"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:29:59.825073" 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_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-04-17T03:29:59.818634" elapsed="0.006619"/>
</kw>
<msg time="2026-04-17T03:29:59.825331" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:29:59.804625" elapsed="0.020764"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:29:59.839526" elapsed="0.000040"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/${file_name} exists. If 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-04-17T03:29:59.853212" elapsed="0.000066"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:29:59.867989" elapsed="0.000057"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:59.868352" 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-04-17T03:29:59.868614" 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-04-17T03:29:59.869135" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:59.868912" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:29:59.868892" 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-04-17T03:29:59.869438" 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-04-17T03:29:59.869721" 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-04-17T03:29:59.869980" elapsed="0.000030"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:29:59.868851" elapsed="0.001207"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:29:59.868723" elapsed="0.001459"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:59.870402" elapsed="0.000029"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:29:59.870509" elapsed="0.000024"/>
</return>
<msg time="2026-04-17T03:29:59.870734" 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-04-17T03:29:59.803632" elapsed="0.067144"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:29:59.872749" 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-04-17T03:29:59.872339" elapsed="0.000512">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-04-17T03:29:59.873003" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:29:59.871784" elapsed="0.001255"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:29:59.873507" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:29:59.873136" elapsed="0.000494"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:29:59.874392" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:29:59.873974" elapsed="0.000457"/>
</kw>
<status status="PASS" start="2026-04-17T03:29:59.873684" elapsed="0.000800"/>
</branch>
<status status="PASS" start="2026-04-17T03:29:59.873110" elapsed="0.001407"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:29:59.877915" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:29:59.874745" elapsed="0.003229"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:29:59.878051" elapsed="0.000049"/>
</return>
<msg time="2026-04-17T03:29:59.878281" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:29:59.871296" elapsed="0.007020"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:59.880571" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:29:59.880195" elapsed="0.000447"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:59.881243" 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-04-17T03:29:59.880869" elapsed="0.000458"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:59.881908" 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-04-17T03:29:59.881549" elapsed="0.000440"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:59.882556" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:29:59.882201" elapsed="0.000415"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:29:59.883835" 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-04-17T03:29:59.883556" elapsed="0.000316"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:29:59.884350" 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-04-17T03:29:59.884109" elapsed="0.000356"/>
</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-04-17T03:29:59.884671" elapsed="0.000224"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:29:59.885328" 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-04-17T03:29:59.885074" elapsed="0.000300"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:29:59.885417" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:29:59.885674" 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-04-17T03:29:59.882994" elapsed="0.002718"/>
</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-04-17T03:29:59.892694" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4</msg>
<msg time="2026-04-17T03:30:00.094364" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4</msg>
<msg time="2026-04-17T03:30:00.497287" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4</msg>
<msg time="2026-04-17T03:30:00.500219" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:29:59.889151" elapsed="0.617084">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:59.885819" elapsed="0.620597">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:30:00.506835" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:00.506494" elapsed="0.000467"/>
</branch>
<status status="FAIL" start="2026-04-17T03:29:59.885792" elapsed="0.621207">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:30:00.507676" elapsed="0.000042"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:00.507888" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:00.507832" elapsed="0.000142"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:00.507806" elapsed="0.000199"/>
</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-04-17T03:30:00.508238" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:30:00.508335" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>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="FAIL" start="2026-04-17T03:29:59.878811" elapsed="0.629683">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:00.508703" elapsed="0.000024"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>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="FAIL" start="2026-04-17T03:29:59.702757" elapsed="0.806094">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:00.509444" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:00.509114" elapsed="0.000470"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:00.509083" elapsed="0.000558"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:00.509709" 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="FAIL" start="2026-04-17T03:29:59.696617" elapsed="0.813364">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:30:00.510310" elapsed="0.000048"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<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="NOT RUN" start="2026-04-17T03:30:00.510711" elapsed="0.000037"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:00.511033" elapsed="0.000038"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations">
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:00.511316" elapsed="0.000032"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:30:00.511579" elapsed="0.000030"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<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="NOT RUN" start="2026-04-17T03:30:00.511997" elapsed="0.000046"/>
</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-04-17T03:30:00.562348" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:00.561730" elapsed="0.000655"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:00.563241" 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-04-17T03:30:00.562961" elapsed="0.000355">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-04-17T03:30:00.563412" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:00.562583" elapsed="0.000854"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:00.564013" 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-04-17T03:30:00.563605" elapsed="0.000436"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:00.564371" 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-04-17T03:30:00.564546" 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-04-17T03:30:00.564207" elapsed="0.000365"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:00.565089" 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-04-17T03:30:00.564735" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:00.566302" level="INFO">mapping: {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:00.566022" elapsed="0.000333"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:00.566801" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:30:00.566523" elapsed="0.000305"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:00.567779" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:00.567221" elapsed="0.000584"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:00.569145" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:00.568622" elapsed="0.000568"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:00.569318" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:30:00.569587" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:00.568034" elapsed="0.001580"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:00.569797" elapsed="0.000552"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:30:00.567080" elapsed="0.003313"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:00.571316" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:00.570678" elapsed="0.000673"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:00.572809" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:00.572130" elapsed="0.000734"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:00.573082" elapsed="0.000047"/>
</return>
<msg time="2026-04-17T03:30:00.573386" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:00.571580" elapsed="0.001841"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:00.573645" elapsed="0.000665"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:30:00.570538" elapsed="0.003819"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:30:00.566884" elapsed="0.007509"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:30:00.574439" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:30:00.574606" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:30:00.565609" elapsed="0.009023"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:00.565224" elapsed="0.009441"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:00.574859" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:00.574693" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:00.565197" elapsed="0.009770"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:00.575842" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:30:00.575166" elapsed="0.000707"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:30:00.575924" elapsed="0.000057"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:30:00.560878" elapsed="0.015237"/>
</kw>
<msg time="2026-04-17T03:30:00.576197" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:00.547244" elapsed="0.029045"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:30:00.594563" elapsed="0.000089"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:30:00.611761" elapsed="0.000070"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:30:00.628205" elapsed="0.000065"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:00.628556" 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-04-17T03:30:00.628750" 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-04-17T03:30:00.629251" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:00.629089" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:00.629070" 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-04-17T03:30:00.629505" 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-04-17T03:30:00.629678" 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-04-17T03:30:00.629901" elapsed="0.000039"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:30:00.629028" elapsed="0.000950"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:30:00.628855" elapsed="0.001153"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:00.630159" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:00.630259" elapsed="0.000022"/>
</return>
<msg time="2026-04-17T03:30:00.630449" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:30:00.542642" elapsed="0.087838"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:00.631823" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:30:00.631500" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:30:00.636775" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4</msg>
<msg time="2026-04-17T03:30:00.838438" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4</msg>
<msg time="2026-04-17T03:30:01.241274" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4</msg>
<msg time="2026-04-17T03:30:01.244279" level="INFO">${response} = None</msg>
<msg time="2026-04-17T03:30:01.244432" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:00.634083" elapsed="0.615393">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:00.631962" elapsed="0.617712">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:01.250236" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:01.249764" elapsed="0.000582"/>
</branch>
<status status="FAIL" start="2026-04-17T03:30:00.631943" elapsed="0.618438">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:01.256918" 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-04-17T03:30:01.253086" elapsed="0.003901">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:01.252560" elapsed="0.004534">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:30:01.252516" elapsed="0.004635">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-04-17T03:30:01.260839" 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-04-17T03:30:01.257657" elapsed="0.003221">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:01.257279" elapsed="0.003692">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:30:01.257250" elapsed="0.003759">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:01.261751" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:30:01.261263" elapsed="0.000516"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:01.262174" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:01.261854" elapsed="0.000384"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:01.262825" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:01.262501" elapsed="0.000352"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:01.262271" elapsed="0.000619"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:01.261835" elapsed="0.001077"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:01.263550" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:30:01.263099" elapsed="0.000479"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:01.263893" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:01.263648" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:01.264616" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:01.264185" elapsed="0.000468"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:01.263994" elapsed="0.000709"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:01.263631" elapsed="0.001103"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:01.264908" elapsed="0.000422"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-17T03:30:01.265810" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:30:01.265502" elapsed="0.000335"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-04-17T03:30:01.268711" 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-04-17T03:30:01.266115" elapsed="0.002639">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-04-17T03:30:01.251556" elapsed="0.017367">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-04-17T03:30:01.269011" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:30:01.271514" level="INFO">${response_text} = None</msg>
<msg time="2026-04-17T03:30:01.271544" 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-04-17T03:30:00.630809" elapsed="0.640763">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-04-17T03:30:01.271640" elapsed="0.000027"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="FAIL" start="2026-04-17T03:30:00.514332" elapsed="0.757487">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:00.513161" elapsed="0.758724"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-04-17T03:30:00.512444" elapsed="0.759520"/>
</kw>
<arg>l3vpn_mcast</arg>
<arg>${L3VPN_MCAST_DIR}</arg>
<status status="FAIL" start="2026-04-17T03:29:59.689108" elapsed="1.582933">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:29:59.607401" elapsed="1.664835">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:30:01.275438" elapsed="0.000247"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:30:01.275162" 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-04-17T03:30:01.276824" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:01.276686" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:01.276664" 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-04-17T03:30:01.281917" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:01.281798" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:01.281779" elapsed="0.000261"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:01.283139" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:30:01.282696" elapsed="0.000471"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:30:01.283642" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:30:01.283338" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:30:01.283711" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:30:01.283874" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:30:01.282296" elapsed="0.001602"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:01.289677" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:01.289555" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:01.289533" elapsed="0.000218"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:01.291183" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:01.291004" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:01.290985" elapsed="0.000270"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:01.291734" level="INFO">${karaf_connection_index} = 19</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:30:01.291411" elapsed="0.000351"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:01.292170" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:30:01.291945" elapsed="0.000250"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:30:01.292995" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:30:01.292707" elapsed="0.000958">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:30:01.293861" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:30:01.293907" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:01.292363" elapsed="0.001584"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:30:01.294779" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:30:01.294525" elapsed="0.000932">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:30:01.295643" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:30:01.295689" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:01.294142" elapsed="0.001570"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:30:01.296671" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Play_To_Odl_l3vpn_mcast"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:30:01.296056" elapsed="0.000677">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Play_To_Odl_l3vpn_mcast"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:01.295792" elapsed="0.001010">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Play_To_Odl_l3vpn_mcast"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:30:01.295771" elapsed="0.001066">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Play_To_Odl_l3vpn_mcast"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:01.297023" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:01.297252" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:01.297110" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:01.297094" elapsed="0.000232"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:30:01.297362" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:30:01.299979" elapsed="0.000152"/>
</kw>
<msg time="2026-04-17T03:30:01.300200" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:01.298907" 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-04-17T03:30:01.300607" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:01.300963" 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-04-17T03:30:01.298266" 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-04-17T03:30:01.297672" 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="FAIL" start="2026-04-17T03:30:01.290661" elapsed="0.010646">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Play_To_Odl_l3vpn_mcast"</status>
</kw>
<msg time="2026-04-17T03:30:01.301415" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:30:01.301458" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Play_To_Odl_l3vpn_mcast"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:01.289940" elapsed="0.011542"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:30:01.301673" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:01.301563" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:01.301543" elapsed="0.000197"/>
</if>
<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-04-17T03:30:01.303160" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:01.303048" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:01.303030" elapsed="0.000199"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:01.303532" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:30:01.303641" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:30:01.303393" elapsed="0.000275"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:01.304117" level="INFO">{1: 19}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:01.303823" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:01.304560" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:01.304316" elapsed="0.000287"/>
</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-04-17T03:30:01.305177" elapsed="0.000281"/>
</kw>
<msg time="2026-04-17T03:30:01.305559" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:30:01.305605" level="INFO">${old_connection_index} = 19</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:01.304768" elapsed="0.000860"/>
</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-04-17T03:30:01.306638" elapsed="0.000195"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:30:01.307918" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:30:01.307503" elapsed="0.001336">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:01.307025" elapsed="0.001930"/>
</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-04-17T03:30:01.309600" elapsed="0.000278"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:01.309130" elapsed="0.000889"/>
</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-04-17T03:30:01.306116" elapsed="0.003955"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:01.305702" elapsed="0.004419"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:01.305684" elapsed="0.004463"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:01.312081" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:30:01.311297" elapsed="0.000847"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:30:01.312261" elapsed="0.000077"/>
</return>
<msg time="2026-04-17T03:30:01.312644" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:30:01.310467" elapsed="0.002235"/>
</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-04-17T03:30:01.313116" elapsed="0.001164"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:01.314601" level="INFO">index=20
host=10.30.170.120
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-04-17T03:30:01.314703" level="INFO">${karaf_connection_object} = index=20
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:30:01.314481" elapsed="0.000248"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:01.314881" elapsed="0.002409"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:30:01.317724" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:30:01.319090" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:30:01.317458" elapsed="0.002242">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:30:01.333596" elapsed="0.000743"/>
</kw>
<msg time="2026-04-17T03:30:01.334441" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:01.332226" elapsed="0.002375"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:01.334828" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:01.335014" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:30:01.320618" elapsed="0.014481"/>
</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-04-17T03:30:01.320047" elapsed="0.015099"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:30:01.302628" elapsed="0.032608">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:01.335626" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:30:01.335705" 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="FAIL" start="2026-04-17T03:30:01.289174" elapsed="0.046642">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:30:01.336165" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:30:01.336215" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:01.284311" elapsed="0.051928"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:01.336589" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:01.336324" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:01.336303" elapsed="0.000365"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:30:01.284163" elapsed="0.052529"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:30:01.283977" elapsed="0.052748"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:30:01.281404" elapsed="0.055379"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:30:01.276379" elapsed="0.060459"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:01.275898" elapsed="0.060987"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:30:01.272954" elapsed="0.064000"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:01.338202" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:01.337624" elapsed="0.000607"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:01.338850" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:01.338400" elapsed="0.000477"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:01.339445" 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-04-17T03:30:01.339062" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:01.339844" 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-04-17T03:30:01.340277" 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-04-17T03:30:01.339634" elapsed="0.000670"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:01.340652" 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-04-17T03:30:01.340785" 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-04-17T03:30:01.340461" elapsed="0.000349"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-04-17T03:30:01.340983" elapsed="0.002877"/>
</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-04-17T03:30:01.344141" elapsed="0.001751"/>
</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-04-17T03:30:01.411237" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:01.410764" elapsed="0.000508"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:01.412174" 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-04-17T03:30:01.411878" elapsed="0.000375">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-04-17T03:30:01.412351" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:01.411474" elapsed="0.000904"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:01.412983" 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-04-17T03:30:01.412548" elapsed="0.000465"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:01.413378" 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-04-17T03:30:01.413554" 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-04-17T03:30:01.413199" elapsed="0.000381"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:01.414037" 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-04-17T03:30:01.413745" elapsed="0.000342"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:01.415220" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:01.414883" elapsed="0.000383"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:01.415742" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:30:01.415455" elapsed="0.000313"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:01.416645" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:01.416190" elapsed="0.000482"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:01.417912" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:01.417351" elapsed="0.000712"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:01.418149" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:30:01.418458" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:01.416871" elapsed="0.001615"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:01.418649" elapsed="0.000462"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:30:01.416027" elapsed="0.003135"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:01.420062" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:01.419504" elapsed="0.000592"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:01.422134" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:01.421289" elapsed="0.000957"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:01.422331" elapsed="0.000047"/>
</return>
<msg time="2026-04-17T03:30:01.422683" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:01.420592" elapsed="0.002117"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:01.422887" elapsed="0.000514"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:30:01.419315" elapsed="0.004142"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:30:01.415825" elapsed="0.007752"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:30:01.423638" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:30:01.423848" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:30:01.414548" elapsed="0.009334"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:01.414170" elapsed="0.009777"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:01.424152" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:01.423986" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:01.414144" elapsed="0.010085"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:01.425133" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:30:01.424380" elapsed="0.000783"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:30:01.425213" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:30:01.409810" elapsed="0.015531"/>
</kw>
<msg time="2026-04-17T03:30:01.425402" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:01.393370" elapsed="0.032086"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:30:01.440328" elapsed="0.000062"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:30:01.454376" elapsed="0.000069"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:30:01.468055" elapsed="0.000060"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:01.468374" 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-04-17T03:30:01.468750" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:01.469229" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:01.469068" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:01.469050" 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-04-17T03:30:01.469467" 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-04-17T03:30:01.469639" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:01.469808" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:30:01.469006" elapsed="0.000856"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:30:01.468838" elapsed="0.001150"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:01.470182" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:01.470265" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:30:01.470434" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:30:01.387742" elapsed="0.082722"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:01.472006" 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-04-17T03:30:01.471672" elapsed="0.000414">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-04-17T03:30:01.472182" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:01.471251" elapsed="0.000956"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:01.472569" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:01.472278" elapsed="0.000350"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:01.473226" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:01.472851" elapsed="0.000408"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:01.472653" elapsed="0.000652"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:01.472260" elapsed="0.001072"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:01.476331" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:30:01.473539" elapsed="0.002820"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:30:01.476418" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:30:01.476622" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:30:01.470846" elapsed="0.005816"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:01.478192" 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-04-17T03:30:01.477765" elapsed="0.000548">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-04-17T03:30:01.478467" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:01.477412" elapsed="0.001093"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:30:01.478837" elapsed="0.000049"/>
</return>
<status status="PASS" start="2026-04-17T03:30:01.478618" elapsed="0.000355"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:01.478589" elapsed="0.000424"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:01.479268" elapsed="0.000045"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:01.479607" elapsed="0.000034"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:30:01.479711" elapsed="0.000024"/>
</return>
<msg time="2026-04-17T03:30:01.483033" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:30:01.477048" elapsed="0.006040"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:01.486000" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:01.485474" elapsed="0.000645"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:01.486844" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:01.486385" elapsed="0.000531"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:30:01.493508" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:01.695192" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:02.097574" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:02.099698" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:30:01.490283" elapsed="0.612814">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:01.487046" elapsed="0.616241">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:02.103731" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:02.103376" elapsed="0.000461"/>
</branch>
<status status="FAIL" start="2026-04-17T03:30:01.487015" elapsed="0.616857">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:02.104505" elapsed="0.000040"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:02.104707" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:02.104649" elapsed="0.000121"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:02.104623" 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-04-17T03:30:02.105039" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:30:02.105142" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:30:01.483969" elapsed="0.621331">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:02.105410" 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-04-17T03:30:01.358005" elapsed="0.747545">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:02.106035" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:02.105748" elapsed="0.000391"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:02.105722" elapsed="0.000451"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:02.106241" elapsed="0.000021"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-04-17T03:30:01.352394" elapsed="0.753994">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:04.169225" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:04.168751" elapsed="0.000510"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:04.170233" 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-04-17T03:30:04.169913" elapsed="0.000402">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-04-17T03:30:04.170415" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:04.169465" elapsed="0.000976"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:04.171087" 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-04-17T03:30:04.170616" elapsed="0.000500"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:04.171462" 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-04-17T03:30:04.171647" 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-04-17T03:30:04.171298" elapsed="0.000378"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:04.172181" 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-04-17T03:30:04.171860" 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-04-17T03:30:04.173482" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:04.173159" elapsed="0.000373"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:04.174029" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:30:04.173700" elapsed="0.000357"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:04.174889" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:04.174442" elapsed="0.000474"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:04.176269" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:04.175628" elapsed="0.000749"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:04.176461" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:30:04.176812" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:04.175146" elapsed="0.001702"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:04.177038" elapsed="0.000421"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:30:04.174298" elapsed="0.003204"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:04.178488" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:04.177822" elapsed="0.000695"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:04.180362" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:04.179667" elapsed="0.000802"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:04.180556" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:30:04.180868" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:04.178716" elapsed="0.002179"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:04.181071" elapsed="0.000398"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:30:04.177683" elapsed="0.003833"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:30:04.174115" elapsed="0.007437"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:30:04.181596" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:30:04.181761" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:30:04.172762" elapsed="0.009025"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:04.172341" elapsed="0.009479"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:04.182019" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:04.181848" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:04.172314" elapsed="0.009785"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:04.182923" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:30:04.182256" elapsed="0.000754"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:30:04.183061" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:30:04.167831" elapsed="0.015374"/>
</kw>
<msg time="2026-04-17T03:30:04.183283" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:04.154003" elapsed="0.029347"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:30:04.197400" 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/rib.vanadium/${file_name} exists. If 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-04-17T03:30:04.210205" 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/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-04-17T03:30:04.223577" elapsed="0.000070"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:04.223977" 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-04-17T03:30:04.224219" 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-04-17T03:30:04.224836" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:04.224639" elapsed="0.000258"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:04.224619" 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-04-17T03:30:04.225110" 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-04-17T03:30:04.225282" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:04.225451" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:30:04.224575" elapsed="0.000931"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:30:04.224414" elapsed="0.001121"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:04.225706" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:04.225796" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:30:04.226002" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:30:04.149353" elapsed="0.076680"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:04.227625" 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-04-17T03:30:04.227320" elapsed="0.000399">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-04-17T03:30:04.227837" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:04.226869" 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-04-17T03:30:04.228240" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:04.227958" elapsed="0.000340"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:04.228963" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:04.228547" elapsed="0.000450"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:04.228324" elapsed="0.000717"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:04.227919" elapsed="0.001149"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:04.232071" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:30:04.229266" elapsed="0.002835"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:30:04.232158" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:30:04.232336" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:30:04.226428" elapsed="0.005933"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:04.233867" 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-04-17T03:30:04.233557" elapsed="0.000407">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-04-17T03:30:04.234063" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:04.233120" elapsed="0.000968"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:30:04.234308" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-17T03:30:04.234162" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:04.234141" elapsed="0.000275"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:04.234576" elapsed="0.000026"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:04.234941" elapsed="0.000033"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:30:04.235038" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:30:04.237064" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:30:04.232710" elapsed="0.004382"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:04.238680" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:04.238364" elapsed="0.000369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:04.239192" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:04.238922" elapsed="0.000316"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:30:04.244501" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:04.446051" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:04.848366" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:04.850492" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:30:04.241391" elapsed="0.613199">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:04.239306" elapsed="0.615490">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:04.855391" elapsed="0.000058"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:04.854888" elapsed="0.000649"/>
</branch>
<status status="FAIL" start="2026-04-17T03:30:04.239287" elapsed="0.616302">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:04.856508" elapsed="0.000052"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:04.856772" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:04.856698" elapsed="0.000161"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:04.856665" elapsed="0.000238"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:04.857233" elapsed="0.000043"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:30:04.857369" 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-04-17T03:30:04.237435" elapsed="0.620154">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:04.857830" elapsed="0.000032"/>
</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-04-17T03:30:04.123530" elapsed="0.734529">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:04.858600" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:04.858244" elapsed="0.000488"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:04.858213" elapsed="0.000560"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:04.858831" 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-04-17T03:30:04.116109" elapsed="0.742993">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:06.916570" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:06.916087" elapsed="0.000519"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:06.917527" 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-04-17T03:30:06.917254" elapsed="0.000356">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-04-17T03:30:06.917722" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:06.916823" elapsed="0.000937"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:06.918443" 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-04-17T03:30:06.917988" elapsed="0.000484"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:06.918788" 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-04-17T03:30:06.918976" 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-04-17T03:30:06.918639" elapsed="0.000365"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:06.919426" 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-04-17T03:30:06.919172" elapsed="0.000326"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:06.920665" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:06.920343" elapsed="0.000370"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:06.921179" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:30:06.920877" elapsed="0.000329"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:06.922015" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:06.921578" elapsed="0.000538"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:06.923388" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:06.922801" elapsed="0.000726"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:06.923611" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:30:06.923925" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:06.922332" elapsed="0.001638"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:06.924132" elapsed="0.000397"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:30:06.921438" elapsed="0.003133"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:06.925675" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:06.924852" elapsed="0.000851"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:06.927139" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:06.926532" elapsed="0.000713"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:06.927324" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:30:06.927685" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:06.925967" elapsed="0.001745"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:06.927871" elapsed="0.000397"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:30:06.924688" elapsed="0.003625"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:30:06.921261" elapsed="0.007089"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:30:06.928395" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:30:06.928557" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:30:06.919986" elapsed="0.008597"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:06.919590" elapsed="0.009026"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:06.928799" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:06.928643" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:06.919564" elapsed="0.009311"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:06.929668" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:30:06.929044" elapsed="0.000654"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:30:06.929746" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:30:06.915024" elapsed="0.014849"/>
</kw>
<msg time="2026-04-17T03:30:06.930020" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:06.901284" elapsed="0.028818"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:30:06.944478" elapsed="0.000074"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:30:06.960530" elapsed="0.000062"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:30:06.974405" elapsed="0.000049"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:06.974693" 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-04-17T03:30:06.974890" 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-04-17T03:30:06.975362" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:06.975205" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:06.975187" 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-04-17T03:30:06.975637" 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-04-17T03:30:06.975810" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:06.976042" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:30:06.975148" elapsed="0.000950"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:30:06.975015" elapsed="0.001111"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:06.976275" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:06.976374" elapsed="0.000027"/>
</return>
<msg time="2026-04-17T03:30:06.976583" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:30:06.896616" elapsed="0.080018"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:06.978297" 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-04-17T03:30:06.977917" elapsed="0.000462">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-04-17T03:30:06.978478" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:06.977464" elapsed="0.001043"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:06.978850" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:06.978578" elapsed="0.000330"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:06.979541" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:06.979163" elapsed="0.000407"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:06.978950" elapsed="0.000658"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:06.978560" elapsed="0.001069"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:06.983384" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:30:06.979811" elapsed="0.003616"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:30:06.983539" elapsed="0.000052"/>
</return>
<msg time="2026-04-17T03:30:06.983992" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:30:06.977025" elapsed="0.007006"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:06.986109" 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-04-17T03:30:06.985657" elapsed="0.000631">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-04-17T03:30:06.986438" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:06.985142" elapsed="0.001335"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:30:06.986803" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-04-17T03:30:06.986589" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:06.986562" elapsed="0.000393"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:06.987180" 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-04-17T03:30:06.987436" elapsed="0.000030"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:30:06.987563" elapsed="0.000023"/>
</return>
<msg time="2026-04-17T03:30:06.990393" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:30:06.984608" elapsed="0.005823"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:06.992763" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:06.992397" elapsed="0.000419"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:06.993322" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:06.993030" elapsed="0.000338"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:30:06.999346" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:07.201452" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:07.604280" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:07.606599" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:30:06.995727" elapsed="0.614367">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:06.993461" elapsed="0.616788">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:07.610632" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:07.610315" elapsed="0.000416"/>
</branch>
<status status="FAIL" start="2026-04-17T03:30:06.993431" elapsed="0.617333">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:07.611456" elapsed="0.000042"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:07.611776" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:07.611718" elapsed="0.000134"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:07.611658" elapsed="0.000256"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:07.612169" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:30:07.612272" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:30:06.990893" elapsed="0.621544">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:07.612547" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:30:06.874105" elapsed="0.738583">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:07.613134" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:07.612825" elapsed="0.000414"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:07.612799" elapsed="0.000809"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:07.613663" elapsed="0.000023"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-04-17T03:30:06.867880" elapsed="0.745935">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:30:07.614014" level="FAIL">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-17T03:30:01.346136" elapsed="6.268028">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:30:07.614450" elapsed="0.000032"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:30:07.614723" elapsed="0.000029"/>
</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="NOT RUN" start="2026-04-17T03:30:07.615020" elapsed="0.000032"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:30:07.615267" elapsed="0.000028"/>
</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-04-17T03:30:07.615635" elapsed="0.002749"/>
</kw>
<arg>l3vpn_mcast</arg>
<arg>${L3VPN_MCAST_DIR}</arg>
<status status="FAIL" start="2026-04-17T03:30:01.337219" elapsed="6.281255">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:01.272483" elapsed="6.346269">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:30:07.622212" elapsed="0.000257"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:30:07.621911" elapsed="0.000616"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:07.623641" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:07.623501" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:07.623476" elapsed="0.000264"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:07.628819" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:07.628705" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:07.628687" elapsed="0.000236"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:07.630036" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:30:07.629601" elapsed="0.000464"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:30:07.630544" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:30:07.630233" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:30:07.630615" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:30:07.630777" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:30:07.629204" elapsed="0.001598"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:07.636758" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:07.636615" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:07.636596" 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-04-17T03:30:07.638148" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:07.638016" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:07.637997" elapsed="0.000221"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:07.638692" level="INFO">${karaf_connection_index} = 20</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:30:07.638376" elapsed="0.000343"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:07.639170" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:30:07.638918" elapsed="0.000278"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:30:07.640125" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:30:07.639782" elapsed="0.001055">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:30:07.641062" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:30:07.641109" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:07.639362" elapsed="0.001771"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:30:07.642005" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:30:07.641697" elapsed="0.001038">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:30:07.642952" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:30:07.643002" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:07.641308" elapsed="0.001717"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:30:07.644155" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Odl_To_Play_l3vpn_mcast_ipv6"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:30:07.643436" elapsed="0.000785">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Odl_To_Play_l3vpn_mcast_ipv6"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:07.643106" elapsed="0.001187">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Odl_To_Play_l3vpn_mcast_ipv6"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:30:07.643085" elapsed="0.001245">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Odl_To_Play_l3vpn_mcast_ipv6"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:07.644534" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:07.644774" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:07.644627" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:07.644611" elapsed="0.000239"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:30:07.644883" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:30:07.647711" elapsed="0.000159"/>
</kw>
<msg time="2026-04-17T03:30:07.648080" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:07.646569" elapsed="0.001689"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:07.648557" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:07.648922" elapsed="0.000099"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:30:07.645826" elapsed="0.003316"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:30:07.645222" elapsed="0.003987"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:30:07.637651" elapsed="0.011647">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Odl_To_Play_l3vpn_mcast_ipv6"</status>
</kw>
<msg time="2026-04-17T03:30:07.649408" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:30:07.649451" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Odl_To_Play_l3vpn_mcast_ipv6"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:07.637027" elapsed="0.012448"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:30:07.649677" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:07.649556" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:07.649536" elapsed="0.000209"/>
</if>
<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-04-17T03:30:07.651131" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:07.650876" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:07.650847" elapsed="0.000354"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:07.651511" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:30:07.651650" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:30:07.651367" elapsed="0.000372"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:07.652293" level="INFO">{1: 20}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:07.651940" elapsed="0.000399"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:07.652766" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:07.652500" elapsed="0.000311"/>
</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-04-17T03:30:07.653449" elapsed="0.000285"/>
</kw>
<msg time="2026-04-17T03:30:07.653836" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:30:07.653882" level="INFO">${old_connection_index} = 20</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:07.653022" elapsed="0.000887"/>
</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-04-17T03:30:07.654783" elapsed="0.000334"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:30:07.656313" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:30:07.655841" elapsed="0.001471">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:07.655289" elapsed="0.002189"/>
</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-04-17T03:30:07.658182" elapsed="0.000321"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:07.657657" elapsed="0.000961"/>
</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-04-17T03:30:07.654237" elapsed="0.004441"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:07.654005" elapsed="0.004724"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:07.653987" elapsed="0.004770"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:07.659849" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:30:07.659423" elapsed="0.000455"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:30:07.659953" elapsed="0.000050"/>
</return>
<msg time="2026-04-17T03:30:07.660149" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:30:07.659053" elapsed="0.001121"/>
</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-04-17T03:30:07.660335" elapsed="0.000442"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:07.661111" level="INFO">index=21
host=10.30.170.120
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-04-17T03:30:07.661213" level="INFO">${karaf_connection_object} = index=21
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:30:07.660991" elapsed="0.000248"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:07.661393" elapsed="0.004272"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:30:07.666170" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:30:07.667504" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:30:07.665859" elapsed="0.002169">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:30:07.684651" elapsed="0.000482"/>
</kw>
<msg time="2026-04-17T03:30:07.685247" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:07.682615" elapsed="0.002818"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:07.685662" elapsed="0.000026"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:07.685852" elapsed="0.000032"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:30:07.669105" elapsed="0.016873"/>
</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-04-17T03:30:07.668404" elapsed="0.017626"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:30:07.650544" elapsed="0.035583">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:07.686538" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:30:07.686617" elapsed="0.000024"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:30:07.636246" elapsed="0.050492">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:30:07.686861" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:30:07.686910" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:07.631213" elapsed="0.055753"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:07.687403" elapsed="0.000116"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:07.687085" elapsed="0.000485"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:07.687058" elapsed="0.000549"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:30:07.631062" elapsed="0.056575"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:30:07.630865" elapsed="0.056808"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:30:07.628326" elapsed="0.059476"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:30:07.623186" elapsed="0.064704"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:07.622691" elapsed="0.065566"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:30:07.619536" elapsed="0.068788"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:07.689358" 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-04-17T03:30:07.689545" 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-04-17T03:30:07.689132" elapsed="0.000439"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-17T03:30:07.689983" 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-04-17T03:30:07.689733" elapsed="0.000278"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:07.690364" 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-04-17T03:30:07.690518" 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-04-17T03:30:07.690171" elapsed="0.000383"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-17T03:30:07.690973" 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-04-17T03:30:07.690717" elapsed="0.000291"/>
</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-04-17T03:30:07.691388" elapsed="0.002260"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:07.691100" elapsed="0.002587"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:07.691073" elapsed="0.002642"/>
</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-04-17T03:30:07.735029" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:07.734444" elapsed="0.000623"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:07.736149" 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-04-17T03:30:07.735796" elapsed="0.000462">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-04-17T03:30:07.736392" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:07.735275" elapsed="0.001152"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:07.737225" 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-04-17T03:30:07.736665" elapsed="0.000599"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:07.737709" 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-04-17T03:30:07.737948" 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-04-17T03:30:07.737495" elapsed="0.000555"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:07.738611" 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-04-17T03:30:07.738274" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:07.739923" level="INFO">mapping: {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:07.739595" elapsed="0.000407"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:07.740614" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:30:07.740235" elapsed="0.000416"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:07.741585" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:07.741179" elapsed="0.000441"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:07.742961" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:07.742334" elapsed="0.000665"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:07.743073" elapsed="0.000055"/>
</return>
<msg time="2026-04-17T03:30:07.743298" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:07.741880" 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-04-17T03:30:07.743556" elapsed="0.000426"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:30:07.740983" elapsed="0.003058"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:07.744739" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:07.744375" elapsed="0.000408"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:07.746400" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:07.745799" elapsed="0.000638"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:07.746509" elapsed="0.000048"/>
</return>
<msg time="2026-04-17T03:30:07.746733" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:07.745071" elapsed="0.001698"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:07.747004" elapsed="0.000307"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:30:07.744184" elapsed="0.003182"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:30:07.740722" elapsed="0.006696"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:30:07.747476" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:30:07.747686" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:30:07.739238" elapsed="0.008499"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:07.738787" elapsed="0.008986"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:07.748025" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:07.747802" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:07.738751" elapsed="0.009358"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:07.748942" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:30:07.748263" elapsed="0.000711"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:30:07.749026" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_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-04-17T03:30:07.733493" elapsed="0.015664"/>
</kw>
<msg time="2026-04-17T03:30:07.749217" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:07.718717" elapsed="0.030554"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:30:07.762790" 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/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-04-17T03:30:07.775823" elapsed="0.000077"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:30:07.789316" elapsed="0.000046"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:07.789604" 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-04-17T03:30:07.789798" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:07.790304" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:07.790097" elapsed="0.000282"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:07.790080" elapsed="0.000336"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:07.790620" 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-04-17T03:30:07.790830" 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-04-17T03:30:07.791029" elapsed="0.000064"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:30:07.790038" elapsed="0.001090"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:30:07.789886" elapsed="0.001272"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:07.791310" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:07.791391" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:30:07.791594" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:30:07.713189" elapsed="0.078449"/>
</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-04-17T03:30:07.820257" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:07.819786" elapsed="0.000506"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:07.821139" 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-04-17T03:30:07.820833" elapsed="0.000386">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-04-17T03:30:07.821318" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:07.820475" elapsed="0.000869"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:07.822061" 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-04-17T03:30:07.821638" elapsed="0.000451"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:07.822404" 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-04-17T03:30:07.822570" 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-04-17T03:30:07.822257" elapsed="0.000342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:07.823060" 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-04-17T03:30:07.822761" elapsed="0.000363"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-17T03:30:07.823592" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:07.823208" elapsed="0.000445"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:07.824232" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:07.823900" elapsed="0.000359"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:07.823680" elapsed="0.000615"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:07.823182" elapsed="0.001136"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:07.825032" 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-04-17T03:30:07.824500" elapsed="0.000564"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:30:07.825118" 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-04-17T03:30:07.818921" elapsed="0.006337"/>
</kw>
<msg time="2026-04-17T03:30:07.825319" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:07.804119" elapsed="0.021250"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:30:07.839446" elapsed="0.000058"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:30:07.852429" elapsed="0.000058"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:30:07.865318" elapsed="0.000065"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:07.865635" 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-04-17T03:30:07.865839" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:07.866327" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:07.866157" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:07.866138" 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-04-17T03:30:07.866562" 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-04-17T03:30:07.866732" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:07.866899" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:30:07.866096" elapsed="0.000872"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:30:07.865941" elapsed="0.001056"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:07.867163" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:07.867253" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:30:07.867442" 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-04-17T03:30:07.802690" elapsed="0.064784"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:07.869106" 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-04-17T03:30:07.868767" elapsed="0.000416">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-04-17T03:30:07.869280" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:07.868323" 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-04-17T03:30:07.869646" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:07.869375" elapsed="0.000328"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:07.870243" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:07.869945" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:07.869728" elapsed="0.000576"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:07.869357" elapsed="0.000968"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:07.872699" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:30:07.870477" elapsed="0.002287"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:30:07.872820" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:30:07.872996" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:30:07.867915" elapsed="0.005106"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:07.874612" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:30:07.874355" elapsed="0.000371"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:07.875143" 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-04-17T03:30:07.874883" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:07.875640" 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-04-17T03:30:07.875383" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:07.876154" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:07.875893" elapsed="0.000305"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:07.877060" 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-04-17T03:30:07.876831" elapsed="0.000256"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:30:07.877448" 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-04-17T03:30:07.877258" elapsed="0.000228"/>
</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-04-17T03:30:07.877644" elapsed="0.000214"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:07.878299" 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-04-17T03:30:07.878049" elapsed="0.000295"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:30:07.878396" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:30:07.878554" 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-04-17T03:30:07.876404" elapsed="0.002175"/>
</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-04-17T03:30:07.884180" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6</msg>
<msg time="2026-04-17T03:30:08.086071" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6</msg>
<msg time="2026-04-17T03:30:08.488614" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6</msg>
<msg time="2026-04-17T03:30:08.491408" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:30:07.881013" elapsed="0.615601">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:07.878650" elapsed="0.618148">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:30:08.497220" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:08.496864" elapsed="0.000548"/>
</branch>
<status status="FAIL" start="2026-04-17T03:30:07.878633" elapsed="0.618819">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:30:08.498137" elapsed="0.000040"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:08.498353" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:08.498294" elapsed="0.000125"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:08.498266" elapsed="0.000186"/>
</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-04-17T03:30:08.498678" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:30:08.498778" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>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="FAIL" start="2026-04-17T03:30:07.873356" elapsed="0.625615">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:08.499157" elapsed="0.000024"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>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="FAIL" start="2026-04-17T03:30:07.699592" elapsed="0.799727">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:08.499781" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:08.499501" elapsed="0.000468"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:08.499465" elapsed="0.000553"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:08.500085" elapsed="0.000040"/>
</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="FAIL" start="2026-04-17T03:30:07.694101" elapsed="0.806178">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:30:08.500567" elapsed="0.000035"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<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="NOT RUN" start="2026-04-17T03:30:08.500959" elapsed="0.000038"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:08.501228" elapsed="0.000031"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations">
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:08.501496" elapsed="0.000032"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:30:08.501766" elapsed="0.000030"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<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="NOT RUN" start="2026-04-17T03:30:08.502111" elapsed="0.000034"/>
</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-04-17T03:30:08.554753" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:08.554119" elapsed="0.000685"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:08.555983" 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-04-17T03:30:08.555606" elapsed="0.000474">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-04-17T03:30:08.556200" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:08.555105" elapsed="0.001121"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:08.556797" 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-04-17T03:30:08.556400" elapsed="0.000428"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:08.557167" 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-04-17T03:30:08.557337" 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-04-17T03:30:08.557018" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:08.557863" 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-04-17T03:30:08.557533" 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-04-17T03:30:08.559152" level="INFO">mapping: {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:08.558854" elapsed="0.000345"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:08.559652" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:30:08.559362" elapsed="0.000317"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:08.560707" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:08.560138" elapsed="0.000595"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:08.561976" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:08.561473" elapsed="0.000544"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:08.562137" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:30:08.562371" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:08.560960" 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-04-17T03:30:08.562553" elapsed="0.000515"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:30:08.559985" elapsed="0.003124"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:08.563878" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:08.563367" elapsed="0.000537"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:08.565290" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:08.564624" elapsed="0.000707"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:08.565449" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:30:08.565669" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:08.564143" elapsed="0.001552"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:08.565850" elapsed="0.000519"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:30:08.563226" elapsed="0.003185"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:30:08.559734" elapsed="0.006712"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:30:08.566490" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:30:08.566650" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:30:08.558450" elapsed="0.008226"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:08.558030" elapsed="0.008678"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:08.566968" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:08.566792" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:08.558000" elapsed="0.009047"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:08.567817" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:30:08.567195" elapsed="0.000652"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:30:08.567895" elapsed="0.000076"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:30:08.552871" elapsed="0.015204"/>
</kw>
<msg time="2026-04-17T03:30:08.568135" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:08.538626" elapsed="0.029574"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:30:08.581433" elapsed="0.000049"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:30:08.594600" elapsed="0.000064"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:30:08.608622" elapsed="0.000044"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:08.608901" elapsed="0.000037"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:08.609107" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:08.609558" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:08.609395" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:08.609377" 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-04-17T03:30:08.609787" 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-04-17T03:30:08.609983" 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-04-17T03:30:08.610166" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:30:08.609324" elapsed="0.000895"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:30:08.609196" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:08.610403" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:08.610484" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:30:08.610725" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:30:08.533184" elapsed="0.077570"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:08.612196" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:30:08.611809" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:30:08.617394" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6</msg>
<msg time="2026-04-17T03:30:08.819094" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6</msg>
<msg time="2026-04-17T03:30:09.221789" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6</msg>
<msg time="2026-04-17T03:30:09.224454" level="INFO">${response} = None</msg>
<msg time="2026-04-17T03:30:09.224540" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:08.614499" elapsed="0.613699">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:08.612318" elapsed="0.616033">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:09.228732" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:09.228415" elapsed="0.000420"/>
</branch>
<status status="FAIL" start="2026-04-17T03:30:08.612300" elapsed="0.616570">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:09.234112" 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-04-17T03:30:09.231033" elapsed="0.003116">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:09.230674" elapsed="0.003541">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:30:09.230645" elapsed="0.003602">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-04-17T03:30:09.236976" 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-04-17T03:30:09.234549" elapsed="0.002473">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:09.234318" elapsed="0.002775">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:30:09.234301" elapsed="0.002824">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:09.237854" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:30:09.237399" elapsed="0.000482"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:09.238267" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:09.237971" elapsed="0.000365"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:09.238851" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:09.238535" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:09.238361" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:09.237951" elapsed="0.001003"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:09.239528" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:30:09.239121" elapsed="0.000438"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:09.239896" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:09.239646" elapsed="0.000326"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:09.240492" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:09.240185" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:09.239997" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:09.239626" elapsed="0.000955"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:09.240777" elapsed="0.000401"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-17T03:30:09.241721" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:30:09.241361" elapsed="0.000388"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-04-17T03:30:09.244270" 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-04-17T03:30:09.241912" elapsed="0.002392">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-04-17T03:30:09.229956" elapsed="0.014497">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-04-17T03:30:09.244521" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:30:09.247117" level="INFO">${response_text} = None</msg>
<msg time="2026-04-17T03:30:09.247155" 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-04-17T03:30:08.611113" elapsed="0.636071">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-04-17T03:30:09.247254" elapsed="0.000027"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="FAIL" start="2026-04-17T03:30:08.504039" elapsed="0.743392">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:08.503225" elapsed="0.744271"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-04-17T03:30:08.502537" elapsed="0.745021"/>
</kw>
<arg>l3vpn_mcast_ipv6</arg>
<arg>${L3VPN_MCAST_DIR}</arg>
<status status="FAIL" start="2026-04-17T03:30:07.688668" elapsed="1.558966">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:07.619018" elapsed="1.628785">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:30:09.252200" elapsed="0.000291"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:30:09.251741" elapsed="0.000818"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:09.253706" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:09.253567" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:09.253539" elapsed="0.000242"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:09.259042" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:09.258913" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:09.258894" elapsed="0.000217"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:09.260264" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:30:09.259800" elapsed="0.000494"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:30:09.260763" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:30:09.260460" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:30:09.260835" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:30:09.261019" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:30:09.259393" elapsed="0.001651"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:09.266982" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:09.266853" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:09.266834" elapsed="0.000217"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:09.268393" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:09.268278" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:09.268260" elapsed="0.000202"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:09.268979" level="INFO">${karaf_connection_index} = 21</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:30:09.268613" elapsed="0.000396"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:09.269404" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:30:09.269178" elapsed="0.000252"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:30:09.270227" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:30:09.269949" elapsed="0.000959">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:30:09.271130" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:30:09.271190" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:09.269591" elapsed="0.001624"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:30:09.272041" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:30:09.271755" elapsed="0.001007">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:30:09.272976" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:30:09.273024" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:09.271389" elapsed="0.001658"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:30:09.273985" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Play_To_Odl_l3vpn_mcast_ipv6"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:30:09.273348" elapsed="0.000701">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Play_To_Odl_l3vpn_mcast_ipv6"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:09.273123" elapsed="0.000997">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Play_To_Odl_l3vpn_mcast_ipv6"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:30:09.273104" elapsed="0.001049">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Play_To_Odl_l3vpn_mcast_ipv6"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:09.274321" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:09.274549" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:09.274408" elapsed="0.000246"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:09.274391" elapsed="0.000287"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:30:09.274711" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:30:09.277636" elapsed="0.000148"/>
</kw>
<msg time="2026-04-17T03:30:09.277853" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:09.276421" 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-04-17T03:30:09.278289" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:09.278624" 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-04-17T03:30:09.275634" elapsed="0.003178"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:30:09.275014" 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="FAIL" start="2026-04-17T03:30:09.267853" elapsed="0.011126">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Play_To_Odl_l3vpn_mcast_ipv6"</status>
</kw>
<msg time="2026-04-17T03:30:09.279085" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:30:09.279130" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Play_To_Odl_l3vpn_mcast_ipv6"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:09.267207" elapsed="0.011947"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:30:09.279350" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:09.279230" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:09.279212" elapsed="0.000213"/>
</if>
<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-04-17T03:30:09.280522" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:09.280415" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:09.280397" elapsed="0.000192"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:09.280881" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:30:09.281088" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:30:09.280744" elapsed="0.000373"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:09.281541" level="INFO">{1: 21}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:09.281277" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:09.282105" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:09.281762" elapsed="0.000393"/>
</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-04-17T03:30:09.282705" elapsed="0.000279"/>
</kw>
<msg time="2026-04-17T03:30:09.283084" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:30:09.283130" level="INFO">${old_connection_index} = 21</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:09.282325" elapsed="0.000828"/>
</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-04-17T03:30:09.284000" elapsed="0.000227"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:30:09.285374" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:30:09.284888" elapsed="0.001349">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:09.284401" elapsed="0.001933"/>
</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-04-17T03:30:09.286989" elapsed="0.000274"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:09.286506" elapsed="0.000839"/>
</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-04-17T03:30:09.283450" elapsed="0.003940"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:09.283227" elapsed="0.004211"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:09.283209" elapsed="0.004254"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:09.288418" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:30:09.288019" elapsed="0.000426"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:30:09.288493" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:30:09.288644" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:30:09.287670" elapsed="0.000998"/>
</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-04-17T03:30:09.288828" elapsed="0.000485"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:09.289666" level="INFO">index=22
host=10.30.170.120
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-04-17T03:30:09.289771" level="INFO">${karaf_connection_object} = index=22
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:30:09.289536" elapsed="0.000261"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:09.289997" elapsed="0.002353"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:30:09.292781" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:30:09.294077" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:30:09.292518" elapsed="0.001940">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:30:09.310099" elapsed="0.000421"/>
</kw>
<msg time="2026-04-17T03:30:09.310628" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:09.308167" elapsed="0.002633"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:09.311027" elapsed="0.000026"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:09.311258" elapsed="0.000028"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:30:09.295277" elapsed="0.016083"/>
</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-04-17T03:30:09.294742" elapsed="0.016669"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:30:09.280076" elapsed="0.031433">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:09.312603" elapsed="0.000036"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:30:09.312706" 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="FAIL" start="2026-04-17T03:30:09.266503" elapsed="0.046371">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:30:09.313056" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:30:09.313113" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:09.261439" elapsed="0.051705"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:09.313584" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:09.313259" elapsed="0.000380"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:09.313231" elapsed="0.000434"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:30:09.261291" elapsed="0.052399"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:30:09.261108" elapsed="0.052619"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:30:09.258538" elapsed="0.055251"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:30:09.253224" elapsed="0.060624"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:09.252721" elapsed="0.061173"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:30:09.248753" elapsed="0.065217"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:09.315393" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:09.314806" elapsed="0.000616"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:09.316063" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:09.315592" elapsed="0.000499"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:09.316769" 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-04-17T03:30:09.316311" elapsed="0.000503"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:09.317412" 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-04-17T03:30:09.317637" 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-04-17T03:30:09.317124" elapsed="0.000547"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:09.318241" 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-04-17T03:30:09.318393" 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-04-17T03:30:09.317883" elapsed="0.000536"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-04-17T03:30:09.318581" elapsed="0.002862"/>
</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-04-17T03:30:09.321646" 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-04-17T03:30:09.383750" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:09.383320" elapsed="0.000466"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:09.384680" 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-04-17T03:30:09.384393" elapsed="0.000367">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-04-17T03:30:09.384856" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:09.383984" elapsed="0.000896"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:09.385462" 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-04-17T03:30:09.385074" elapsed="0.000415"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:09.385795" 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-04-17T03:30:09.385987" 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-04-17T03:30:09.385652" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:09.386425" 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-04-17T03:30:09.386177" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:09.387633" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:09.387312" elapsed="0.000368"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:09.388181" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:30:09.387844" elapsed="0.000418"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:09.389075" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:09.388645" elapsed="0.000456"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:09.390329" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:09.389757" elapsed="0.000673"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:09.390511" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:30:09.390823" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:09.389298" elapsed="0.001552"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:09.391028" elapsed="0.000393"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:30:09.388503" elapsed="0.002960"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:09.392186" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:09.391713" elapsed="0.000506"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:09.393649" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:09.393101" elapsed="0.000649"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:09.393829" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:30:09.394147" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:09.392610" elapsed="0.001564"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:09.394330" elapsed="0.000371"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:30:09.391577" elapsed="0.003166"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:30:09.388321" elapsed="0.006458"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:30:09.394853" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:30:09.395069" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:30:09.386965" elapsed="0.008130"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:09.386553" elapsed="0.008576"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:09.395315" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:09.395158" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:09.386528" elapsed="0.008879"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:09.396258" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:30:09.395565" elapsed="0.000733"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:30:09.396360" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:30:09.382525" elapsed="0.013969"/>
</kw>
<msg time="2026-04-17T03:30:09.396552" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:09.369186" elapsed="0.027421"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:30:09.409836" elapsed="0.000055"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:30:09.422744" elapsed="0.000062"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:30:09.435378" elapsed="0.000044"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:09.435644" 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-04-17T03:30:09.435832" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:09.436327" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:09.436124" elapsed="0.000262"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:09.436105" elapsed="0.000308"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:09.436560" 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-04-17T03:30:09.436734" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:09.436899" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:30:09.436065" elapsed="0.000904"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:30:09.435920" elapsed="0.001077"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:09.437145" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:09.437225" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:30:09.437391" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:30:09.364464" elapsed="0.072956"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:09.438911" 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-04-17T03:30:09.438598" elapsed="0.000408">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-04-17T03:30:09.439103" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:09.438151" elapsed="0.000976"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:09.439464" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:09.439197" elapsed="0.000324"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:09.440050" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:09.439738" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:09.439545" elapsed="0.000567"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:09.439180" elapsed="0.000953"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:09.443520" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:30:09.440323" elapsed="0.003224"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:30:09.443603" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:30:09.443767" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:30:09.437770" elapsed="0.006077"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:09.445215" 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-04-17T03:30:09.444954" elapsed="0.000329">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-04-17T03:30:09.445377" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:09.444591" elapsed="0.000811"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:30:09.445614" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-17T03:30:09.445476" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:09.445457" elapsed="0.000248"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:09.445854" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:09.446045" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:30:09.446112" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:30:09.448086" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:30:09.444246" elapsed="0.003867"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:09.449597" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:09.449332" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:09.450064" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:09.449801" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:30:09.456083" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:09.657678" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:10.060290" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:10.063197" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:30:09.452503" elapsed="0.616560">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:09.450175" elapsed="0.619006">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:10.069482" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:10.069230" elapsed="0.000324"/>
</branch>
<status status="FAIL" start="2026-04-17T03:30:09.450157" elapsed="0.619422">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:10.070173" elapsed="0.000045"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:10.070377" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:10.070321" elapsed="0.000113"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:10.070294" elapsed="0.000170"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:10.070660" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:30:10.070753" 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-04-17T03:30:09.448472" elapsed="0.622433">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:10.071034" 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-04-17T03:30:09.337040" elapsed="0.734127">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:10.071515" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:10.071286" elapsed="0.000306"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:10.071265" elapsed="0.000354"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:10.071657" elapsed="0.000019"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-04-17T03:30:09.330343" elapsed="0.741651">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:12.133256" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:12.132720" elapsed="0.000574"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:12.134134" 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-04-17T03:30:12.133851" elapsed="0.000361">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-04-17T03:30:12.134329" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:12.133483" elapsed="0.000877"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:12.134944" 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-04-17T03:30:12.134532" elapsed="0.000443"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:12.135288" 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-04-17T03:30:12.135531" 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-04-17T03:30:12.135140" elapsed="0.000418"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:12.136004" 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-04-17T03:30:12.135731" 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-04-17T03:30:12.137297" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:12.136908" elapsed="0.000437"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:12.137786" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:30:12.137511" elapsed="0.000302"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:12.138618" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:12.138209" elapsed="0.000435"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:12.139875" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:12.139319" elapsed="0.000684"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:12.140113" elapsed="0.000048"/>
</return>
<msg time="2026-04-17T03:30:12.140523" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:12.138837" elapsed="0.001722"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:12.140780" elapsed="0.000562"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:30:12.138068" elapsed="0.003327"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:12.142341" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:12.141706" elapsed="0.000663"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:12.143653" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:12.143096" elapsed="0.000663"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:12.143837" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:30:12.144160" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:12.142563" elapsed="0.001623"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:12.144343" elapsed="0.000368"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:30:12.141546" elapsed="0.003209"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:30:12.137866" elapsed="0.006925"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:30:12.144833" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:30:12.145049" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:30:12.136498" elapsed="0.008578"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:12.136136" elapsed="0.008973"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:12.145288" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:12.145134" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:12.136112" elapsed="0.009251"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:12.146228" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:30:12.145517" elapsed="0.000751"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:30:12.146332" 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/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-04-17T03:30:12.131896" elapsed="0.014599"/>
</kw>
<msg time="2026-04-17T03:30:12.146563" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:12.117007" elapsed="0.029621"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:30:12.161167" 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/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-04-17T03:30:12.174424" elapsed="0.000045"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:30:12.187157" elapsed="0.000048"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:12.187438" 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-04-17T03:30:12.187630" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:12.188088" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:12.187913" elapsed="0.000231"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:12.187894" 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-04-17T03:30:12.188322" 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-04-17T03:30:12.188492" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:12.188659" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:30:12.187852" elapsed="0.000860"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:30:12.187719" elapsed="0.001021"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:12.188910" elapsed="0.000036"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:12.189007" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:30:12.189176" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:30:12.112366" elapsed="0.076839"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:12.190697" 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-04-17T03:30:12.190392" elapsed="0.000382">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-04-17T03:30:12.190870" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:12.189983" elapsed="0.000911"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:12.191331" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:12.190988" elapsed="0.000402"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:12.191960" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:12.191607" elapsed="0.000381"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:12.191416" elapsed="0.000608"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:12.190969" elapsed="0.001076"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:12.194649" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:30:12.192199" elapsed="0.002477"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:30:12.194730" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:30:12.194892" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:30:12.189565" elapsed="0.005352"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:12.196193" 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-04-17T03:30:12.195945" elapsed="0.000313">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-04-17T03:30:12.196354" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:12.195584" elapsed="0.000796"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:30:12.196590" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-17T03:30:12.196452" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:12.196434" elapsed="0.000241"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:12.196825" 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-04-17T03:30:12.197061" elapsed="0.000023"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:30:12.197131" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:30:12.199592" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:30:12.195250" elapsed="0.004379"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:12.201751" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:12.201380" elapsed="0.000430"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:12.202245" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:12.201982" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:30:12.207552" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:12.409290" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:12.812324" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:12.816371" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:30:12.204442" elapsed="0.617647">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:12.202357" elapsed="0.620121">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:12.823040" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:12.822568" elapsed="0.000583"/>
</branch>
<status status="FAIL" start="2026-04-17T03:30:12.202339" elapsed="0.620853">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:12.824209" elapsed="0.000060"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:12.824506" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:12.824438" elapsed="0.000175"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:12.824394" elapsed="0.000261"/>
</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-04-17T03:30:12.824890" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:30:12.825023" elapsed="0.000024"/>
</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-04-17T03:30:12.200117" elapsed="0.625138">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:12.825376" elapsed="0.000030"/>
</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-04-17T03:30:12.087538" elapsed="0.738010">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:12.826010" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:12.825697" elapsed="0.000420"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:12.825668" elapsed="0.000487"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:12.826201" elapsed="0.000021"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-04-17T03:30:12.080650" elapsed="0.745702">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:14.891158" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/l3vpn_mcast_ipv6/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:14.890690" elapsed="0.000514"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:14.892145" 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-04-17T03:30:14.891764" elapsed="0.000484">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-04-17T03:30:14.892511" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:14.891401" elapsed="0.001135"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:14.893223" 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-04-17T03:30:14.892719" elapsed="0.000534"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:14.893585" 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-04-17T03:30:14.893821" 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-04-17T03:30:14.893426" elapsed="0.000423"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:14.894354" 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-04-17T03:30:14.894060" elapsed="0.000348"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:14.895653" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:14.895285" elapsed="0.000416"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:14.896231" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:30:14.895868" elapsed="0.000390"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:14.897283" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:14.896710" elapsed="0.000610"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:14.898747" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:14.898156" elapsed="0.000705"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:14.898963" elapsed="0.000048"/>
</return>
<msg time="2026-04-17T03:30:14.899351" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:14.897588" elapsed="0.001791"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:14.899546" elapsed="0.000436"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:30:14.896515" elapsed="0.003509"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:14.900983" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:14.900283" elapsed="0.000728"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:14.902335" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:14.901713" elapsed="0.000728"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:14.902520" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:30:14.902850" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:14.901208" elapsed="0.001669"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:14.903054" elapsed="0.000442"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:30:14.900145" elapsed="0.003396"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:30:14.896324" elapsed="0.007253"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:30:14.903623" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:30:14.903791" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:30:14.894937" elapsed="0.008880"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:14.894506" elapsed="0.009345"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:14.904058" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:14.903881" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:14.894471" elapsed="0.009671"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:14.905076" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:30:14.904301" elapsed="0.000813"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:30:14.905255" 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_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-04-17T03:30:14.889991" elapsed="0.015442"/>
</kw>
<msg time="2026-04-17T03:30:14.905515" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:14.876161" elapsed="0.029430"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:30:14.919212" elapsed="0.000059"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:30:14.932297" 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/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-04-17T03:30:14.945281" elapsed="0.000043"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:14.945656" elapsed="0.000037"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:14.945878" 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-04-17T03:30:14.946409" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:14.946235" elapsed="0.000233"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:14.946212" 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-04-17T03:30:14.946654" 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-04-17T03:30:14.946878" elapsed="0.000029"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:14.947104" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:30:14.946156" elapsed="0.001006"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:30:14.945999" elapsed="0.001194"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:14.947349" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:14.947437" elapsed="0.000021"/>
</return>
<msg time="2026-04-17T03:30:14.947656" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:30:14.871044" elapsed="0.076645"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:14.949575" 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-04-17T03:30:14.949191" elapsed="0.000508">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-04-17T03:30:14.949801" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:14.948651" elapsed="0.001175"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:14.950212" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:14.949898" elapsed="0.000373"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:14.950817" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:14.950512" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:14.950296" elapsed="0.000583"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:14.949879" elapsed="0.001026"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:14.953692" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:30:14.951118" elapsed="0.002603"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:30:14.953775" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:30:14.953976" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:30:14.948225" elapsed="0.005783"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:14.955422" 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-04-17T03:30:14.955170" elapsed="0.000316">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-04-17T03:30:14.955581" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:14.954740" elapsed="0.000865"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:30:14.955811" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:30:14.955675" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:14.955656" elapsed="0.000239"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:14.956063" 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-04-17T03:30:14.956241" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:30:14.956306" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:30:14.958261" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:30:14.954337" elapsed="0.003953"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:14.959854" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:14.959583" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:14.960326" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:14.960077" 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-04-17T03:30:14.966219" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:15.168791" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:15.572414" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:15.576752" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:30:14.962661" elapsed="0.620471">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:14.960437" elapsed="0.622875">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:15.583805" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:15.583379" elapsed="0.000535"/>
</branch>
<status status="FAIL" start="2026-04-17T03:30:14.960418" elapsed="0.623553">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:15.584713" elapsed="0.000033"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:15.584890" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:15.584841" elapsed="0.000129"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:15.584815" elapsed="0.000188"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:15.585287" elapsed="0.000027"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:30:15.585367" elapsed="0.000017"/>
</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-04-17T03:30:14.958672" elapsed="0.626836">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:15.585591" 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-04-17T03:30:14.844072" elapsed="0.741624">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:15.586435" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:15.585822" elapsed="0.000762"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:15.585783" elapsed="0.000837"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:15.586658" elapsed="0.000015"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-04-17T03:30:14.836577" elapsed="0.750201">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:30:15.587027" level="FAIL">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-17T03:30:09.323834" elapsed="6.263311">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:30:15.587362" elapsed="0.000023"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:30:15.587638" elapsed="0.000029"/>
</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="NOT RUN" start="2026-04-17T03:30:15.587860" elapsed="0.000021"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:30:15.588246" elapsed="0.000022"/>
</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-04-17T03:30:15.588605" elapsed="0.003277"/>
</kw>
<arg>l3vpn_mcast_ipv6</arg>
<arg>${L3VPN_MCAST_DIR}</arg>
<arg>ipv6</arg>
<status status="FAIL" start="2026-04-17T03:30:09.314353" elapsed="6.277728">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:09.248172" elapsed="6.344189">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:30:15.597149" elapsed="0.000307"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:30:15.596833" elapsed="0.000686"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:15.599041" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:15.598852" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:15.598825" elapsed="0.000299"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:15.604873" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:15.604731" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:15.604706" elapsed="0.000269"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:15.606404" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:30:15.605765" elapsed="0.000674"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:30:15.607026" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:30:15.606641" elapsed="0.000415"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:30:15.607103" elapsed="0.000047"/>
</return>
<msg time="2026-04-17T03:30:15.607285" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:30:15.605295" elapsed="0.002015"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:15.617525" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:15.617282" elapsed="0.000347"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:15.617236" elapsed="0.000430"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:15.619921" elapsed="0.000077"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:15.619804" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:15.619785" elapsed="0.000269"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:15.620598" level="INFO">${karaf_connection_index} = 22</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:30:15.620220" elapsed="0.000410"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:15.621089" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:30:15.620806" elapsed="0.000322"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:30:15.622146" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:30:15.621767" elapsed="0.001450">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:30:15.623430" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:30:15.623491" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:15.621371" elapsed="0.002151"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:30:15.624588" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:30:15.624233" elapsed="0.001120">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:30:15.625564" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:30:15.625611" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:15.623727" elapsed="0.001908"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:30:15.626819" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Kill_Talking_BGP_Speaker"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:30:15.626024" elapsed="0.000865">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Kill_Talking_BGP_Speaker"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:15.625723" elapsed="0.001267">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Kill_Talking_BGP_Speaker"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:30:15.625699" elapsed="0.001331">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Kill_Talking_BGP_Speaker"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:15.627207" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:15.627457" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:15.627297" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:15.627279" elapsed="0.000271"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:30:15.627588" elapsed="0.000018"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:30:15.631291" elapsed="0.000193"/>
</kw>
<msg time="2026-04-17T03:30:15.631588" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:15.629608" elapsed="0.002172"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:15.632145" elapsed="0.000115"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:15.632596" elapsed="0.000083"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:30:15.628799" elapsed="0.004009"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:30:15.628007" elapsed="0.004872"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:30:15.619469" elapsed="0.013640">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Kill_Talking_BGP_Speaker"</status>
</kw>
<msg time="2026-04-17T03:30:15.633246" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:30:15.633293" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Kill_Talking_BGP_Speaker"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:15.618300" elapsed="0.015023"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:30:15.633625" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:15.633470" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:15.633433" elapsed="0.000541"/>
</if>
<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-04-17T03:30:15.635422" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:15.635310" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:15.635292" elapsed="0.000198"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:15.635827" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:30:15.635965" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:30:15.635654" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:15.636469" level="INFO">{1: 22}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:15.636155" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:15.637049" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:15.636682" elapsed="0.000426"/>
</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-04-17T03:30:15.637763" elapsed="0.000433"/>
</kw>
<msg time="2026-04-17T03:30:15.638327" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:30:15.638387" level="INFO">${old_connection_index} = 22</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:15.637310" elapsed="0.001106"/>
</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-04-17T03:30:15.639667" elapsed="0.000294"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:30:15.641519" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:30:15.640875" elapsed="0.002136">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:15.640197" elapsed="0.002981"/>
</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-04-17T03:30:15.644259" elapsed="0.000369"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:15.643441" elapsed="0.001278"/>
</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-04-17T03:30:15.638792" elapsed="0.005980"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:15.638512" elapsed="0.006318"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:15.638491" elapsed="0.006387"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:15.646139" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:30:15.645700" elapsed="0.000473"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:30:15.646234" elapsed="0.000050"/>
</return>
<msg time="2026-04-17T03:30:15.646421" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:30:15.645224" elapsed="0.001222"/>
</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-04-17T03:30:15.646613" elapsed="0.000531"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:15.647497" level="INFO">index=23
host=10.30.170.120
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-04-17T03:30:15.647604" level="INFO">${karaf_connection_object} = index=23
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:30:15.647346" elapsed="0.000284"/>
</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-04-17T03:30:15.647790" elapsed="0.005405"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:30:15.653765" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:30:15.655141" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:30:15.653403" elapsed="0.002288">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:30:15.672605" elapsed="0.000704"/>
</kw>
<msg time="2026-04-17T03:30:15.673442" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:15.670673" elapsed="0.003053"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:15.674028" elapsed="0.000029"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:15.674215" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:30:15.657032" elapsed="0.017275"/>
</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-04-17T03:30:15.656221" elapsed="0.018137"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:30:15.634821" elapsed="0.039645">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:15.674975" elapsed="0.000031"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:30:15.675064" elapsed="0.000032"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:30:15.616382" elapsed="0.058822">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:30:15.675340" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:30:15.675384" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:15.607756" elapsed="0.067652"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:15.675854" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:15.675533" elapsed="0.000377"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:15.675495" elapsed="0.000460"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:30:15.607596" elapsed="0.068388"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:30:15.607384" elapsed="0.068643"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:30:15.604260" elapsed="0.071837"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:30:15.598495" elapsed="0.077664"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:15.597728" elapsed="0.078480"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:30:15.593507" elapsed="0.082759"/>
</kw>
<kw name="Kill_BGP_Speaker" owner="BGPSpeaker">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:15.678007" 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-04-17T03:30:15.677611" elapsed="0.000424"/>
</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-04-17T03:30:15.678196" elapsed="0.000458"/>
</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-04-17T03:30:15.677320" elapsed="0.001399"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:30:15.697116" level="INFO">^C
[?2004h[jenkins@releng-26932-188-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-04-17T03:30:15.679314" elapsed="0.018008"/>
</kw>
<msg time="2026-04-17T03:30:15.697545" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:30:15.697592" level="INFO">${message} = ^C
[?2004h[jenkins@releng-26932-188-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${status}</var>
<var>${message}</var>
<arg>SSHLibrary.Read_Until_Prompt</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:15.678924" elapsed="0.018695"/>
</kw>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:30:15.698948" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-04-17T03:30:15.711368" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:30:15.712017" level="INFO">${output_log} = 2026-04-17 03:29:53,662 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:29:53,662 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.238
2026-04-17 03:29:53,662 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-04-17T03:30:15.698711" elapsed="0.013416"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:15.714313" level="INFO">2026-04-17 03:29:53,662 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:29:53,662 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.238
2026-04-17 03:29:53,662 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-04-17 03:29:53,662 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.120
2026-04-17 03:29:53,663 DEBUG BGP-Thread-1 (job): Remote port: 1790
Exception in thread Thread-1 (job):
Traceback (most recent call last):
  File "/usr/lib/python3.10/threading.py", line 1016, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.10/threading.py", line 953, in run
    self._target(*self._args, **self._kwargs)
  File "/home/jenkins/play.py", line 2406, in job
    bgp_socket = establish_connection(arguments)
  File "/home/jenkins/play.py", line 284, in establish_connection
    talking_socket.connect((str(arguments.peerip), arguments.peerport))
ConnectionRefusedError: [Errno 111] Connection refused
10.30.171.144 - - [17/Apr/2026 03:29:59] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:30:01] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:30:01] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:30:07] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:30:07] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:30:09] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:30:09] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:30:15] "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-04-17T03:30:15.712988" elapsed="0.001773"/>
</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-04-17T03:30:15.698177" elapsed="0.016858"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<status status="PASS" start="2026-04-17T03:30:15.715807" elapsed="0.000176"/>
</return>
<status status="PASS" start="2026-04-17T03:30:15.715328" elapsed="0.000780"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:15.715245" elapsed="0.000957"/>
</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-04-17T03:30:15.716775" elapsed="0.000081"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was not seen within timeout period.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:15.717428" elapsed="0.000074"/>
</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-04-17T03:30:15.676569" elapsed="0.041149"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:30:15.732763" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-04-17T03:30:15.760202" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:30:15.760630" level="INFO">${output_log} = 2026-04-17 03:29:53,662 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:29:53,662 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.238
2026-04-17 03:29:53,662 DEBUG BGP-Thr...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-17T03:30:15.732468" elapsed="0.028209"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:15.761999" level="INFO">2026-04-17 03:29:53,662 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:29:53,662 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.238
2026-04-17 03:29:53,662 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-04-17 03:29:53,662 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.120
2026-04-17 03:29:53,663 DEBUG BGP-Thread-1 (job): Remote port: 1790
Exception in thread Thread-1 (job):
Traceback (most recent call last):
  File "/usr/lib/python3.10/threading.py", line 1016, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.10/threading.py", line 953, in run
    self._target(*self._args, **self._kwargs)
  File "/home/jenkins/play.py", line 2406, in job
    bgp_socket = establish_connection(arguments)
  File "/home/jenkins/play.py", line 284, in establish_connection
    talking_socket.connect((str(arguments.peerip), arguments.peerport))
ConnectionRefusedError: [Errno 111] Connection refused
10.30.171.144 - - [17/Apr/2026 03:29:59] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:30:01] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:30:01] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:30:07] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:30:07] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:30:09] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:30:09] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:30:15] "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-04-17T03:30:15.761237" elapsed="0.000862"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:15.763276" 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-04-17T03:30:15.762481" elapsed="0.000886"/>
</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-04-17T03:30:15.731502" elapsed="0.032009"/>
</kw>
<doc>Abort the Python speaker</doc>
<status status="PASS" start="2026-04-17T03:30:15.592716" elapsed="0.171028"/>
</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-04-17T03:30:15.770250" elapsed="0.000382"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:30:15.769756" elapsed="0.000969"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:15.772442" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:15.772218" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:15.772178" elapsed="0.000378"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:15.778389" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:15.778273" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:15.778254" elapsed="0.000205"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:15.779758" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:30:15.779256" elapsed="0.000541"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:30:15.780329" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:30:15.780000" elapsed="0.000356"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:30:15.780402" elapsed="0.000047"/>
</return>
<msg time="2026-04-17T03:30:15.780580" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:30:15.778750" elapsed="0.001856"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:15.786743" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:15.786596" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:15.786577" elapsed="0.000243"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:15.788153" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:15.788039" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:15.788021" elapsed="0.000222"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:15.788761" level="INFO">${karaf_connection_index} = 23</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:30:15.788428" elapsed="0.000361"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:15.789254" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:30:15.788978" elapsed="0.000303"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:30:15.790364" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:30:15.790001" elapsed="0.001240">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:30:15.791469" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:30:15.791517" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:15.789506" elapsed="0.002034"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:30:15.792365" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:30:15.792098" elapsed="0.001024">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:30:15.793314" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:30:15.793361" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:15.791719" elapsed="0.001664"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:30:15.794568" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Delete_Bgp_Peer_Configuration"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:30:15.793703" elapsed="0.000941">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Delete_Bgp_Peer_Configuration"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:15.793465" elapsed="0.001283">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Delete_Bgp_Peer_Configuration"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:30:15.793443" elapsed="0.001350">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Delete_Bgp_Peer_Configuration"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:15.795049" elapsed="0.000034"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:15.795317" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:15.795161" elapsed="0.000344"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:15.795141" elapsed="0.000408"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:30:15.795591" elapsed="0.000019"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:30:15.798691" elapsed="0.000172"/>
</kw>
<msg time="2026-04-17T03:30:15.798959" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:15.797371" elapsed="0.001731"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:15.799393" elapsed="0.000080"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:15.799803" 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-04-17T03:30:15.796629" elapsed="0.003496"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:30:15.795990" elapsed="0.004202"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:30:15.787680" elapsed="0.012603">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Delete_Bgp_Peer_Configuration"</status>
</kw>
<msg time="2026-04-17T03:30:15.800408" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:30:15.800462" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Delete_Bgp_Peer_Configuration"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:15.787000" elapsed="0.013575"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:30:15.800780" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:15.800664" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:15.800645" elapsed="0.000201"/>
</if>
<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-04-17T03:30:15.802054" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:15.801915" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:15.801840" elapsed="0.000284"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:15.802436" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:30:15.802565" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:30:15.802286" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:15.803045" level="INFO">{1: 23}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:15.802753" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:15.803492" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:15.803246" elapsed="0.000290"/>
</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-04-17T03:30:15.804259" elapsed="0.000309"/>
</kw>
<msg time="2026-04-17T03:30:15.804692" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:30:15.804741" level="INFO">${old_connection_index} = 23</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:15.803698" elapsed="0.001066"/>
</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-04-17T03:30:15.805700" elapsed="0.000225"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:30:15.807119" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:30:15.806664" elapsed="0.001538">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:15.806152" elapsed="0.002154"/>
</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-04-17T03:30:15.809024" elapsed="0.000300"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:15.808486" elapsed="0.000924"/>
</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-04-17T03:30:15.805134" elapsed="0.004323"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:15.804856" elapsed="0.004651"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:15.804825" elapsed="0.004710"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:15.810549" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:30:15.810174" elapsed="0.000402"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:30:15.810632" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:30:15.810794" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:30:15.809764" elapsed="0.001056"/>
</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-04-17T03:30:15.810997" elapsed="0.000478"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:15.811778" level="INFO">index=24
host=10.30.170.120
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-04-17T03:30:15.811881" level="INFO">${karaf_connection_object} = index=24
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:30:15.811659" elapsed="0.000249"/>
</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-04-17T03:30:15.812094" elapsed="0.002393"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:30:15.814944" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:30:15.816202" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:30:15.814658" elapsed="0.001953">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:30:15.832521" elapsed="0.000565"/>
</kw>
<msg time="2026-04-17T03:30:15.833207" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:15.830719" elapsed="0.002662"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:15.833547" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:15.833710" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:30:15.817624" elapsed="0.016174"/>
</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-04-17T03:30:15.817066" elapsed="0.016782"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:30:15.801307" elapsed="0.032683">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:15.834444" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:30:15.834525" 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="FAIL" start="2026-04-17T03:30:15.786237" elapsed="0.048418">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:30:15.834781" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:30:15.834825" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:15.781198" elapsed="0.053653"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:15.835275" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:15.834997" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:15.834920" elapsed="0.000437"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:30:15.781039" elapsed="0.054344"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:30:15.780802" elapsed="0.054625"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:30:15.777877" elapsed="0.057617"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:30:15.771714" elapsed="0.063845"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:15.770990" elapsed="0.064618"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:30:15.765269" elapsed="0.070401"/>
</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-04-17T03:30:15.879176" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:15.878711" elapsed="0.000504"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:15.880100" 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-04-17T03:30:15.879755" elapsed="0.000445">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-04-17T03:30:15.880299" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:15.879402" elapsed="0.000921"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:15.880887" 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-04-17T03:30:15.880494" elapsed="0.000419"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:15.881295" 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-04-17T03:30:15.881664" 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-04-17T03:30:15.881122" elapsed="0.000570"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:15.882171" 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-04-17T03:30:15.881855" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:15.883554" level="INFO">mapping: {'IP': '10.30.171.238', '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-04-17T03:30:15.883245" elapsed="0.000357"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:15.884086" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:30:15.883775" elapsed="0.000337"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:15.884908" level="INFO">${value} = 10.30.171.238</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:15.884586" elapsed="0.000378"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:15.886163" level="INFO">${encoded} = 10.30.171.238</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:15.885901" elapsed="0.000290"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:15.886251" elapsed="0.000054"/>
</return>
<msg time="2026-04-17T03:30:15.886459" level="INFO">${encoded_value} = 10.30.171.238</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:15.885226" 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-04-17T03:30:15.886647" elapsed="0.000263"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.238</var>
<status status="PASS" start="2026-04-17T03:30:15.884382" elapsed="0.002595"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:15.887541" 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-04-17T03:30:15.887237" elapsed="0.000330"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:15.888419" 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-04-17T03:30:15.888155" elapsed="0.000298"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:15.888513" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:30:15.888705" 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-04-17T03:30:15.887758" elapsed="0.000980"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:15.888953" elapsed="0.000311"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:30:15.887099" elapsed="0.002221"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:15.890012" 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-04-17T03:30:15.889642" elapsed="0.000396"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:15.890823" 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-04-17T03:30:15.890606" elapsed="0.000243"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:15.890898" elapsed="0.000047"/>
</return>
<msg time="2026-04-17T03:30:15.891072" 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-04-17T03:30:15.890229" elapsed="0.000867"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:15.891248" elapsed="0.000224"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:30:15.889471" elapsed="0.002040"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:15.892084" 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-04-17T03:30:15.891756" elapsed="0.000353"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:15.893017" 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-04-17T03:30:15.892704" elapsed="0.000347"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:15.893115" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:30:15.893311" 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-04-17T03:30:15.892298" 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-04-17T03:30:15.893549" elapsed="0.000281"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:30:15.891623" elapsed="0.002254"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:15.894623" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:15.894284" elapsed="0.000366"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:15.895454" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:15.895193" elapsed="0.000297"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:15.895555" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:30:15.895772" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:15.894847" elapsed="0.000962"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:15.896043" elapsed="0.000313"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:30:15.894133" elapsed="0.002279"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:15.897209" 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-04-17T03:30:15.896765" elapsed="0.000480"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:15.898285" 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-04-17T03:30:15.897981" elapsed="0.000340"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:15.898385" elapsed="0.000049"/>
</return>
<msg time="2026-04-17T03:30:15.898601" 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-04-17T03:30:15.897502" elapsed="0.001133"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:15.898848" elapsed="0.000615"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:30:15.896571" elapsed="0.002938"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:30:15.884176" elapsed="0.015369"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:30:15.899597" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:30:15.899765" level="INFO">${mapping_to_use} = {'IP': '10.30.171.238', '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-04-17T03:30:15.882798" elapsed="0.016994"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:15.882337" elapsed="0.017489"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:15.900041" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:15.899862" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:15.882302" elapsed="0.017818"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:15.901089" 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-04-17T03:30:15.900279" elapsed="0.000840"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:30:15.901168" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:30:15.878021" elapsed="0.023275"/>
</kw>
<msg time="2026-04-17T03:30:15.901379" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:15.865187" elapsed="0.036274"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:30:15.914716" 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/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-04-17T03:30:15.928277" elapsed="0.000166"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:30:15.941372" elapsed="0.000039"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:15.941686" 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-04-17T03:30:15.941950" 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-04-17T03:30:15.942522" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:15.942321" elapsed="0.000261"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:15.942289" elapsed="0.000330"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:15.942804" 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-04-17T03:30:15.942997" 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-04-17T03:30:15.943168" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:30:15.942210" elapsed="0.001010"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:30:15.942058" elapsed="0.001194"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:15.943430" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:15.943523" elapsed="0.000022"/>
</return>
<msg time="2026-04-17T03:30:15.943754" 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-04-17T03:30:15.860685" elapsed="0.083104"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:15.945386" 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.238</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:15.944963" elapsed="0.000502"/>
</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-04-17T03:30:15.951204" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:30:16.153190" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:30:16.556907" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:30:16.560167" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:15.947801" elapsed="0.618081">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:15.945554" elapsed="0.620795">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:16.566900" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:16.566458" elapsed="0.000530"/>
</branch>
<status status="FAIL" start="2026-04-17T03:30:15.945529" elapsed="0.621485">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:30:16.567590" elapsed="0.000031"/>
</kw>
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:16.567682" elapsed="0.000027"/>
</return>
<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-04-17T03:30:15.944141" elapsed="0.623687">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:16.567898" elapsed="0.000015"/>
</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="FAIL" start="2026-04-17T03:30:15.836116" elapsed="0.731902">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="FAIL" start="2026-04-17T03:30:15.764142" elapsed="0.804106">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:30:16.572315" elapsed="0.000315"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:30:16.572035" elapsed="0.000652"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:16.573864" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:16.573724" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:16.573702" 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-04-17T03:30:16.578920" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:16.578806" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:16.578787" elapsed="0.000217"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:16.580072" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:30:16.579637" elapsed="0.000464"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:30:16.580573" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:30:16.580267" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:30:16.580646" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:30:16.580810" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:30:16.579246" elapsed="0.001589"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:16.586369" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:16.586258" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:16.586238" 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-04-17T03:30:16.587758" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:16.587650" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:16.587633" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:16.588335" level="INFO">${karaf_connection_index} = 24</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:30:16.588015" elapsed="0.000347"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:16.588764" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:30:16.588533" elapsed="0.000257"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:30:16.589801" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:30:16.589311" elapsed="0.001256">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:30:16.590761" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:30:16.590807" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:16.588969" elapsed="0.001861"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:30:16.591626" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:30:16.591375" elapsed="0.000936">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:30:16.592498" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:30:16.592543" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:16.591023" elapsed="0.001542"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:30:16.593512" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Deconfigure_App_Peer"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:30:16.592865" elapsed="0.000709">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Deconfigure_App_Peer"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:16.592640" elapsed="0.001006">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Deconfigure_App_Peer"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:30:16.592621" elapsed="0.001059">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Deconfigure_App_Peer"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:16.593848" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:16.594130" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:16.593950" elapsed="0.000245"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:16.593917" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:30:16.594263" elapsed="0.000018"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:30:16.596859" elapsed="0.000186"/>
</kw>
<msg time="2026-04-17T03:30:16.597117" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:16.595796" elapsed="0.001453"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:16.597528" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:16.597867" elapsed="0.000268"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:30:16.595153" 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-04-17T03:30:16.594576" 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="FAIL" start="2026-04-17T03:30:16.587343" elapsed="0.011098">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Deconfigure_App_Peer"</status>
</kw>
<msg time="2026-04-17T03:30:16.598545" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:30:16.598588" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast.Deconfigure_App_Peer"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:16.586600" elapsed="0.012011"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:30:16.598796" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:16.598688" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:16.598670" elapsed="0.000191"/>
</if>
<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-04-17T03:30:16.599755" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:16.599649" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:16.599632" elapsed="0.000189"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:16.600161" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:30:16.600269" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:30:16.600005" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:16.600717" level="INFO">{1: 24}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:16.600451" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:16.601251" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:16.600918" elapsed="0.000375"/>
</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-04-17T03:30:16.601829" elapsed="0.000310"/>
</kw>
<msg time="2026-04-17T03:30:16.602239" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:30:16.602285" level="INFO">${old_connection_index} = 24</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:16.601454" elapsed="0.000853"/>
</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-04-17T03:30:16.603145" elapsed="0.000196"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:30:16.604584" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:30:16.604003" elapsed="0.001568">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:16.603509" elapsed="0.002162"/>
</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-04-17T03:30:16.606346" elapsed="0.000279"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:16.605847" elapsed="0.000860"/>
</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-04-17T03:30:16.602607" elapsed="0.004145"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:16.602381" elapsed="0.004420"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:16.602363" elapsed="0.004467"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:16.607698" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:30:16.607388" elapsed="0.000336"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:30:16.607772" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:30:16.607940" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:30:16.607059" elapsed="0.000908"/>
</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-04-17T03:30:16.608132" elapsed="0.000451"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:16.608873" level="INFO">index=25
host=10.30.170.120
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-04-17T03:30:16.609000" level="INFO">${karaf_connection_object} = index=25
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:30:16.608764" elapsed="0.000263"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:16.609181" elapsed="0.002290"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:30:16.611901" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:30:16.613176" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:30:16.611640" elapsed="0.001935">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:30:16.628025" elapsed="0.000420"/>
</kw>
<msg time="2026-04-17T03:30:16.628562" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:16.626423" elapsed="0.002312"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:16.629005" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:16.629174" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:30:16.614468" elapsed="0.014792"/>
</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-04-17T03:30:16.613891" elapsed="0.015417"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:30:16.599353" elapsed="0.030054">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:16.629855" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:30:16.630242" elapsed="0.000030"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:30:16.585870" elapsed="0.044507">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:30:16.630506" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:30:16.630550" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:16.581251" elapsed="0.049324"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:16.630960" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:16.630670" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:16.630646" elapsed="0.000396"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:30:16.581101" elapsed="0.049967"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:30:16.580896" elapsed="0.050213"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:30:16.578438" elapsed="0.052738"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:30:16.573379" elapsed="0.057859"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:16.572861" elapsed="0.058428"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:30:16.569263" elapsed="0.062085"/>
</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-04-17T03:30:16.677848" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/l3vpn_mcast/app_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:16.677148" elapsed="0.000753"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:16.679024" 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-04-17T03:30:16.678592" elapsed="0.000554">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-04-17T03:30:16.679273" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:16.678170" elapsed="0.001134"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:16.679907" 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-04-17T03:30:16.679500" elapsed="0.000454"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:16.680299" 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-04-17T03:30:16.680560" 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-04-17T03:30:16.680126" elapsed="0.000464"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:16.681180" 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-04-17T03:30:16.680890" elapsed="0.000338"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:16.682582" level="INFO">mapping: {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:16.682312" elapsed="0.000315"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:16.683096" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:30:16.682796" elapsed="0.000326"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:16.683820" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:16.683516" elapsed="0.000330"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:16.684669" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:16.684410" elapsed="0.000285"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:16.684751" elapsed="0.000047"/>
</return>
<msg time="2026-04-17T03:30:16.684946" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:16.684064" 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-04-17T03:30:16.685142" elapsed="0.000262"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:30:16.683372" elapsed="0.002072"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:16.686022" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:16.685697" elapsed="0.000350"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:16.687073" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:16.686608" elapsed="0.000491"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:16.687151" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:30:16.687310" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:16.686276" elapsed="0.001058"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:16.687487" elapsed="0.000232"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:30:16.685562" elapsed="0.002198"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:30:16.683183" elapsed="0.004613"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:30:16.687843" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:30:16.688033" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:30:16.681844" elapsed="0.006214"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:16.681331" elapsed="0.006760"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:16.688288" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:16.688123" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:16.681297" elapsed="0.007065"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:16.689220" 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-04-17T03:30:16.688516" elapsed="0.000733"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:30:16.689298" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:30:16.676004" elapsed="0.013419"/>
</kw>
<msg time="2026-04-17T03:30:16.689486" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:16.661334" elapsed="0.028207"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:30:16.702136" elapsed="0.000099"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:30:16.715864" elapsed="0.000148"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:30:16.729743" elapsed="0.000093"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:16.730248" 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-04-17T03:30:16.730470" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:16.731020" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:16.730836" elapsed="0.000241"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:16.730813" 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-04-17T03:30:16.731256" 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-04-17T03:30:16.731425" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:16.731592" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:30:16.730759" elapsed="0.000884"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:30:16.730573" elapsed="0.001100"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:16.731824" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:16.731911" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:30:16.732174" 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-04-17T03:30:16.656670" elapsed="0.075538"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:16.733725" 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.120</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:16.733346" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:30:16.739371" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:30:16.941359" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:30:17.344790" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:30:17.349535" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:16.736083" elapsed="0.616885">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:16.733855" elapsed="0.619303">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:17.353734" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:17.353241" elapsed="0.000588"/>
</branch>
<status status="FAIL" start="2026-04-17T03:30:16.733837" elapsed="0.620023">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:30:17.358377" elapsed="0.000038"/>
</kw>
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:17.358483" elapsed="0.000029"/>
</return>
<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-04-17T03:30:16.732616" elapsed="0.626015">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:17.358697" elapsed="0.000016"/>
</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="FAIL" start="2026-04-17T03:30:16.631604" elapsed="0.727186">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Revert the BGP configuration to the original state: without application peer</doc>
<status status="FAIL" start="2026-04-17T03:30:16.568639" elapsed="0.790400">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:30:17.360088" elapsed="0.000703"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-17T03:30:17.361077" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-17T03:30:17.360973" elapsed="0.000265"/>
</kw>
<doc>Suite teardown keyword</doc>
<status status="PASS" start="2026-04-17T03:30:17.359753" elapsed="0.001541"/>
</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="FAIL" start="2026-04-17T03:29:46.933008" elapsed="30.428316"/>
</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-04-17T03:30:17.460778" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:30:17.454186" elapsed="0.006701"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-17T03:30:17.453784" elapsed="0.007244"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-17T03:30:17.467034" 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-04-17T03:30:17.462507" elapsed="0.004761"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-17T03:30:17.467574" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:17.467403" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:17.467368" elapsed="0.000301"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:17.468411" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:30:17.467917" elapsed="0.000546"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-17T03:30:17.469015" 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-04-17T03:30:17.468640" elapsed="0.000404"/>
</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-04-17T03:30:17.469604" elapsed="0.000347"/>
</kw>
<msg time="2026-04-17T03:30:17.470059" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:30:17.470110" level="INFO">${possibly_int_of_members} = 1</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:17.469226" elapsed="0.000908"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:17.470761" 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-04-17T03:30:17.470369" elapsed="0.000420"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:30:17.471923" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:30:17.471629" elapsed="0.000344"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:30:17.472399" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:30:17.472129" elapsed="0.000297"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:17.472990" 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-04-17T03:30:17.472592" elapsed="0.000430"/>
</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-04-17T03:30:17.476481" elapsed="0.000272"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:17.477278" level="INFO">${member_ip} = 10.30.170.120</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:17.476923" elapsed="0.000381"/>
</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-04-17T03:30:17.477463" elapsed="0.000242"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:17.478641" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:17.478232" elapsed="0.000443"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-17T03:30:17.478727" elapsed="0.000068"/>
</return>
<msg time="2026-04-17T03:30:17.478948" 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-04-17T03:30:17.477910" elapsed="0.001066"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:30:17.480029" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.120:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a4416510bd0&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-04-17T03:30:17.479208" elapsed="0.001061"/>
</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-04-17T03:30:17.480447" elapsed="0.000218"/>
</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-04-17T03:30:17.475871" elapsed="0.004883"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:30:17.475652" elapsed="0.005153"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-04-17T03:30:17.473090" elapsed="0.007754"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:17.481471" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:30:17.481043" elapsed="0.000474"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:17.482150" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.120'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:30:17.481684" elapsed="0.000513"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:17.482839" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:30:17.482402" elapsed="0.000487"/>
</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-04-17T03:30:17.471137" elapsed="0.011950"/>
</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-04-17T03:30:17.462075" elapsed="0.021076"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:17.483371" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:17.483232" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:17.483209" elapsed="0.000236"/>
</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-04-17T03:30:17.487079" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:30:17.486597" elapsed="0.000509"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:30:17.487575" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:30:17.487273" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:30:17.487648" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:30:17.487816" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:30:17.486199" elapsed="0.001647"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:17.489003" level="INFO">${member_ip} = 10.30.170.120</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-04-17T03:30:17.488690" elapsed="0.000341"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:17.489895" 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-04-17T03:30:17.490022" 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-04-17T03:30:17.489647" elapsed="0.000402"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:17.493953" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:17.493275" elapsed="0.000773"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:17.493252" elapsed="0.000839"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:17.494787" 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-04-17T03:30:17.495064" 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-04-17T03:30:17.494306" elapsed="0.000812"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:17.496119" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.120" 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-04-17T03:30:17.495400" elapsed="0.000844"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:17.497563" 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-04-17T03:30:17.496530" elapsed="0.001088"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-17T03:30:17.499854" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:30:17.500073" 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-04-17T03:30:17.499173" elapsed="0.000951"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:17.500523" elapsed="0.000665"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:30:17.502454" level="INFO">Logging into '10.30.170.120:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:30:17.932796" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 17 03:29:47 UTC 2026

  System load:  0.0                Processes:             121
  Usage of /:   10.4% of 77.35GB   Users logged in:       0
  Memory usage: 2%                 IPv4 address for ens3: 10.30.170.120
  Swap usage:   0%                 IPv6 address for ens3: 2607:f0d0:1002:11::2


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:29:47 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:30:17.502082" elapsed="0.431071"/>
</kw>
<msg time="2026-04-17T03:30:17.933249" 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-04-17T03:30:17.501583" elapsed="0.431852"/>
</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-04-17T03:30:17.498124" elapsed="0.435477"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:30:17.934749" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-17T03:30:17.948187" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-17T03:30:17.948662" level="INFO">${stdout} = </msg>
<msg time="2026-04-17T03:30:17.948869" 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-04-17T03:30:17.934087" elapsed="0.014919"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:30:17.949736" elapsed="0.001143"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:17.953290" 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-04-17T03:30:17.952139" elapsed="0.001355"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-17T03:30:17.954356" elapsed="0.000177"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:17.953817" elapsed="0.000880"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:17.953766" elapsed="0.001012"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:30:17.955287" elapsed="0.000099"/>
</return>
<status status="PASS" start="2026-04-17T03:30:17.954956" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:17.954909" elapsed="0.000648"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-17T03:30:17.955642" elapsed="0.000023"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:17.959723" elapsed="0.000549"/>
</kw>
<kw name="Open 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-04-17T03:30:17.960670" elapsed="0.000403"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:30:17.961374" elapsed="0.000233"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:30:17.956371" elapsed="0.005309"/>
</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-04-17T03:30:17.492168" elapsed="0.469697"/>
</kw>
<msg time="2026-04-17T03:30:17.962041" 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-04-17T03:30:17.491347" elapsed="0.470763"/>
</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-04-17T03:30:17.490792" elapsed="0.471403"/>
</kw>
<msg time="2026-04-17T03:30:17.962238" 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-04-17T03:30:17.490216" elapsed="0.472070"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:17.965286" elapsed="0.000431"/>
</kw>
<kw name="Open 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-04-17T03:30:17.966025" elapsed="0.000203"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:30:17.966472" elapsed="0.000141"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:30:17.962624" elapsed="0.004059"/>
</kw>
<msg time="2026-04-17T03:30:17.966816" 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-04-17T03:30:17.489261" elapsed="0.477591"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:17.967415" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:17.967149" elapsed="0.000309"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-17T03:30:17.967507" elapsed="0.000033"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-17T03:30:17.488291" elapsed="0.479349"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:30:17.488073" elapsed="0.479684"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:30:17.487907" elapsed="0.479893"/>
</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-04-17T03:30:17.483693" elapsed="0.484172"/>
</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-04-17T03:30:17.968065" elapsed="0.000226"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:17.985980" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:17.985812" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:17.985783" elapsed="0.000288"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:17.986507" 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-04-17T03:30:17.986632" 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-04-17T03:30:17.986291" elapsed="0.000368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:17.987162" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:17.986829" elapsed="0.000380"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:17.987620" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:17.987370" elapsed="0.000295"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:17.988538" 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-04-17T03:30:17.988291" elapsed="0.000362">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-17T03:30:17.988765" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:30:17.988812" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:17.987836" elapsed="0.001000"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:17.989173" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:17.988918" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:17.988899" elapsed="0.000377"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:17.990122" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:30:17.989817" elapsed="0.000332"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:30:17.990199" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:30:17.990362" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:30:17.989504" elapsed="0.000883"/>
</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-04-17T03:30:17.990605" elapsed="0.000473"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:17.991372" level="INFO">index=4
host=10.30.170.120
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-04-17T03:30:17.991478" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.120
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-04-17T03:30:17.991256" elapsed="0.000249"/>
</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-04-17T03:30:17.991656" elapsed="0.002237"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:30:17.994355" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:30:17.995610" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:30:17.994082" elapsed="0.002035">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:17.999688" elapsed="0.000411"/>
</kw>
<kw name="Open 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-04-17T03:30:18.000274" elapsed="0.000167"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:30:18.000595" elapsed="0.000104"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:30:17.997131" elapsed="0.003624"/>
</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-04-17T03:30:17.996479" elapsed="0.004401"/>
</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="FAIL" start="2026-04-17T03:30:17.985367" elapsed="0.015634">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:30:19.017988" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:19.017790" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:19.017755" elapsed="0.000339"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:19.018502" 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-04-17T03:30:19.018626" 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-04-17T03:30:19.018315" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:19.019233" 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-04-17T03:30:19.018883" elapsed="0.000401"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:19.019694" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:19.019445" elapsed="0.000294"/>
</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-04-17T03:30:19.020364" elapsed="0.000218"/>
</kw>
<msg time="2026-04-17T03:30:19.020687" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:30:19.020736" level="INFO">${old_connection_index} = 4</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:19.019908" elapsed="0.000851"/>
</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-04-17T03:30:19.021616" elapsed="0.000142"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:30:19.022466" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:30:19.022285" elapsed="0.000846">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:19.021946" elapsed="0.001251"/>
</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-04-17T03:30:19.023710" elapsed="0.000101"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:19.023374" elapsed="0.000483"/>
</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-04-17T03:30:19.021090" elapsed="0.002812"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:19.020837" elapsed="0.003134"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:19.020818" elapsed="0.003191"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:19.024869" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:30:19.024582" elapsed="0.000314"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:30:19.024973" elapsed="0.000045"/>
</return>
<msg time="2026-04-17T03:30:19.025181" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:30:19.024277" elapsed="0.000936"/>
</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-04-17T03:30:19.025427" elapsed="0.000540"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:19.026273" level="INFO">index=6
host=10.30.170.120
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-04-17T03:30:19.026377" level="INFO">${karaf_connection_object} = index=6
host=10.30.170.120
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-04-17T03:30:19.026151" elapsed="0.000253"/>
</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-04-17T03:30:19.026556" elapsed="0.003203"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:30:19.030406" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:30:19.031655" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:30:19.030058" elapsed="0.002135">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:19.035620" elapsed="0.000386"/>
</kw>
<kw name="Open 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-04-17T03:30:19.036178" elapsed="0.000164"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:30:19.036495" elapsed="0.000103"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:30:19.033303" elapsed="0.003348"/>
</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-04-17T03:30:19.032545" elapsed="0.004158"/>
</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="FAIL" start="2026-04-17T03:30:19.017307" elapsed="0.019512">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:30:20.057990" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:20.057830" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:20.057803" elapsed="0.000292"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:20.058541" 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-04-17T03:30:20.058691" 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-04-17T03:30:20.058343" elapsed="0.000381"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:20.059404" level="INFO">{1: 6}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:20.058911" elapsed="0.000553"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:20.059922" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:20.059651" elapsed="0.000336"/>
</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-04-17T03:30:20.060596" elapsed="0.000211"/>
</kw>
<msg time="2026-04-17T03:30:20.060911" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:30:20.060975" level="INFO">${old_connection_index} = 6</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:20.060161" elapsed="0.000838"/>
</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-04-17T03:30:20.061872" elapsed="0.000168"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:30:20.062741" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:30:20.062549" elapsed="0.000903">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:20.062213" elapsed="0.001310"/>
</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-04-17T03:30:20.064094" elapsed="0.000103"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:20.063720" elapsed="0.000523"/>
</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-04-17T03:30:20.061331" elapsed="0.002955"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:20.061078" elapsed="0.003258"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:20.061059" elapsed="0.003303"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:20.065234" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:30:20.064952" elapsed="0.000310"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:30:20.065312" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:30:20.065477" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:30:20.064592" elapsed="0.000909"/>
</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-04-17T03:30:20.065697" elapsed="0.000507"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:20.066570" level="INFO">index=8
host=10.30.170.120
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-04-17T03:30:20.066698" level="INFO">${karaf_connection_object} = index=8
host=10.30.170.120
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-04-17T03:30:20.066453" elapsed="0.000276"/>
</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-04-17T03:30:20.066885" elapsed="0.003208"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:30:20.070844" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:30:20.072248" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:30:20.070347" elapsed="0.002318">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:20.076388" 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-04-17T03:30:20.076990" elapsed="0.000176"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:30:20.077321" elapsed="0.000104"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:30:20.073811" elapsed="0.003669"/>
</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-04-17T03:30:20.073047" elapsed="0.004479"/>
</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="FAIL" start="2026-04-17T03:30:20.057378" elapsed="0.020259">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:30:21.095416" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:21.095222" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:21.095195" elapsed="0.000312"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:21.095947" 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-04-17T03:30:21.096074" 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-04-17T03:30:21.095729" elapsed="0.000372"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:21.096580" level="INFO">{1: 8}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:21.096269" elapsed="0.000357"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:21.097091" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:21.096818" elapsed="0.000318"/>
</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-04-17T03:30:21.097784" elapsed="0.000216"/>
</kw>
<msg time="2026-04-17T03:30:21.098104" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:30:21.098150" level="INFO">${old_connection_index} = 8</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:21.097334" elapsed="0.000838"/>
</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-04-17T03:30:21.099176" elapsed="0.000207"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:30:21.100113" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:30:21.099912" elapsed="0.000760">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:21.099564" elapsed="0.001172"/>
</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-04-17T03:30:21.101260" elapsed="0.000102"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:21.100909" elapsed="0.000499"/>
</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-04-17T03:30:21.098517" elapsed="0.002935"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:21.098248" elapsed="0.003254"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:21.098230" elapsed="0.003374"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:21.102450" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:30:21.102155" elapsed="0.000322"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:30:21.102537" elapsed="0.000050"/>
</return>
<msg time="2026-04-17T03:30:21.102727" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:30:21.101836" elapsed="0.000916"/>
</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-04-17T03:30:21.102912" elapsed="0.000541"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:21.103741" level="INFO">index=10
host=10.30.170.120
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-04-17T03:30:21.103844" level="INFO">${karaf_connection_object} = index=10
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:30:21.103630" elapsed="0.000240"/>
</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-04-17T03:30:21.104039" elapsed="0.002665"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:30:21.107399" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:30:21.108714" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:30:21.106962" elapsed="0.002418">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:21.113425" elapsed="0.000377"/>
</kw>
<kw name="Open 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-04-17T03:30:21.113996" elapsed="0.000155"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:30:21.114301" elapsed="0.000098"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:30:21.110652" elapsed="0.003799"/>
</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-04-17T03:30:21.109838" elapsed="0.004658"/>
</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="FAIL" start="2026-04-17T03:30:21.094771" elapsed="0.019808">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:30:21.114673" level="FAIL">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<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="FAIL" start="2026-04-17T03:30:17.969067" elapsed="3.145701">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:17.968663" elapsed="3.146173"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:30:17.968513" elapsed="3.146366"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-04-17T03:30:17.968353" elapsed="3.146564"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-17T03:30:17.461510" elapsed="3.653489"/>
</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-04-17T03:30:21.117773" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:21.117652" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:21.117629" elapsed="0.000217"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:21.123133" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:21.122971" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:21.122917" elapsed="0.000311"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:21.124906" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:30:21.124191" elapsed="0.000778"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:30:21.125639" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:30:21.125206" elapsed="0.000469"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:30:21.125830" elapsed="0.000053"/>
</return>
<msg time="2026-04-17T03:30:21.126090" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:30:21.123638" elapsed="0.002486"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:21.132598" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:21.132474" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:21.132453" elapsed="0.000218"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:21.134179" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:21.134041" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:21.134021" elapsed="0.000229"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:21.134833" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:30:21.134406" elapsed="0.000462"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:21.135438" 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-04-17T03:30:21.135101" elapsed="0.000370"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:30:21.136891" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:30:21.136338" elapsed="0.001512">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:30:21.138048" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:30:21.138104" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:21.135687" elapsed="0.002446"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:30:21.139599" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:30:21.139042" elapsed="0.001542">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:30:21.140751" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:30:21.140807" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:21.138362" elapsed="0.002473"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:30:21.142104" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/080_bgp_functional_rt_constrain.robot"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:30:21.141292" elapsed="0.000916">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/080_bgp_functional_rt_constrain.robot"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:21.140956" elapsed="0.001434">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/080_bgp_functional_rt_constrain.robot"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:30:21.140909" elapsed="0.001534">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/080_bgp_functional_rt_constrain.robot"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:21.142684" elapsed="0.000031"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:21.143031" elapsed="0.000069"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:21.142801" elapsed="0.000420"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:21.142779" elapsed="0.000476"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:30:21.143348" 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">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:21.145768" elapsed="0.000482"/>
</kw>
<kw name="Open 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-04-17T03:30:21.146613" elapsed="0.000498"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:30:21.147480" elapsed="0.000245"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:30:21.144951" elapsed="0.002886"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:30:21.143758" elapsed="0.004262"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:30:21.133660" elapsed="0.014456">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/080_bgp_functional_rt_constrain.robot"</status>
</kw>
<msg time="2026-04-17T03:30:21.148298" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:30:21.148349" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/080_bgp_functional_rt_constrain.robot"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:21.132845" elapsed="0.015530"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:30:21.148576" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:21.148460" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:21.148439" elapsed="0.000205"/>
</if>
<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-04-17T03:30:21.149649" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:21.149495" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:21.149471" elapsed="0.000268"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:21.151783" 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-04-17T03:30:21.151958" 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-04-17T03:30:21.149905" elapsed="0.002088"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:21.152471" level="INFO">{1: 10}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:21.152164" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:21.152960" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:21.152676" elapsed="0.000348"/>
</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-04-17T03:30:21.153654" elapsed="0.000330"/>
</kw>
<msg time="2026-04-17T03:30:21.154087" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:30:21.154134" level="INFO">${old_connection_index} = 10</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:21.153212" elapsed="0.000945"/>
</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-04-17T03:30:21.155859" elapsed="0.000373"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:30:21.157644" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:30:21.157360" elapsed="0.000828">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:21.156534" elapsed="0.001748"/>
</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-04-17T03:30:21.159587" elapsed="0.000227"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:21.158534" elapsed="0.001356"/>
</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-04-17T03:30:21.154556" elapsed="0.005450"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:21.154237" elapsed="0.005822"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:21.154216" elapsed="0.005872"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:21.161115" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:30:21.160628" elapsed="0.000515"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:30:21.161195" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:30:21.161362" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:30:21.160325" elapsed="0.001062"/>
</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-04-17T03:30:21.161548" elapsed="0.000452"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:21.162290" level="INFO">index=13
host=10.30.170.120
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-04-17T03:30:21.162394" level="INFO">${karaf_connection_object} = index=13
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:30:21.162177" elapsed="0.000244"/>
</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-04-17T03:30:21.162575" elapsed="0.002399"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:30:21.165621" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:30:21.166731" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:30:21.165275" elapsed="0.002112">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:21.170896" elapsed="0.000771"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-17T03:30:21.172032" elapsed="0.000554"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:30:21.172887" elapsed="0.000267"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:30:21.168318" elapsed="0.004955"/>
</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-04-17T03:30:21.167721" elapsed="0.005623"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:30:21.149154" elapsed="0.024314">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:21.174026" elapsed="0.000039"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:30:21.174136" elapsed="0.000031"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:30:21.132146" elapsed="0.042157">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:30:21.174465" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:30:21.174532" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:21.126691" elapsed="0.047878"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:21.175083" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:21.174688" elapsed="0.000470"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:21.174658" elapsed="0.000535"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:30:21.126486" elapsed="0.048740"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:30:21.126203" elapsed="0.049067"/>
</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-04-17T03:30:21.122494" elapsed="0.052894"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-17T03:30:21.115667" elapsed="0.059803"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:21.115163" elapsed="0.060367"/>
</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-04-17T03:30:17.453375" elapsed="3.722226"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:21.176333" level="INFO">${mininet_conn_id} = 15</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-04-17T03:30:21.175816" elapsed="0.000553"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:21.177160" level="INFO">${mininet_conn_id} = 15</msg>
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:30:21.176611" elapsed="0.000610"/>
</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-04-17T03:30:21.179688" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:30:21.179791" 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-04-17T03:30:21.179264" 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>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:21.180035" elapsed="0.000461"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:30:21.181739" level="INFO">Logging into '10.30.171.238:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:30:21.586315" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 17 03:29:51 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:29:51 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:30:21.181292" elapsed="0.405356"/>
</kw>
<msg time="2026-04-17T03:30:21.586757" 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-04-17T03:30:21.180739" elapsed="0.406119"/>
</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-04-17T03:30:21.178611" elapsed="0.408417"/>
</kw>
<msg time="2026-04-17T03:30:21.587106" 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-04-17T03:30:21.178055" elapsed="0.409120"/>
</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-04-17T03:30:21.177510" elapsed="0.409779"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:30:21.588240" level="INFO">Creating Session using : alias=config-session, url=http://10.30.170.120:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a4416460a50&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-04-17T03:30:21.587675" elapsed="0.000811"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-04-17T03:30:21.599086" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-04-17T03:30:21.610005" 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-04-17T03:30:21.588753" elapsed="0.021407"/>
</kw>
<kw name="Assure_Library_Ipaddr" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:30:21.612902" level="INFO">Executing command 'bash -c 'cd "." &amp;&amp; python -c "import ipaddr"''.</msg>
<msg time="2026-04-17T03:30:21.646240" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:30:21.646533" level="INFO">${stdout} = </msg>
<msg time="2026-04-17T03:30:21.646600" level="INFO">${stderr} = </msg>
<msg time="2026-04-17T03:30:21.646661" 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-04-17T03:30:21.612639" elapsed="0.034059"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:30:21.648196" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-04-17T03:30:21.647752" elapsed="0.000510"/>
</kw>
<msg time="2026-04-17T03:30:21.648398" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-04-17T03:30:21.648463" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:21.647115" elapsed="0.001380"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:21.649387" 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-04-17T03:30:21.648743" elapsed="0.000681"/>
</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-04-17T03:30:21.650115" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:21.649549" elapsed="0.000677"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:21.649514" elapsed="0.000777"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-04-17T03:30:21.650601" elapsed="0.000071"/>
</return>
<status status="PASS" start="2026-04-17T03:30:21.650406" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:21.650374" elapsed="0.000403"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-04-17T03:30:21.650912" elapsed="0.000043"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:21.650862" elapsed="0.000161"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:21.650840" elapsed="0.000217"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:21.651271" elapsed="0.000032"/>
</kw>
<msg time="2026-04-17T03:30:21.651557" 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-04-17T03:30:21.612090" elapsed="0.039504"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-04-17T03:30:21.651875" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-17T03:30:21.651738" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:21.651708" elapsed="0.000326"/>
</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-04-17T03:30:21.652265" elapsed="0.000031"/>
</kw>
<arg>target_dir=.</arg>
<doc>Tests whether ipaddr module is present on ssh-connected machine, Puts ipaddr.py to target_dir if not.</doc>
<status status="PASS" start="2026-04-17T03:30:21.610755" elapsed="0.041631"/>
</kw>
<doc>Initialize SetupUtils. Suite setup keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:17.452685" elapsed="4.199778"/>
</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-04-17T03:30:21.658066" elapsed="0.000525"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:30:21.657508" elapsed="0.001320"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:21.660659" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:21.660517" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:21.660493" elapsed="0.000243"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:21.665842" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:21.665724" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:21.665704" elapsed="0.000210"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:21.667001" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:30:21.666571" elapsed="0.000460"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:30:21.667739" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:30:21.667199" elapsed="0.000576"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:30:21.667836" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:30:21.668030" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:30:21.666182" elapsed="0.001874"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:21.674188" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:21.674067" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:21.674045" elapsed="0.000214"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:21.675691" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:21.675559" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:21.675540" elapsed="0.000246"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:21.676368" level="INFO">${karaf_connection_index} = 13</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:30:21.675977" elapsed="0.000421"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:21.676795" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:30:21.676568" elapsed="0.000254"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:30:21.677686" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:30:21.677395" elapsed="0.001003">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:30:21.678619" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:30:21.678666" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:21.677004" elapsed="0.001685"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:30:21.679582" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:30:21.679253" elapsed="0.001095">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:30:21.680541" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:30:21.680614" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:21.678862" elapsed="0.001781"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:30:21.681707" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Configure_App_Peer"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:30:21.681059" elapsed="0.000712">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Configure_App_Peer"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:21.680737" elapsed="0.001107">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Configure_App_Peer"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:30:21.680715" elapsed="0.001163">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Configure_App_Peer"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:21.682063" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:21.682297" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:21.682152" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:21.682135" elapsed="0.000242"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:30:21.682496" elapsed="0.000020"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:30:21.685279" elapsed="0.000152"/>
</kw>
<msg time="2026-04-17T03:30:21.685506" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:21.684138" elapsed="0.001503"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:21.685923" elapsed="0.000101"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:21.686288" 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-04-17T03:30:21.683463" elapsed="0.003050"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:30:21.682845" elapsed="0.003741"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:30:21.675215" elapsed="0.011462">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Configure_App_Peer"</status>
</kw>
<msg time="2026-04-17T03:30:21.686788" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:30:21.686834" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Configure_App_Peer"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:21.674458" elapsed="0.012420"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:30:21.687173" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:21.687028" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:21.687000" elapsed="0.000270"/>
</if>
<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-04-17T03:30:21.689240" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:21.688897" elapsed="0.000423"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:21.688864" elapsed="0.000487"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:21.689785" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:30:21.689968" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:30:21.689597" elapsed="0.000412"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:21.690623" level="INFO">{1: 13}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:21.690237" elapsed="0.000447"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:21.691276" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:21.690903" elapsed="0.000434"/>
</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-04-17T03:30:21.692157" elapsed="0.000413"/>
</kw>
<msg time="2026-04-17T03:30:21.692741" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:30:21.692807" level="INFO">${old_connection_index} = 13</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:21.691590" elapsed="0.001260"/>
</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-04-17T03:30:21.694277" elapsed="0.000293"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:30:21.696378" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:30:21.695640" elapsed="0.002022">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:21.694811" elapsed="0.003000"/>
</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-04-17T03:30:21.698799" elapsed="0.000404"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:21.698110" elapsed="0.001214"/>
</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-04-17T03:30:21.693519" elapsed="0.005871"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:21.693149" elapsed="0.006355"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:21.693110" elapsed="0.006435"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:21.700805" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:30:21.700389" elapsed="0.000452"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:30:21.701017" elapsed="0.000054"/>
</return>
<msg time="2026-04-17T03:30:21.701235" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:30:21.699871" elapsed="0.001398"/>
</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-04-17T03:30:21.701485" elapsed="0.000586"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:21.702438" level="INFO">index=16
host=10.30.170.120
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-04-17T03:30:21.702554" level="INFO">${karaf_connection_object} = index=16
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:30:21.702305" elapsed="0.000277"/>
</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-04-17T03:30:21.702770" elapsed="0.002868"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:30:21.706167" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:30:21.707514" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:30:21.705842" elapsed="0.002339">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:30:21.727306" elapsed="0.000535"/>
</kw>
<msg time="2026-04-17T03:30:21.728006" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:21.725123" elapsed="0.003062"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:21.728397" elapsed="0.000034"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:21.728608" elapsed="0.000024"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:30:21.709424" elapsed="0.019289"/>
</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-04-17T03:30:21.708660" elapsed="0.020107"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:30:21.688050" elapsed="0.040818">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:21.729339" elapsed="0.000034"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:30:21.729433" 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="FAIL" start="2026-04-17T03:30:21.673685" elapsed="0.055880">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:30:21.729697" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:30:21.729747" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:21.668630" elapsed="0.061144"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:21.730252" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:21.729868" elapsed="0.000450"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:21.729843" elapsed="0.000501"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:30:21.668472" elapsed="0.061899"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:30:21.668120" elapsed="0.062288"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:30:21.665331" elapsed="0.065147"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:30:21.660142" elapsed="0.070400"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:21.659198" elapsed="0.071398"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:30:21.653517" elapsed="0.077139"/>
</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-04-17T03:30:21.767010" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:21.766538" elapsed="0.000507"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:21.767904" 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-04-17T03:30:21.767638" elapsed="0.000368">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-04-17T03:30:21.768103" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:21.767228" elapsed="0.000899"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:21.768970" 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-04-17T03:30:21.768501" elapsed="0.000497"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:21.769309" 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-04-17T03:30:21.769499" 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-04-17T03:30:21.769164" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:21.769958" 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-04-17T03:30:21.769685" elapsed="0.000322"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:21.771105" level="INFO">mapping: {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:21.770825" elapsed="0.000324"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:21.771885" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:30:21.771309" elapsed="0.000603"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:21.772617" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:21.772310" elapsed="0.000333"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:21.773434" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:21.773186" elapsed="0.000292"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:21.773549" elapsed="0.000049"/>
</return>
<msg time="2026-04-17T03:30:21.773738" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:21.772842" 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-04-17T03:30:21.773922" elapsed="0.000298"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:30:21.772167" elapsed="0.002108"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:21.775016" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:21.774597" elapsed="0.000451"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:21.775956" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:21.775709" elapsed="0.000277"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:21.776038" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:30:21.776222" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:21.775291" 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-04-17T03:30:21.776404" elapsed="0.000270"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:30:21.774417" elapsed="0.002301"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:30:21.771983" elapsed="0.004790"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:30:21.776833" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:30:21.777028" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:30:21.770482" elapsed="0.006572"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:21.770090" elapsed="0.007061"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:21.777348" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:21.777184" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:21.770065" elapsed="0.007362"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:21.778257" 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-04-17T03:30:21.777576" elapsed="0.000711"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:30:21.778336" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/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-04-17T03:30:21.765742" elapsed="0.012724"/>
</kw>
<msg time="2026-04-17T03:30:21.778526" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:21.751869" elapsed="0.026710"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:30:21.791554" elapsed="0.000056"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:30:21.804599" elapsed="0.000048"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:30:21.817435" elapsed="0.000050"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:21.817722" 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-04-17T03:30:21.817911" elapsed="0.000050"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:21.818402" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:21.818245" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:21.818227" 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-04-17T03:30:21.818633" 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-04-17T03:30:21.818800" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:21.818988" elapsed="0.000030"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:30:21.818185" elapsed="0.000879"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:30:21.818047" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:21.819256" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:21.819336" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:30:21.819599" 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-04-17T03:30:21.747255" elapsed="0.072373"/>
</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-04-17T03:30:21.849883" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:21.849431" elapsed="0.000486"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:21.850753" 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-04-17T03:30:21.850473" elapsed="0.000381">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-04-17T03:30:21.850999" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:21.850116" elapsed="0.000918"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:21.851735" 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-04-17T03:30:21.851218" elapsed="0.000548"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:21.852133" 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-04-17T03:30:21.852311" 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-04-17T03:30:21.851954" elapsed="0.000387"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:21.852765" 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-04-17T03:30:21.852505" 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-04-17T03:30:21.853289" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:21.852896" elapsed="0.000453"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:21.853847" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:21.853529" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:21.853376" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:21.852871" elapsed="0.001078"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:21.854738" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.120&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-04-17T03:30:21.854106" elapsed="0.000662"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:30:21.854822" 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/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-04-17T03:30:21.848581" elapsed="0.006401"/>
</kw>
<msg time="2026-04-17T03:30:21.855039" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:21.833948" elapsed="0.021142"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:30:21.869278" 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/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-04-17T03:30:21.883270" elapsed="0.000048"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:30:21.895957" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:21.896190" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:21.896374" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:21.896779" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:21.896629" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:21.896612" 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-04-17T03:30:21.897024" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:21.897192" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:21.897356" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:30:21.896573" elapsed="0.000835"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:30:21.896456" elapsed="0.000980"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:21.897582" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:21.897660" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:30:21.897813" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.120&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-04-17T03:30:21.830318" elapsed="0.067526"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:21.899441" 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-04-17T03:30:21.899041" elapsed="0.000556">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-04-17T03:30:21.899749" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:21.898591" elapsed="0.001196"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:21.900317" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:21.899895" elapsed="0.000508"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:21.901292" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:21.900789" elapsed="0.000556"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:21.900513" elapsed="0.000904"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:21.899867" elapsed="0.001595"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:21.905519" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:30:21.901735" elapsed="0.003827"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:30:21.905645" elapsed="0.000053"/>
</return>
<msg time="2026-04-17T03:30:21.905895" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:30:21.898206" elapsed="0.007750"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:21.908602" 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.120</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:21.908047" elapsed="0.000628"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:21.909379" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.120&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-04-17T03:30:21.908949" elapsed="0.000501"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:21.910048" 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-04-17T03:30:21.909672" elapsed="0.000438"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:21.910749" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:21.910361" elapsed="0.000473"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:21.912326" 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-04-17T03:30:21.912046" elapsed="0.000314"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:30:21.912785" 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-04-17T03:30:21.912566" elapsed="0.000246"/>
</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-04-17T03:30:21.912984" elapsed="0.000222"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:21.913617" 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-04-17T03:30:21.913365" elapsed="0.000305"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:30:21.913722" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:30:21.913908" 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-04-17T03:30:21.911218" elapsed="0.002733"/>
</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-04-17T03:30:21.919524" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:30:22.121345" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:30:22.543123" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:30:22.545724" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:30:21.916412" elapsed="0.635089">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:21.914037" elapsed="0.637872">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:22.552256" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:22.552004" elapsed="0.000325"/>
</branch>
<status status="FAIL" start="2026-04-17T03:30:21.914016" elapsed="0.638337">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:22.552813" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:22.552969" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:22.552912" elapsed="0.000109"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:22.552894" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:22.553195" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:30:22.553263" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:30:21.906513" elapsed="0.646862">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:22.553453" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:30:21.735913" elapsed="0.817638">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:22.553849" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:22.553661" elapsed="0.000255"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:22.553644" elapsed="0.000311"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:22.553989" elapsed="0.000015"/>
</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="FAIL" start="2026-04-17T03:30:21.731146" elapsed="0.822941">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Configures bgp application peer.</doc>
<status status="FAIL" start="2026-04-17T03:30:21.652551" elapsed="0.901715">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:30:22.557724" elapsed="0.000289"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:30:22.557451" elapsed="0.000619"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:22.559232" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:22.559092" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:22.559073" 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-04-17T03:30:22.564490" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:22.564383" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:22.564364" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:22.565599" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:30:22.565191" elapsed="0.000436"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:30:22.566108" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:30:22.565792" elapsed="0.000342"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:30:22.566178" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:30:22.566337" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:30:22.564787" elapsed="0.001574"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:22.571807" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:22.571692" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:22.571672" 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-04-17T03:30:22.573076" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:22.572958" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:22.572917" elapsed="0.000226"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:22.573598" level="INFO">${karaf_connection_index} = 16</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:30:22.573296" elapsed="0.000328"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:22.574023" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:30:22.573786" elapsed="0.000263"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:30:22.574811" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:30:22.574550" elapsed="0.000896">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:30:22.575633" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:30:22.575696" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:22.574210" elapsed="0.001510"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:30:22.576497" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:30:22.576253" elapsed="0.000912">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:30:22.577349" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:30:22.577394" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:22.575892" elapsed="0.001524"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:30:22.578491" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Reconfigure_ODL_To_Accept_Connection"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:30:22.577711" elapsed="0.000845">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Reconfigure_ODL_To_Accept_Connection"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:22.577489" elapsed="0.001134">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Reconfigure_ODL_To_Accept_Connection"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:30:22.577471" elapsed="0.001185">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Reconfigure_ODL_To_Accept_Connection"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:22.578823" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:22.579070" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:22.578908" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:22.578892" elapsed="0.000254"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:30:22.579179" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:30:22.581812" elapsed="0.000177"/>
</kw>
<msg time="2026-04-17T03:30:22.582056" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:22.580700" elapsed="0.001485"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:22.582459" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:22.582793" 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-04-17T03:30:22.580084" 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-04-17T03:30:22.579459" elapsed="0.003601"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:30:22.572628" elapsed="0.010516">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Reconfigure_ODL_To_Accept_Connection"</status>
</kw>
<msg time="2026-04-17T03:30:22.583251" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:30:22.583295" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Reconfigure_ODL_To_Accept_Connection"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:22.572044" elapsed="0.011274"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:30:22.583503" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:22.583395" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:22.583377" elapsed="0.000192"/>
</if>
<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-04-17T03:30:22.584439" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:22.584330" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:22.584313" elapsed="0.000191"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:22.584786" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:30:22.584892" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:30:22.584661" elapsed="0.000257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:22.585424" level="INFO">{1: 16}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:22.585160" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:22.585863" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:22.585622" elapsed="0.000284"/>
</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-04-17T03:30:22.586450" elapsed="0.000261"/>
</kw>
<msg time="2026-04-17T03:30:22.586810" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:30:22.586855" level="INFO">${old_connection_index} = 16</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:22.586081" elapsed="0.000796"/>
</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-04-17T03:30:22.587744" elapsed="0.000219"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:30:22.589282" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:30:22.588766" elapsed="0.001399">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:22.588135" elapsed="0.002128"/>
</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-04-17T03:30:22.590900" elapsed="0.000295"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:22.590439" elapsed="0.000840"/>
</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-04-17T03:30:22.587188" elapsed="0.004137"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:22.586967" elapsed="0.004407"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:22.586948" elapsed="0.004451"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:22.592291" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:30:22.591981" elapsed="0.000338"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:30:22.592371" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:30:22.592579" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:30:22.591609" elapsed="0.000999"/>
</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-04-17T03:30:22.592802" elapsed="0.000488"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:22.595286" level="INFO">index=17
host=10.30.170.120
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-04-17T03:30:22.595396" level="INFO">${karaf_connection_object} = index=17
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:30:22.593464" elapsed="0.001960"/>
</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-04-17T03:30:22.595582" elapsed="0.002264"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:30:22.598339" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:30:22.599641" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:30:22.598062" elapsed="0.002030">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:30:22.614420" elapsed="0.000408"/>
</kw>
<msg time="2026-04-17T03:30:22.614972" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:22.612836" elapsed="0.002300"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:22.615304" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:22.615471" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:30:22.601115" elapsed="0.014440"/>
</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-04-17T03:30:22.600454" elapsed="0.015149"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:30:22.584015" elapsed="0.031694">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:22.616397" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:30:22.616478" 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="FAIL" start="2026-04-17T03:30:22.571319" elapsed="0.045273">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:30:22.616704" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:30:22.616749" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:22.566740" elapsed="0.050033"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:22.617184" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:22.616857" elapsed="0.000402"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:22.616836" elapsed="0.000455"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:30:22.566594" elapsed="0.050733"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:30:22.566418" elapsed="0.050950"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:30:22.564014" elapsed="0.053430"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:30:22.558715" elapsed="0.058805"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:22.558229" elapsed="0.059351"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:30:22.555108" elapsed="0.062543"/>
</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-04-17T03:30:22.655501" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:22.654790" elapsed="0.000761"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:22.656573" 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-04-17T03:30:22.656300" elapsed="0.000355">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-04-17T03:30:22.656752" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:22.655843" elapsed="0.000935"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:22.657414" 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-04-17T03:30:22.656966" elapsed="0.000477"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:22.657816" 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-04-17T03:30:22.658017" 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-04-17T03:30:22.657621" elapsed="0.000423"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:22.658491" 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-04-17T03:30:22.658210" elapsed="0.000336"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:22.659695" level="INFO">mapping: {'IP': '10.30.171.238', '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-04-17T03:30:22.659367" elapsed="0.000379"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:22.660246" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:30:22.659912" elapsed="0.000366"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:22.660993" level="INFO">${value} = 10.30.171.238</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:22.660668" elapsed="0.000351"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:22.661981" level="INFO">${encoded} = 10.30.171.238</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:22.661674" elapsed="0.000338"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:22.662082" elapsed="0.000050"/>
</return>
<msg time="2026-04-17T03:30:22.662299" level="INFO">${encoded_value} = 10.30.171.238</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:22.661261" 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-04-17T03:30:22.662533" elapsed="0.000267"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.238</var>
<status status="PASS" start="2026-04-17T03:30:22.660525" elapsed="0.002316"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:22.664517" 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-04-17T03:30:22.663111" elapsed="0.001457"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:22.665695" 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-04-17T03:30:22.665407" elapsed="0.000322"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:22.665797" elapsed="0.000048"/>
</return>
<msg time="2026-04-17T03:30:22.666030" 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-04-17T03:30:22.664899" 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-04-17T03:30:22.666276" elapsed="0.000309"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:30:22.662975" elapsed="0.003666"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:22.667395" 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-04-17T03:30:22.666989" elapsed="0.000440"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:22.668445" 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-04-17T03:30:22.668159" elapsed="0.000459"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:22.668692" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:30:22.668902" 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-04-17T03:30:22.667700" 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-04-17T03:30:22.669164" elapsed="0.000303"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:30:22.666786" elapsed="0.002738"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:22.670626" 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-04-17T03:30:22.669881" elapsed="0.000781"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:22.671717" 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-04-17T03:30:22.671386" elapsed="0.000367"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:22.671814" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:30:22.671998" 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-04-17T03:30:22.670947" elapsed="0.001076"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:22.672179" elapsed="0.000226"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:30:22.669683" elapsed="0.002763"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:22.673017" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:22.672693" elapsed="0.000350"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:22.673794" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:22.673579" elapsed="0.000241"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:22.673882" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:30:22.674106" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:22.673231" 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-04-17T03:30:22.674288" elapsed="0.000267"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:30:22.672559" elapsed="0.002050"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:22.675216" 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-04-17T03:30:22.674894" elapsed="0.000347"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:22.676052" 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-04-17T03:30:22.675780" elapsed="0.000298"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:22.676129" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:30:22.676282" 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-04-17T03:30:22.675428" 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-04-17T03:30:22.676462" elapsed="0.000252"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:30:22.674754" elapsed="0.002004"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:30:22.660334" elapsed="0.016460"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:30:22.676839" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:30:22.677023" level="INFO">${mapping_to_use} = {'IP': '10.30.171.238', '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-04-17T03:30:22.659030" elapsed="0.018019"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:22.658632" elapsed="0.018450"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:22.677268" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:22.677111" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:22.658606" elapsed="0.018738"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:22.678293" 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-04-17T03:30:22.677492" elapsed="0.000830"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:30:22.678374" 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/bgp_peer.vanadium/${file_name} exists. If 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-04-17T03:30:22.653774" elapsed="0.024760"/>
</kw>
<msg time="2026-04-17T03:30:22.678667" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:22.638616" elapsed="0.040113"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:30:22.693075" elapsed="0.000047"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name} exists. If 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-04-17T03:30:22.708415" elapsed="0.000074"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:30:22.725167" elapsed="0.000070"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:22.725574" elapsed="0.000035"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:22.725846" 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-04-17T03:30:22.726483" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:22.726263" elapsed="0.000301"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:22.726237" 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-04-17T03:30:22.726820" elapsed="0.000030"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:22.727086" 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-04-17T03:30:22.727329" elapsed="0.000029"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:30:22.726181" elapsed="0.001225"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:30:22.725991" elapsed="0.001455"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:22.727663" elapsed="0.000052"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:22.727817" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:30:22.728079" 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-04-17T03:30:22.633510" elapsed="0.094611"/>
</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-04-17T03:30:22.764693" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:22.764084" elapsed="0.000656"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:22.765762" 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-04-17T03:30:22.765360" elapsed="0.000628">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-04-17T03:30:22.766125" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:22.764965" elapsed="0.001197"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:22.766949" 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-04-17T03:30:22.766399" elapsed="0.000593"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:22.767434" 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-04-17T03:30:22.767674" 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-04-17T03:30:22.767235" elapsed="0.000515"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:22.768332" 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-04-17T03:30:22.767999" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-17T03:30:22.769027" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:22.768507" elapsed="0.000624"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:22.769812" level="INFO">${mapping_to_use} = {'IP': '10.30.171.238', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:22.769391" elapsed="0.000458"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:22.769175" elapsed="0.000724"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:22.768476" elapsed="0.001472"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:22.771053" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.238&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/pee...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:30:22.770167" elapsed="0.000919"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:30:22.771141" 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/bgp_peer.vanadium/${file_name} exists. If 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-04-17T03:30:22.763198" elapsed="0.008089"/>
</kw>
<msg time="2026-04-17T03:30:22.771346" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:22.745985" elapsed="0.025413"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:30:22.788280" elapsed="0.000059"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name} exists. If 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-04-17T03:30:22.805228" elapsed="0.000064"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:30:22.822330" elapsed="0.000058"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:22.822781" 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-04-17T03:30:22.823050" 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-04-17T03:30:22.823581" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:22.823381" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:22.823360" 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-04-17T03:30:22.823903" 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-04-17T03:30:22.824152" 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-04-17T03:30:22.824372" elapsed="0.000025"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:30:22.823313" elapsed="0.001125"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:30:22.823157" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:22.824672" elapsed="0.000027"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:22.824774" elapsed="0.000022"/>
</return>
<msg time="2026-04-17T03:30:22.824995" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.238&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/pee...</msg>
<var>${data}</var>
<arg>folder=${folder}</arg>
<arg>base_name=${base_name}</arg>
<arg>extension=${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>endline=${endline}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:30:22.741995" elapsed="0.083042"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:22.826899" 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-04-17T03:30:22.826532" elapsed="0.000482">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-04-17T03:30:22.827133" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:22.826001" elapsed="0.001162"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:22.827595" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:22.827249" elapsed="0.000422"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:22.828402" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:22.828034" elapsed="0.000400"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:22.827703" elapsed="0.000774"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:22.827227" elapsed="0.001277"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:22.831696" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:30:22.828710" elapsed="0.003037"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:30:22.831814" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:30:22.832037" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:30:22.825512" elapsed="0.006556"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:22.833872" 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.238</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:22.833550" elapsed="0.000403"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:22.834460" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.238&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-04-17T03:30:22.834159" elapsed="0.000363"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:22.835065" 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-04-17T03:30:22.834728" elapsed="0.000456"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:22.835693" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:22.835388" elapsed="0.000405"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:22.836844" 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-04-17T03:30:22.836590" elapsed="0.000287"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:30:22.837321" 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-04-17T03:30:22.837106" elapsed="0.000247"/>
</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-04-17T03:30:22.837553" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:22.838375" 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-04-17T03:30:22.838063" elapsed="0.000370"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:30:22.838490" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:30:22.838689" 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-04-17T03:30:22.836077" elapsed="0.002644"/>
</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-04-17T03:30:22.845794" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:30:23.047392" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:30:23.449719" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:30:23.452170" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:30:22.841942" elapsed="0.613810">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:22.838812" elapsed="0.617151">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:23.456385" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:23.456036" elapsed="0.000455"/>
</branch>
<status status="FAIL" start="2026-04-17T03:30:22.838789" elapsed="0.617736">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:23.457217" elapsed="0.000043"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:23.457437" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:23.457374" elapsed="0.000133"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:23.457344" 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-04-17T03:30:23.457793" elapsed="0.000035"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:30:23.457997" elapsed="0.000029"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:30:22.832510" elapsed="0.625683">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:23.458318" elapsed="0.000025"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:30:22.622510" elapsed="0.835967">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:23.458978" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:23.458655" elapsed="0.000432"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:23.458628" elapsed="0.000497"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:23.459178" 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="FAIL" start="2026-04-17T03:30:22.618020" elapsed="0.841318">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Configures BGP peer module with initiate-connection set to false.</doc>
<status status="FAIL" start="2026-04-17T03:30:22.554532" elapsed="0.905085">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:30:23.464301" elapsed="0.000316"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:30:23.463973" 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-04-17T03:30:23.465922" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:23.465777" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:23.465753" elapsed="0.000266"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:23.472335" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:23.472202" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:23.472180" elapsed="0.000236"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:23.473645" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:30:23.473169" elapsed="0.000509"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:30:23.474239" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:30:23.473872" elapsed="0.000396"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:30:23.474319" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:30:23.474504" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:30:23.472704" elapsed="0.001828"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:23.480244" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:23.480134" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:23.480115" elapsed="0.000265"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:23.481595" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:23.481486" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:23.481468" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:23.482195" level="INFO">${karaf_connection_index} = 17</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:30:23.481813" elapsed="0.000409"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:23.482618" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:30:23.482392" elapsed="0.000253"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:30:23.483467" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:30:23.483185" elapsed="0.001003">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:30:23.484385" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:30:23.484432" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:23.482812" elapsed="0.001645"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:30:23.485252" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:30:23.485004" elapsed="0.000915">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:30:23.486142" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:30:23.486190" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:23.484630" elapsed="0.001585"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:30:23.487353" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Start_Bgp_Peer"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:30:23.486541" elapsed="0.000876">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Start_Bgp_Peer"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:23.486293" elapsed="0.001195">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Start_Bgp_Peer"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:30:23.486274" elapsed="0.001248">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Start_Bgp_Peer"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:23.487689" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:23.488004" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:23.487777" elapsed="0.000304"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:23.487760" elapsed="0.000349"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:30:23.488144" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:30:23.491021" elapsed="0.000154"/>
</kw>
<msg time="2026-04-17T03:30:23.491244" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:23.489688" elapsed="0.001690"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:23.491657" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:23.492047" 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-04-17T03:30:23.489055" elapsed="0.003185"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:30:23.488471" elapsed="0.003834"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:30:23.481177" elapsed="0.011215">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Start_Bgp_Peer"</status>
</kw>
<msg time="2026-04-17T03:30:23.492498" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:30:23.492543" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Start_Bgp_Peer"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:23.480542" elapsed="0.012026"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:30:23.492755" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:23.492646" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:23.492628" elapsed="0.000275"/>
</if>
<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-04-17T03:30:23.493782" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:23.493673" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:23.493656" elapsed="0.000193"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:23.494223" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:30:23.494333" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:30:23.494094" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:23.494783" level="INFO">{1: 17}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:23.494516" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:23.495314" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:23.495020" elapsed="0.000342"/>
</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-04-17T03:30:23.496142" elapsed="0.000284"/>
</kw>
<msg time="2026-04-17T03:30:23.496529" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:30:23.496575" level="INFO">${old_connection_index} = 17</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:23.495533" elapsed="0.001064"/>
</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-04-17T03:30:23.497443" elapsed="0.000199"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:30:23.498782" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:30:23.498355" elapsed="0.001370">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:23.497810" elapsed="0.002017"/>
</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-04-17T03:30:23.500543" elapsed="0.000279"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:23.500073" elapsed="0.000833"/>
</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-04-17T03:30:23.496908" elapsed="0.004064"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:23.496675" elapsed="0.004348"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:23.496655" elapsed="0.004396"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:23.501968" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:30:23.501634" elapsed="0.000364"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:30:23.502054" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:30:23.502215" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:30:23.501280" elapsed="0.000960"/>
</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-04-17T03:30:23.502403" elapsed="0.000448"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:23.503346" level="INFO">index=18
host=10.30.170.120
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-04-17T03:30:23.503452" level="INFO">${karaf_connection_object} = index=18
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:30:23.503045" elapsed="0.000435"/>
</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-04-17T03:30:23.503639" elapsed="0.002362"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:30:23.506437" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:30:23.507660" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:30:23.506171" elapsed="0.001936">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:30:23.521813" elapsed="0.000617"/>
</kw>
<msg time="2026-04-17T03:30:23.522523" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:23.520407" elapsed="0.002321"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:23.522893" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:23.523076" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:30:23.508967" elapsed="0.014192"/>
</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-04-17T03:30:23.508404" elapsed="0.014800"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:30:23.493371" elapsed="0.029918">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:23.523658" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:30:23.523733" 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="FAIL" start="2026-04-17T03:30:23.479734" elapsed="0.044106">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:30:23.524011" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:30:23.524058" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:23.474994" elapsed="0.049088"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:23.524425" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:23.524166" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:23.524145" elapsed="0.000358"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:30:23.474804" elapsed="0.049722"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:30:23.474600" elapsed="0.049959"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:30:23.471726" elapsed="0.052890"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:30:23.465433" elapsed="0.059239"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:23.464873" elapsed="0.059844"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:30:23.461261" elapsed="0.063510"/>
</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-04-17T03:30:23.526684" level="INFO">${command} = python3 play.py --amount 0 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --peerport=1790 --debug --rt_constrain --wfr 1 &amp;&gt; play.py.out</msg>
<var>${command}</var>
<arg>python3 play.py ${arguments} &amp;&gt; ${BGPSpeaker__OUTPUT_LOG}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:23.526355" elapsed="0.000357"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:23.527126" level="INFO">python3 play.py --amount 0 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --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-04-17T03:30:23.526867" elapsed="0.000312"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:30:23.530634" level="INFO">python3 play.py --amount 0 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --peerport=1790 --debug --rt_constrain --wfr 1 &amp;&gt; play.py.out</msg>
<msg time="2026-04-17T03:30:23.530727" level="INFO">${output} =  python3 play.py --amount 0 --myip=10.30.171.238 --myport=17900 --peerip=10.30.170.120 --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-04-17T03:30:23.527328" elapsed="0.003426"/>
</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-04-17T03:30:23.525709" elapsed="0.005104"/>
</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-04-17T03:30:29.533268" 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-04-17T03:30:23.532674" elapsed="6.001502">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-04-17T03:30:29.534507" 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-04-17T03:30:23.532393" elapsed="6.002391">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-04-17T03:30:23.531982" elapsed="6.002966"/>
</kw>
<msg time="2026-04-17T03:30:29.535076" 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-04-17T03:30:23.531560" elapsed="6.003543"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-04-17T03:30:29.535302" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-04-17T03:30:29.535201" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:29.535174" elapsed="0.000219"/>
</if>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<doc>Send all output produced by the play.py utility to Robot logs.
This needs to be called if your suite detects play.py crashing and bypasses
Kill_BGP_Speaker in that case otherwise the output of play.py (which most
likely contains clues about why it crashed) will be lost.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:29.535640" elapsed="0.000028"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was seen but it was not expected yet</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:29.535818" elapsed="0.000344"/>
</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-04-17T03:30:23.531272" elapsed="6.004963"/>
</kw>
<doc>Starts bgp peer and verifies that the peer runs.</doc>
<status status="PASS" start="2026-04-17T03:30:23.525381" elapsed="6.010903"/>
</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-04-17T03:30:23.524960" elapsed="6.011365"/>
</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-04-17T03:30:23.460038" elapsed="6.076414"/>
</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-04-17T03:30:29.540465" elapsed="0.000303"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:30:29.540179" elapsed="0.000650"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:29.542096" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:29.541919" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:29.541898" 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-04-17T03:30:29.548105" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:29.547919" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:29.547891" elapsed="0.000312"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:29.549618" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:30:29.549030" elapsed="0.000618"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:30:29.550180" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:30:29.549823" elapsed="0.000384"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:30:29.550253" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:30:29.550425" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:30:29.548565" elapsed="0.001885"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:29.556691" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:29.556532" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:29.556505" elapsed="0.000286"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:29.558348" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:29.558239" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:29.558221" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:29.558911" level="INFO">${karaf_connection_index} = 18</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:30:29.558593" elapsed="0.000362"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:29.559377" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:30:29.559121" elapsed="0.000287"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:30:29.560290" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:30:29.560008" elapsed="0.001027">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:30:29.561235" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:30:29.561349" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:29.559610" elapsed="0.001764"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:30:29.562258" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:30:29.562000" elapsed="0.000920">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:30:29.563132" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:30:29.563192" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:29.561593" elapsed="0.001630"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:30:29.564257" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Odl_To_Play_rt_constrain_default"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:30:29.563542" elapsed="0.000797">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Odl_To_Play_rt_constrain_default"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:29.563312" elapsed="0.001125">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Odl_To_Play_rt_constrain_default"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:30:29.563292" elapsed="0.001189">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Odl_To_Play_rt_constrain_default"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:29.564698" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:29.565000" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:29.564808" elapsed="0.000250"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:29.564787" elapsed="0.000295"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:30:29.565114" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:30:29.567782" elapsed="0.000165"/>
</kw>
<msg time="2026-04-17T03:30:29.568026" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:29.566636" 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-04-17T03:30:29.568444" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:29.568781" 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-04-17T03:30:29.566001" elapsed="0.002983"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:30:29.565414" elapsed="0.003636"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:30:29.557900" elapsed="0.011253">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Odl_To_Play_rt_constrain_default"</status>
</kw>
<msg time="2026-04-17T03:30:29.569288" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:30:29.569332" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Odl_To_Play_rt_constrain_default"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:29.557033" elapsed="0.012323"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:30:29.569619" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:29.569437" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:29.569417" elapsed="0.000277"/>
</if>
<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-04-17T03:30:29.570838" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:29.570727" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:29.570709" elapsed="0.000197"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:29.571322" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:30:29.571451" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:30:29.571168" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:29.572049" level="INFO">{1: 18}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:29.571704" elapsed="0.000390"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:29.572612" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:29.572299" elapsed="0.000369"/>
</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-04-17T03:30:29.573432" elapsed="0.000304"/>
</kw>
<msg time="2026-04-17T03:30:29.573837" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:30:29.573883" level="INFO">${old_connection_index} = 18</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:29.572960" elapsed="0.000946"/>
</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-04-17T03:30:29.574760" elapsed="0.000326"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:30:29.576178" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:30:29.575745" elapsed="0.001429">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:29.575262" elapsed="0.002016"/>
</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-04-17T03:30:29.578075" elapsed="0.000339"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:29.577455" elapsed="0.001047"/>
</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-04-17T03:30:29.574234" elapsed="0.004314"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:29.574001" elapsed="0.004596"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:29.573982" elapsed="0.004641"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:29.579630" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:30:29.579309" elapsed="0.000348"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:30:29.579707" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:30:29.579861" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:30:29.578841" elapsed="0.001044"/>
</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-04-17T03:30:29.580065" elapsed="0.000464"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:29.580823" level="INFO">index=19
host=10.30.170.120
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-04-17T03:30:29.580938" level="INFO">${karaf_connection_object} = index=19
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:30:29.580710" elapsed="0.000257"/>
</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-04-17T03:30:29.581121" elapsed="0.004156"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:30:29.585840" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:30:29.587242" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:30:29.585465" elapsed="0.002391">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:30:29.606147" elapsed="0.001095"/>
</kw>
<msg time="2026-04-17T03:30:29.607444" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:29.604489" elapsed="0.003246"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:29.608019" elapsed="0.000037"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:29.608271" elapsed="0.000030"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:30:29.589364" elapsed="0.019037"/>
</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-04-17T03:30:29.588330" elapsed="0.020146"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:30:29.570417" elapsed="0.038192">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:29.609224" elapsed="0.000378"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:30:29.609702" 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="FAIL" start="2026-04-17T03:30:29.556070" elapsed="0.053811">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:30:29.610085" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:30:29.610151" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:29.550861" elapsed="0.059319"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:29.610556" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:29.610272" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:29.610250" elapsed="0.000387"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:30:29.550708" elapsed="0.059953"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:30:29.550517" elapsed="0.060180"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:30:29.547455" elapsed="0.063301"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:30:29.541593" elapsed="0.069219"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:29.541012" elapsed="0.069846"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:30:29.537524" elapsed="0.073388"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:29.612324" 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-04-17T03:30:29.612527" 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-04-17T03:30:29.612097" elapsed="0.000457"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-17T03:30:29.612952" 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-04-17T03:30:29.612716" elapsed="0.000264"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:29.613325" 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-04-17T03:30:29.613455" 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-04-17T03:30:29.613137" elapsed="0.000344"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-17T03:30:29.613881" 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-04-17T03:30:29.613675" elapsed="0.000232"/>
</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-04-17T03:30:29.614240" elapsed="0.002977"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:29.613997" elapsed="0.003258"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:29.613978" elapsed="0.003303"/>
</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-04-17T03:30:29.654650" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:29.654183" elapsed="0.000514"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:29.655730" 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-04-17T03:30:29.655365" elapsed="0.000466">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-04-17T03:30:29.655972" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:29.654944" elapsed="0.001062"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:29.661399" 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-04-17T03:30:29.660986" elapsed="0.000442"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:29.661805" 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-04-17T03:30:29.661996" 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-04-17T03:30:29.661653" elapsed="0.000371"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:29.662590" 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-04-17T03:30:29.662200" elapsed="0.000456"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:29.664123" level="INFO">mapping: {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:29.663737" elapsed="0.000449"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:29.664792" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:30:29.664414" elapsed="0.000414"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:29.665856" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:29.665372" elapsed="0.000520"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:29.667539" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:29.666876" elapsed="0.000701"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:29.667654" elapsed="0.000053"/>
</return>
<msg time="2026-04-17T03:30:29.667892" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:29.666188" elapsed="0.001768"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:29.668190" elapsed="0.000352"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:30:29.665178" elapsed="0.003421"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:29.669423" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:29.668983" elapsed="0.000477"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:29.671119" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:29.670493" elapsed="0.000665"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:29.671234" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:30:29.671459" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:29.669752" elapsed="0.001745"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:29.671725" elapsed="0.000355"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:30:29.668765" elapsed="0.003375"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:30:29.664905" elapsed="0.007288"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:30:29.672255" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:30:29.672488" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:30:29.663274" elapsed="0.009251"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:29.662767" elapsed="0.009805"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:29.672831" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:29.672610" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:29.662733" elapsed="0.010258"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:29.674129" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:30:29.673209" elapsed="0.000962"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:30:29.674220" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:30:29.653465" elapsed="0.020879"/>
</kw>
<msg time="2026-04-17T03:30:29.674443" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:29.640129" elapsed="0.034366"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:30:29.686814" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:29.699029" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:29.711267" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:29.711472" 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-04-17T03:30:29.711652" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:29.712049" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:29.711884" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:29.711868" 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-04-17T03:30:29.712274" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:29.712447" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:29.712614" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:30:29.711834" elapsed="0.000833"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:30:29.711732" elapsed="0.000961"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:29.712841" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:29.712916" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:30:29.713066" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:30:29.635726" elapsed="0.077368"/>
</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-04-17T03:30:29.737715" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:29.737309" elapsed="0.000434"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:29.738614" 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-04-17T03:30:29.738335" elapsed="0.000363">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-04-17T03:30:29.738797" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:29.737908" elapsed="0.000914"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:29.739451" 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-04-17T03:30:29.739009" elapsed="0.000477"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:29.739884" 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-04-17T03:30:29.740112" 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-04-17T03:30:29.739699" elapsed="0.000453"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:29.740690" 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-04-17T03:30:29.740367" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-17T03:30:29.741218" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:29.740850" elapsed="0.000429"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:29.741817" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:29.741468" elapsed="0.000375"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:29.741305" elapsed="0.000574"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:29.740826" elapsed="0.001075"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:29.742602" 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-04-17T03:30:29.742095" elapsed="0.000539"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:30:29.742685" elapsed="0.000036"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/${file_name} exists. If yes read 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-04-17T03:30:29.736662" elapsed="0.006160"/>
</kw>
<msg time="2026-04-17T03:30:29.742883" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:29.724043" elapsed="0.018907"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:30:29.755576" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_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-04-17T03:30:29.768150" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:29.780322" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:29.780531" 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-04-17T03:30:29.780709" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:29.781112" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:29.780961" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:29.780943" 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-04-17T03:30:29.781336" elapsed="0.000185"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:29.781776" 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-04-17T03:30:29.781975" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:30:29.780894" elapsed="0.001137"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:30:29.780788" elapsed="0.001272"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:29.782216" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:29.782292" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:30:29.782435" 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-04-17T03:30:29.723147" elapsed="0.059317"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:29.783875" 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-04-17T03:30:29.783587" elapsed="0.000378">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-04-17T03:30:29.784065" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:29.783187" elapsed="0.000903"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:29.784421" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:29.784161" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:29.785008" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:29.784691" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:29.784503" elapsed="0.000568"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:29.784143" elapsed="0.000949"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:29.787513" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:30:29.785253" elapsed="0.002287"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:30:29.787593" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:30:29.787750" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:30:29.782816" elapsed="0.004959"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:29.789401" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:30:29.789111" elapsed="0.000391"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:29.789967" 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-04-17T03:30:29.789701" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:29.790425" 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-04-17T03:30:29.790178" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:29.790886" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:29.790639" elapsed="0.000307"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:29.791768" 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-04-17T03:30:29.791565" elapsed="0.000229"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:30:29.792143" 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-04-17T03:30:29.791966" 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-04-17T03:30:29.792320" elapsed="0.000213"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:29.792987" 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-04-17T03:30:29.792690" elapsed="0.000351"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:30:29.793086" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:30:29.793246" 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-04-17T03:30:29.791154" elapsed="0.002118"/>
</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-04-17T03:30:29.798514" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:30.000188" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:30.402840" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:30.405221" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:30:29.795669" elapsed="0.612947">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:29.793343" elapsed="0.615424">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:30:30.409156" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:30.408827" elapsed="0.000432"/>
</branch>
<status status="FAIL" start="2026-04-17T03:30:29.793325" elapsed="0.615968">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:30:30.410052" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:30.410333" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:30.410258" elapsed="0.000158"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:30.410218" elapsed="0.000237"/>
</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-04-17T03:30:30.410725" elapsed="0.000038"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:30:30.410831" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>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="FAIL" start="2026-04-17T03:30:29.788126" elapsed="0.622901">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:30.411164" elapsed="0.000039"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>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="FAIL" start="2026-04-17T03:30:29.622398" elapsed="0.789004">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:30.412000" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:30.411621" elapsed="0.000506"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:30.411587" elapsed="0.000590"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:30.412247" elapsed="0.000027"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Add arguments sensible for XML data, return Post_Templated response text.
Optionally, verification against response.xml (no iteration) is called.</doc>
<status status="FAIL" start="2026-04-17T03:30:29.617586" elapsed="0.794835">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:30:30.412745" elapsed="0.000034"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<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="NOT RUN" start="2026-04-17T03:30:30.413106" elapsed="0.000036"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:30.413360" elapsed="0.000030"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations">
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:30.413624" elapsed="0.000033"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:30:30.413926" elapsed="0.000051"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<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="NOT RUN" start="2026-04-17T03:30:30.414285" elapsed="0.000035"/>
</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-04-17T03:30:30.465231" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:30.464639" elapsed="0.000639"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:30.466497" 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-04-17T03:30:30.466113" elapsed="0.000474">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-04-17T03:30:30.466690" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:30.465593" elapsed="0.001124"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:30.467406" 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-04-17T03:30:30.466888" elapsed="0.000549"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:30.467758" 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-04-17T03:30:30.467941" 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-04-17T03:30:30.467609" elapsed="0.000361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:30.468462" 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-04-17T03:30:30.468139" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:30.469617" level="INFO">mapping: {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:30.469354" elapsed="0.000310"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:30.470171" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:30:30.469874" elapsed="0.000324"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:30.471140" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:30.470573" elapsed="0.000594"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:30.472344" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:30.471862" elapsed="0.000525"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:30.472511" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:30:30.472744" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:30.471372" 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-04-17T03:30:30.472948" elapsed="0.000566"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:30:30.470432" elapsed="0.003139"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:30.474546" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:30.473988" elapsed="0.000584"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:30.475889" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:30.475266" elapsed="0.000691"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:30.476077" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:30:30.476304" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:30.474764" elapsed="0.001566"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:30.476528" elapsed="0.000563"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:30:30.473779" elapsed="0.003358"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:30:30.470253" elapsed="0.006923"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:30:30.477236" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:30:30.477420" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:30:30.468988" elapsed="0.008460"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:30.468595" elapsed="0.008886"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:30.477668" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:30.477509" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:30.468570" elapsed="0.009211"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:30.478734" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:30:30.478006" elapsed="0.000765"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:30:30.478836" 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-04-17T03:30:30.463770" elapsed="0.015250"/>
</kw>
<msg time="2026-04-17T03:30:30.479095" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:30.449073" elapsed="0.030104"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:30:30.493364" elapsed="0.000041"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_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-04-17T03:30:30.505698" elapsed="0.000062"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:30:30.518012" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:30.518243" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:30.518427" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:30.518830" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:30.518676" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:30.518658" 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-04-17T03:30:30.519078" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:30.519249" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:30.519415" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:30:30.518621" elapsed="0.000847"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:30:30.518509" elapsed="0.000986"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:30.519642" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:30.519718" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:30:30.519870" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:30:30.444065" elapsed="0.075833"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:30.521203" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:30:30.520891" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:30:30.530170" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:30.731823" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:31.134135" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:31.136907" level="INFO">${response} = None</msg>
<msg time="2026-04-17T03:30:31.137105" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:30.523459" elapsed="0.619107">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:30.521323" elapsed="0.621395">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:31.143189" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:31.142783" elapsed="0.000517"/>
</branch>
<status status="FAIL" start="2026-04-17T03:30:30.521305" elapsed="0.622032">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:31.150269" 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-04-17T03:30:31.145735" elapsed="0.004572">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:31.145370" elapsed="0.005029">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:30:31.145338" elapsed="0.005095">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-04-17T03:30:31.153265" 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-04-17T03:30:31.150742" elapsed="0.002569">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:31.150511" elapsed="0.002885">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:30:31.150494" elapsed="0.002945">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:31.154139" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:30:31.153658" 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>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:31.154543" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:31.154294" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:31.155133" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:31.154796" elapsed="0.000364"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:31.154625" elapsed="0.000572"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:31.154275" elapsed="0.000946"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:31.155765" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:30:31.155390" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:31.156122" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:31.155864" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:31.156764" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:31.156378" elapsed="0.000421"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:31.156207" elapsed="0.000637"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:31.155845" elapsed="0.001028"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:31.157111" elapsed="0.000474"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-17T03:30:31.158227" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:30:31.157818" elapsed="0.000436"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-04-17T03:30:31.160976" 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-04-17T03:30:31.158416" elapsed="0.002604">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-04-17T03:30:31.144558" elapsed="0.016664">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-04-17T03:30:31.161310" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:30:31.164497" level="INFO">${response_text} = None</msg>
<msg time="2026-04-17T03:30:31.164529" 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-04-17T03:30:30.520246" elapsed="0.644312">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-04-17T03:30:31.164625" elapsed="0.000027"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="FAIL" start="2026-04-17T03:30:30.416008" elapsed="0.748791">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:30.415318" elapsed="0.749547"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-04-17T03:30:30.414679" elapsed="0.750262"/>
</kw>
<arg>rt_constrain_default</arg>
<arg>${RT_CONSTRAIN_DIR}</arg>
<status status="FAIL" start="2026-04-17T03:30:29.611663" elapsed="1.553357">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:29.536897" elapsed="1.628290">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:30:31.169028" elapsed="0.000220"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:30:31.168710" elapsed="0.000593"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:31.170475" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:31.170359" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:31.170340" elapsed="0.000202"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:31.176735" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:31.176591" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:31.176570" elapsed="0.000250"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:31.178195" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:30:31.177646" elapsed="0.000583"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:30:31.178713" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:30:31.178406" elapsed="0.000335"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:30:31.178797" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:30:31.178981" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:30:31.177144" elapsed="0.001862"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:31.184991" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:31.184854" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:31.184834" 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-04-17T03:30:31.186448" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:31.186337" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:31.186318" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:31.187057" level="INFO">${karaf_connection_index} = 19</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:30:31.186686" elapsed="0.000406"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:31.187546" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:30:31.187281" elapsed="0.000295"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:30:31.188550" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:30:31.188232" elapsed="0.001158">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:30:31.189606" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:30:31.189660" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:31.187780" elapsed="0.001905"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:30:31.190653" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:30:31.190382" elapsed="0.001072">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:30:31.191644" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:30:31.191692" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:31.189874" elapsed="0.001842"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:30:31.192667" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Play_To_Odl_rt_constrain_default"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:30:31.192043" elapsed="0.000687">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Play_To_Odl_rt_constrain_default"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:31.191792" elapsed="0.001014">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Play_To_Odl_rt_constrain_default"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:30:31.191773" elapsed="0.001067">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Play_To_Odl_rt_constrain_default"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:31.193022" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:31.193255" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:31.193109" elapsed="0.000336"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:31.193093" elapsed="0.000381"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:30:31.193510" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:30:31.196359" elapsed="0.000155"/>
</kw>
<msg time="2026-04-17T03:30:31.196584" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:31.195185" elapsed="0.001548"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:31.197062" elapsed="0.000081"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:31.197441" 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-04-17T03:30:31.194424" 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-04-17T03:30:31.193801" elapsed="0.003919"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:30:31.185983" elapsed="0.011835">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Play_To_Odl_rt_constrain_default"</status>
</kw>
<msg time="2026-04-17T03:30:31.197993" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:30:31.198047" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Play_To_Odl_rt_constrain_default"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:31.185235" elapsed="0.012843"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:30:31.198304" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:31.198169" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:31.198148" elapsed="0.000225"/>
</if>
<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-04-17T03:30:31.199605" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:31.199484" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:31.199463" elapsed="0.000221"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:31.200030" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:30:31.200143" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:30:31.199865" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:31.200656" level="INFO">{1: 19}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:31.200347" elapsed="0.000361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:31.201228" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:31.200908" elapsed="0.000374"/>
</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-04-17T03:30:31.201949" elapsed="0.000294"/>
</kw>
<msg time="2026-04-17T03:30:31.202359" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:30:31.202405" level="INFO">${old_connection_index} = 19</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:31.201488" elapsed="0.000940"/>
</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-04-17T03:30:31.203536" elapsed="0.000211"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:30:31.204945" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:30:31.204485" elapsed="0.001530">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:31.203951" elapsed="0.002182"/>
</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-04-17T03:30:31.206836" elapsed="0.000354"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:31.206331" elapsed="0.000944"/>
</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-04-17T03:30:31.202794" elapsed="0.004528"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:31.202518" elapsed="0.004852"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:31.202498" elapsed="0.004898"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:31.208359" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:30:31.207956" elapsed="0.000438"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:30:31.208444" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:30:31.208604" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:30:31.207606" elapsed="0.001022"/>
</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-04-17T03:30:31.208800" elapsed="0.000482"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:31.209599" level="INFO">index=20
host=10.30.170.120
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-04-17T03:30:31.209707" level="INFO">${karaf_connection_object} = index=20
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:30:31.209484" elapsed="0.000249"/>
</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-04-17T03:30:31.209946" elapsed="0.002520"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:30:31.212940" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:30:31.214395" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:30:31.212644" elapsed="0.002662">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:30:31.236191" elapsed="0.000427"/>
</kw>
<msg time="2026-04-17T03:30:31.236725" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:31.234683" elapsed="0.002206"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:31.237092" elapsed="0.000033"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:31.237322" elapsed="0.000024"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:30:31.217220" elapsed="0.020193"/>
</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-04-17T03:30:31.215994" elapsed="0.021469"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:30:31.199127" elapsed="0.038428">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:31.238101" elapsed="0.000030"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:30:31.238184" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:30:31.184480" elapsed="0.053822">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:30:31.238420" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:30:31.238464" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:31.179399" elapsed="0.059088"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:31.238848" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:31.238573" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:31.238552" elapsed="0.000392"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:30:31.179252" elapsed="0.059719"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:30:31.179067" elapsed="0.059940"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:30:31.176140" elapsed="0.062929"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:30:31.170047" elapsed="0.069081"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:31.169458" elapsed="0.069717"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:30:31.166052" elapsed="0.073180"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:31.240457" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:31.239959" elapsed="0.000527"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:31.241159" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:31.240658" elapsed="0.000531"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:31.241749" 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-04-17T03:30:31.241360" elapsed="0.000417"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:31.242429" 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-04-17T03:30:31.242606" 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-04-17T03:30:31.242217" elapsed="0.000417"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:31.243003" 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-04-17T03:30:31.243129" 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-04-17T03:30:31.242794" elapsed="0.000361"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-04-17T03:30:31.243313" elapsed="0.002989"/>
</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-04-17T03:30:31.246477" elapsed="0.001927"/>
</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-04-17T03:30:31.304530" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:31.304068" elapsed="0.000497"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:31.305375" 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-04-17T03:30:31.305103" elapsed="0.000351">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-04-17T03:30:31.305549" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:31.304740" elapsed="0.000833"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:31.306213" 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-04-17T03:30:31.305740" elapsed="0.000501"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:31.306548" 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-04-17T03:30:31.306720" 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-04-17T03:30:31.306406" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:31.307211" 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-04-17T03:30:31.306954" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:31.308315" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:31.307999" elapsed="0.000361"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:31.308791" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:30:31.308521" elapsed="0.000340"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:31.309706" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:31.309273" elapsed="0.000460"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:31.311108" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:31.310457" elapsed="0.000757"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:31.311296" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:30:31.311609" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:31.309973" elapsed="0.001663"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:31.311798" elapsed="0.000416"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:30:31.309119" elapsed="0.003146"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:31.312988" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:31.312559" elapsed="0.000456"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:31.314572" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:31.313918" elapsed="0.000790"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:31.314817" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:30:31.315162" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:31.313374" elapsed="0.001814"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:31.315344" elapsed="0.000380"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:30:31.312417" elapsed="0.003349"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:30:31.308917" elapsed="0.006884"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:30:31.315843" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:30:31.316051" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:30:31.307655" elapsed="0.008432"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:31.307342" elapsed="0.008788"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:31.316317" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:31.316155" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:31.307319" elapsed="0.009075"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:31.317158" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-f...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:30:31.316539" elapsed="0.000648"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:30:31.317236" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:30:31.303381" elapsed="0.013982"/>
</kw>
<msg time="2026-04-17T03:30:31.317420" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:31.290640" elapsed="0.026829"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:30:31.330000" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:31.342632" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:31.355255" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:31.355458" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:31.355637" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:31.356027" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:31.355862" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:31.355847" 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-04-17T03:30:31.356251" 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-04-17T03:30:31.356420" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:31.356586" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:30:31.355817" elapsed="0.000821"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:30:31.355714" elapsed="0.000949"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:31.356809" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:31.356884" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:30:31.357027" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-f...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:30:31.286398" elapsed="0.070656"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:31.358395" 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-04-17T03:30:31.358121" elapsed="0.000345">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-04-17T03:30:31.358562" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:31.357726" 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-04-17T03:30:31.358906" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:31.358655" elapsed="0.000344"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:31.359509" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:31.359211" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:31.359024" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:31.358638" elapsed="0.000952"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:31.362173" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:30:31.359743" elapsed="0.002467"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:30:31.362273" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:30:31.362464" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:30:31.357392" elapsed="0.005144"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:31.363849" 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-04-17T03:30:31.363592" elapsed="0.000360">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-04-17T03:30:31.364072" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:31.363224" elapsed="0.000874"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:30:31.364307" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:30:31.364170" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:31.364151" elapsed="0.000241"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:31.364541" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:31.364715" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:30:31.364781" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:30:31.366757" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:30:31.362865" elapsed="0.003928"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:31.368432" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:31.368132" elapsed="0.000349"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:31.368970" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:31.368635" elapsed="0.000400"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:30:31.374189" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:31.575774" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:31.978999" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:31.982089" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:30:31.371206" elapsed="0.617300">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:31.369120" elapsed="0.619607">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:31.989191" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:31.988802" elapsed="0.000500"/>
</branch>
<status status="FAIL" start="2026-04-17T03:30:31.369098" elapsed="0.620356">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:31.990188" elapsed="0.000047"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:31.990426" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:31.990362" elapsed="0.000133"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:31.990327" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:31.990744" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:30:31.990845" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:30:31.367153" elapsed="0.623892">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:31.991161" 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-04-17T03:30:31.262797" elapsed="0.728525">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:31.991742" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:31.991474" elapsed="0.000371"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:31.991450" elapsed="0.000429"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:31.991944" elapsed="0.000022"/>
</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-04-17T03:30:31.256527" elapsed="0.735567">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:34.048109" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:34.047662" elapsed="0.000482"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:34.048952" 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-04-17T03:30:34.048680" elapsed="0.000350">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-04-17T03:30:34.049128" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:34.048326" elapsed="0.000827"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:34.049730" 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-04-17T03:30:34.049335" elapsed="0.000493"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:34.050159" 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-04-17T03:30:34.050316" 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-04-17T03:30:34.050013" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:34.050780" 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-04-17T03:30:34.050509" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:34.051899" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:34.051592" elapsed="0.000375"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:34.052406" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:30:34.052134" elapsed="0.000298"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:34.053250" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:34.052797" elapsed="0.000480"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:34.054496" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:34.053942" elapsed="0.000655"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:34.054725" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:30:34.055050" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:34.053470" elapsed="0.001607"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:34.055236" elapsed="0.000382"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:30:34.052659" elapsed="0.003000"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:34.056506" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:34.055907" elapsed="0.000626"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:34.057763" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:34.057219" elapsed="0.000644"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:34.057960" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:30:34.058255" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:34.056722" elapsed="0.001559"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:34.058441" elapsed="0.000402"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:30:34.055773" elapsed="0.003114"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:30:34.052486" elapsed="0.006453"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:30:34.058986" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:30:34.059166" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:30:34.051263" elapsed="0.007930"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:34.050909" elapsed="0.008317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:34.059404" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:34.059251" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:34.050885" elapsed="0.008595"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:34.060236" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-f...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:30:34.059626" elapsed="0.000640"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:30:34.060315" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:30:34.046913" elapsed="0.013528"/>
</kw>
<msg time="2026-04-17T03:30:34.060537" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:34.033568" elapsed="0.027021"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:30:34.073144" 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-04-17T03:30:34.085540" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_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-04-17T03:30:34.098203" elapsed="0.000037"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:34.098457" 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-04-17T03:30:34.098643" elapsed="0.000041"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:34.099107" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:34.098948" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:34.098916" elapsed="0.000273"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:34.099335" 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-04-17T03:30:34.099502" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:34.099668" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:30:34.098875" elapsed="0.000845"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:30:34.098755" elapsed="0.000991"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:34.099893" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:34.099988" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:30:34.100159" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-f...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:30:34.029260" elapsed="0.070928"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:34.101613" 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-04-17T03:30:34.101323" elapsed="0.000367">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-04-17T03:30:34.101851" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:34.100903" elapsed="0.000973"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:34.102234" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:34.101965" elapsed="0.000327"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:34.102951" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:34.102564" elapsed="0.000416"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:34.102317" elapsed="0.000700"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:34.101945" elapsed="0.001095"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:34.105698" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:30:34.103197" elapsed="0.002530"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:30:34.105781" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:30:34.105962" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:30:34.100539" elapsed="0.005450"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:34.107300" 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-04-17T03:30:34.107046" elapsed="0.000326">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-04-17T03:30:34.107469" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:34.106656" elapsed="0.000839"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:30:34.107705" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:30:34.107567" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:34.107549" elapsed="0.000242"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:34.107959" elapsed="0.000024"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:34.108140" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:30:34.108210" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:30:34.110438" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:30:34.106315" elapsed="0.004153"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:34.112084" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:34.111784" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:34.112578" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:34.112314" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:30:34.118463" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:34.320138" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:34.722430" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:34.725117" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:30:34.115119" elapsed="0.615851">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:34.112699" elapsed="0.618541">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:34.731980" elapsed="0.000077"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:34.731377" elapsed="0.000814"/>
</branch>
<status status="FAIL" start="2026-04-17T03:30:34.112679" elapsed="0.619589">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:34.733613" elapsed="0.000092"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:34.734092" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:34.733984" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:34.733883" elapsed="0.000378"/>
</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-04-17T03:30:34.734773" elapsed="0.000125"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:30:34.735055" elapsed="0.000038"/>
</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-04-17T03:30:34.110849" elapsed="0.624460">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:34.735394" 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-04-17T03:30:34.006379" elapsed="0.729117">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:34.735786" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:34.735593" elapsed="0.000266"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:34.735576" elapsed="0.000307"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:34.735916" elapsed="0.000028"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-04-17T03:30:34.000011" elapsed="0.736025">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:36.788110" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_default/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:36.787607" elapsed="0.000539"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:36.788943" 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-04-17T03:30:36.788674" elapsed="0.000347">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-04-17T03:30:36.789120" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:36.788327" elapsed="0.000819"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:36.789711" 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-04-17T03:30:36.789314" elapsed="0.000425"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:36.790067" 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-04-17T03:30:36.790226" 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-04-17T03:30:36.789906" elapsed="0.000346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:36.790669" 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-04-17T03:30:36.790412" 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-04-17T03:30:36.791785" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:36.791481" elapsed="0.000352"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:36.792297" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:30:36.792020" elapsed="0.000303"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:36.793118" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:36.792690" elapsed="0.000455"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:36.794366" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:36.793788" elapsed="0.000679"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:36.794546" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:30:36.794849" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:36.793335" elapsed="0.001540"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:36.795051" elapsed="0.000473"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:30:36.792553" elapsed="0.003015"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:36.796548" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:36.795869" elapsed="0.000710"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:36.797846" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:36.797308" elapsed="0.000655"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:36.798041" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:30:36.798333" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:36.796824" elapsed="0.001536"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:36.798515" elapsed="0.000364"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:30:36.795684" elapsed="0.003253"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:30:36.792376" elapsed="0.006599"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:30:36.799018" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:30:36.799177" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:30:36.791128" elapsed="0.008075"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:36.790795" elapsed="0.008491"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:36.799488" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:36.799312" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:36.790773" elapsed="0.008793"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:36.800334" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-f...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:30:36.799711" elapsed="0.000652"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:30:36.800412" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:30:36.786949" elapsed="0.013588"/>
</kw>
<msg time="2026-04-17T03:30:36.800593" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:36.774398" elapsed="0.026246"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:30:36.813344" 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_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-04-17T03:30:36.825486" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_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-04-17T03:30:36.837780" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:36.838012" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:36.838193" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:36.838584" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:36.838434" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:36.838417" 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-04-17T03:30:36.838805" 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-04-17T03:30:36.839007" 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-04-17T03:30:36.839177" elapsed="0.000042"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:30:36.838381" elapsed="0.000872"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:30:36.838273" elapsed="0.001007"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:36.839488" elapsed="0.000027"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:36.839641" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:30:36.839788" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-f...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:30:36.770118" elapsed="0.069698"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:36.841444" 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-04-17T03:30:36.841137" elapsed="0.000388">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-04-17T03:30:36.841625" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:36.840712" elapsed="0.000938"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:36.842005" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:36.841723" elapsed="0.000341"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:36.842580" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:36.842283" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:36.842089" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:36.841704" elapsed="0.000959"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:36.845252" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:30:36.842816" elapsed="0.002463"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:30:36.845332" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:30:36.845495" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:30:36.840338" elapsed="0.005181"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:36.846751" 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-04-17T03:30:36.846520" elapsed="0.000294">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-04-17T03:30:36.846908" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:36.846177" elapsed="0.000769"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:30:36.847153" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-17T03:30:36.847018" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:36.847000" elapsed="0.000235"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:36.847422" 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-04-17T03:30:36.847597" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:30:36.847662" elapsed="0.000014"/>
</return>
<msg time="2026-04-17T03:30:36.849608" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:30:36.845832" elapsed="0.003809"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:36.851134" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:36.850856" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:36.851598" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:36.851336" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:30:36.856862" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:37.058602" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:37.461627" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:37.464802" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:30:36.853814" elapsed="0.616228">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:36.851708" elapsed="0.618484">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:37.470554" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:37.470254" elapsed="0.000397"/>
</branch>
<status status="FAIL" start="2026-04-17T03:30:36.851689" elapsed="0.618996">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:37.471309" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:37.471507" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:37.471452" elapsed="0.000152"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:37.471426" elapsed="0.000217"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:37.471853" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:30:37.472013" 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-04-17T03:30:36.849979" elapsed="0.622233">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:37.472332" 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-04-17T03:30:36.746279" elapsed="0.726206">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:37.472971" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:37.472687" elapsed="0.000390"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:37.472662" elapsed="0.000768"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:37.473482" elapsed="0.000021"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-04-17T03:30:36.741448" elapsed="0.732182">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:30:37.473784" level="FAIL">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-17T03:30:31.248597" elapsed="6.225349">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:30:37.474232" elapsed="0.000031"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:30:37.474502" elapsed="0.000029"/>
</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="NOT RUN" start="2026-04-17T03:30:37.474755" elapsed="0.000028"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:30:37.475014" elapsed="0.000029"/>
</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-04-17T03:30:37.475432" elapsed="0.003685"/>
</kw>
<arg>rt_constrain_default</arg>
<arg>${RT_CONSTRAIN_DIR}</arg>
<status status="FAIL" start="2026-04-17T03:30:31.239551" elapsed="6.239654">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:31.165498" elapsed="6.313905">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:30:37.483301" elapsed="0.000359"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:30:37.482910" elapsed="0.000827"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:37.485183" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:37.485013" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:37.484982" elapsed="0.000295"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:37.491686" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:37.491490" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:37.491468" elapsed="0.000295"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:37.493030" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:30:37.492560" elapsed="0.000500"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:30:37.493621" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:30:37.493260" elapsed="0.000398"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:30:37.493717" elapsed="0.000049"/>
</return>
<msg time="2026-04-17T03:30:37.493947" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:30:37.492118" elapsed="0.001857"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:37.499998" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:37.499847" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:37.499823" 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-04-17T03:30:37.501565" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:37.501451" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:37.501433" elapsed="0.000203"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:37.502181" level="INFO">${karaf_connection_index} = 20</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:30:37.501791" elapsed="0.000425"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:37.502611" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:30:37.502384" elapsed="0.000253"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:30:37.503448" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:30:37.503168" elapsed="0.001050">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:30:37.504453" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:30:37.504512" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:37.502798" elapsed="0.001740"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:30:37.505409" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:30:37.505095" elapsed="0.001113">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:30:37.506411" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:30:37.506461" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:37.504719" elapsed="0.001767"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:30:37.507526" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Odl_To_Play_rt_constrain_type_0"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:30:37.506843" elapsed="0.000797">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Odl_To_Play_rt_constrain_type_0"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:37.506576" elapsed="0.001137">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Odl_To_Play_rt_constrain_type_0"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:30:37.506551" elapsed="0.001197">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Odl_To_Play_rt_constrain_type_0"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:37.507918" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:37.508166" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:37.508022" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:37.508005" elapsed="0.000236"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:30:37.508277" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:30:37.510893" elapsed="0.000172"/>
</kw>
<msg time="2026-04-17T03:30:37.511156" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:37.509816" elapsed="0.001525"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:37.511731" elapsed="0.000081"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:37.512202" 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-04-17T03:30:37.509172" elapsed="0.003233"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:30:37.508583" elapsed="0.003892"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:30:37.501136" elapsed="0.011425">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Odl_To_Play_rt_constrain_type_0"</status>
</kw>
<msg time="2026-04-17T03:30:37.512667" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:30:37.512848" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Odl_To_Play_rt_constrain_type_0"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:37.500276" elapsed="0.012604"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:30:37.513090" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:37.512977" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:37.512957" elapsed="0.000201"/>
</if>
<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-04-17T03:30:37.514267" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:37.514157" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:37.514138" elapsed="0.000198"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:37.514621" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:30:37.514727" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:30:37.514492" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:37.515283" level="INFO">{1: 20}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:37.514915" elapsed="0.000415"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:37.515823" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:37.515492" elapsed="0.000377"/>
</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-04-17T03:30:37.516433" elapsed="0.000268"/>
</kw>
<msg time="2026-04-17T03:30:37.516800" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:30:37.516845" level="INFO">${old_connection_index} = 20</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:37.516051" elapsed="0.000817"/>
</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-04-17T03:30:37.517692" elapsed="0.000192"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:30:37.519063" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:30:37.518630" elapsed="0.001363">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:37.518155" elapsed="0.001938"/>
</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-04-17T03:30:37.520732" elapsed="0.000293"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:37.520268" elapsed="0.000840"/>
</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-04-17T03:30:37.517184" elapsed="0.003970"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:37.516958" elapsed="0.004245"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:37.516938" elapsed="0.004292"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:37.522189" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:30:37.521800" elapsed="0.000416"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:30:37.522265" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:30:37.522425" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:30:37.521454" elapsed="0.000995"/>
</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-04-17T03:30:37.522605" elapsed="0.000453"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:37.523349" level="INFO">index=21
host=10.30.170.120
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-04-17T03:30:37.523509" level="INFO">${karaf_connection_object} = index=21
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:30:37.523236" elapsed="0.000300"/>
</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-04-17T03:30:37.523764" elapsed="0.003703"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:30:37.527967" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:30:37.529096" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:30:37.527681" elapsed="0.001833">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:30:37.543898" elapsed="0.000428"/>
</kw>
<msg time="2026-04-17T03:30:37.544426" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:37.542311" elapsed="0.002274"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:37.544752" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:37.544918" elapsed="0.000037"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:30:37.530528" elapsed="0.014492"/>
</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-04-17T03:30:37.529839" elapsed="0.015227"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:30:37.513773" elapsed="0.031382">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:37.545541" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:30:37.545618" 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="FAIL" start="2026-04-17T03:30:37.499381" elapsed="0.046350">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:30:37.545844" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:30:37.545888" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:37.494382" elapsed="0.051530"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:37.546416" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:37.546149" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:37.546128" elapsed="0.000367"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:30:37.494231" elapsed="0.052288"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:30:37.494040" elapsed="0.052513"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:30:37.491057" elapsed="0.055552"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:30:37.484582" elapsed="0.062082"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:37.483969" elapsed="0.062740"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:30:37.480157" elapsed="0.066603"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:37.547710" 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-04-17T03:30:37.547877" 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-04-17T03:30:37.547453" elapsed="0.000450"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-17T03:30:37.548295" 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-04-17T03:30:37.548078" elapsed="0.000292"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:37.548718" 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-04-17T03:30:37.548850" 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-04-17T03:30:37.548530" elapsed="0.000346"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-17T03:30:37.549251" 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-04-17T03:30:37.549047" elapsed="0.000230"/>
</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-04-17T03:30:37.549561" elapsed="0.002632"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:37.549347" elapsed="0.002882"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:37.549330" elapsed="0.002925"/>
</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-04-17T03:30:37.587765" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:37.587278" elapsed="0.000524"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:37.588687" 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-04-17T03:30:37.588393" elapsed="0.000372">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-04-17T03:30:37.588862" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:37.588003" elapsed="0.000884"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:37.589481" 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-04-17T03:30:37.589075" elapsed="0.000434"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:37.589823" 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-04-17T03:30:37.590015" 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-04-17T03:30:37.589676" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:37.590474" 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-04-17T03:30:37.590204" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:37.591646" level="INFO">mapping: {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:37.591330" elapsed="0.000364"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:37.592170" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:30:37.591859" elapsed="0.000337"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:37.592887" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:37.592569" elapsed="0.000352"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:37.594006" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:37.593498" elapsed="0.000536"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:37.594089" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:30:37.594255" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:37.593137" elapsed="0.001142"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:37.594441" elapsed="0.000247"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:30:37.592430" elapsed="0.002299"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:37.595354" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:37.595048" elapsed="0.000332"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:37.596624" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:37.596117" elapsed="0.000541"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:37.596724" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:30:37.596920" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:37.595589" 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-04-17T03:30:37.597165" elapsed="0.000234"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:30:37.594896" elapsed="0.002548"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:30:37.592250" elapsed="0.005230"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:30:37.597524" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:30:37.597688" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:30:37.590983" elapsed="0.006731"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:37.590604" elapsed="0.007142"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:37.597955" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:37.597772" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:37.590580" elapsed="0.007479"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:37.599060" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:30:37.598211" elapsed="0.000880"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:30:37.599160" elapsed="0.000041"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_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-04-17T03:30:37.586472" elapsed="0.012839"/>
</kw>
<msg time="2026-04-17T03:30:37.599368" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:37.573249" elapsed="0.026171"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:30:37.612065" 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_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-04-17T03:30:37.626479" elapsed="0.000045"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:30:37.639543" elapsed="0.000032"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:37.639913" elapsed="0.000044"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:37.640214" 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-04-17T03:30:37.640678" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:37.640492" elapsed="0.000252"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:37.640475" elapsed="0.000297"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:37.640921" elapsed="0.000037"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:37.641110" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:37.641278" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:30:37.640434" elapsed="0.000896"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:30:37.640305" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:37.641509" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:37.641610" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:30:37.641813" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:30:37.568802" elapsed="0.073041"/>
</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-04-17T03:30:37.668069" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:37.667563" elapsed="0.000549"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:37.669070" 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-04-17T03:30:37.668704" elapsed="0.000456">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-04-17T03:30:37.669271" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:37.668303" elapsed="0.000996"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:37.669860" 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-04-17T03:30:37.669470" elapsed="0.000417"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:37.670219" 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-04-17T03:30:37.670396" 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-04-17T03:30:37.670072" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:37.670838" 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-04-17T03:30:37.670587" 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-04-17T03:30:37.671503" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:37.671144" elapsed="0.000541"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:37.672248" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:37.671879" elapsed="0.000397"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:37.671715" elapsed="0.000597"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:37.671118" elapsed="0.001218"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:37.673010" 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-04-17T03:30:37.672495" elapsed="0.000546"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:30:37.673095" 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/app.vanadium/${file_name} exists. If yes read and 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-04-17T03:30:37.666781" elapsed="0.006464"/>
</kw>
<msg time="2026-04-17T03:30:37.673309" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:37.653482" elapsed="0.019882"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:30:37.686735" 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_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-04-17T03:30:37.699915" 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/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-04-17T03:30:37.712554" elapsed="0.000043"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:37.712887" 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-04-17T03:30:37.713196" 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-04-17T03:30:37.713786" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:37.713570" elapsed="0.000285"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:37.713546" elapsed="0.000337"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:37.714095" 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-04-17T03:30:37.714342" 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-04-17T03:30:37.714584" elapsed="0.000031"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:30:37.713493" elapsed="0.001168"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:30:37.713319" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:37.714903" elapsed="0.000133"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:37.715121" elapsed="0.000025"/>
</return>
<msg time="2026-04-17T03:30:37.715322" 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-04-17T03:30:37.652434" elapsed="0.062920"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:37.717273" 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-04-17T03:30:37.716905" elapsed="0.000449">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-04-17T03:30:37.717470" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:37.716186" elapsed="0.001325"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:37.717917" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:37.717608" elapsed="0.000387"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:37.718584" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:37.718265" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:37.718044" elapsed="0.000601"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:37.717586" elapsed="0.001081"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:37.721188" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:30:37.718824" elapsed="0.002393"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:30:37.721273" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:30:37.721443" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:30:37.715778" elapsed="0.005690"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:37.723591" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:30:37.723251" elapsed="0.000427"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:37.724166" 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-04-17T03:30:37.723849" elapsed="0.000374"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:37.724626" 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-04-17T03:30:37.724380" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:37.725117" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:37.724821" elapsed="0.000355"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:37.726186" 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-04-17T03:30:37.725956" elapsed="0.000257"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:30:37.726551" 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-04-17T03:30:37.726374" elapsed="0.000202"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:37.726729" elapsed="0.000237"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:37.727384" 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-04-17T03:30:37.727133" elapsed="0.000370"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:30:37.727549" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:30:37.727786" 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-04-17T03:30:37.725435" elapsed="0.002378"/>
</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-04-17T03:30:37.733573" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:37.935896" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:38.338393" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:38.341085" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:30:37.730280" elapsed="0.613637">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:37.727895" elapsed="0.616196">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:30:38.344487" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:38.344158" elapsed="0.000429"/>
</branch>
<status status="FAIL" start="2026-04-17T03:30:37.727875" elapsed="0.616750">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:30:38.345291" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:38.345500" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:38.345442" elapsed="0.000124"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:38.345412" elapsed="0.000187"/>
</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-04-17T03:30:38.345819" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:30:38.345917" elapsed="0.000049"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>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="FAIL" start="2026-04-17T03:30:37.721899" elapsed="0.624215">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:38.346237" elapsed="0.000026"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>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="FAIL" start="2026-04-17T03:30:37.557423" elapsed="0.788964">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:38.346898" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:38.346629" elapsed="0.000383"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:38.346602" elapsed="0.000446"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:38.347093" elapsed="0.000021"/>
</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="FAIL" start="2026-04-17T03:30:37.552537" elapsed="0.794697">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:30:38.347458" elapsed="0.000024"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<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="NOT RUN" start="2026-04-17T03:30:38.347697" elapsed="0.000025"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:38.347953" elapsed="0.000024"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations">
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:38.348181" elapsed="0.000032"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:30:38.348440" elapsed="0.000025"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<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="NOT RUN" start="2026-04-17T03:30:38.348676" elapsed="0.000024"/>
</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-04-17T03:30:38.401370" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:38.400803" elapsed="0.000611"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:38.402511" 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-04-17T03:30:38.402137" elapsed="0.000474">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-04-17T03:30:38.402735" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:38.401649" elapsed="0.001117"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:38.403511" 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-04-17T03:30:38.403008" elapsed="0.000538"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:38.403992" 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-04-17T03:30:38.404200" 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-04-17T03:30:38.403762" elapsed="0.000473"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:38.404795" 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-04-17T03:30:38.404465" elapsed="0.000521"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:38.406198" level="INFO">mapping: {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:38.405910" elapsed="0.000335"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:38.406725" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:30:38.406409" elapsed="0.000346"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:38.407832" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:38.407213" elapsed="0.000657"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:38.409122" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:38.408616" elapsed="0.000549"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:38.409290" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:30:38.409535" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:38.408120" elapsed="0.001441"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:38.409720" elapsed="0.000697"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:30:38.407033" elapsed="0.003430"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:38.411420" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:38.410726" elapsed="0.000729"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:38.413201" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:38.412359" elapsed="0.000887"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:38.413378" elapsed="0.000045"/>
</return>
<msg time="2026-04-17T03:30:38.413656" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:38.411699" 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-04-17T03:30:38.413889" elapsed="0.000583"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:30:38.410586" elapsed="0.003937"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:30:38.406814" elapsed="0.007752"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:30:38.414620" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:30:38.414817" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:30:38.405478" elapsed="0.009372"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:38.405080" elapsed="0.009807"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:38.415135" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:38.414921" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:38.405053" elapsed="0.010187"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:38.416332" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:30:38.415453" elapsed="0.000919"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:30:38.416438" elapsed="0.000045"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/app.vanadium/${file_name} exists. If yes read and 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-04-17T03:30:38.399850" elapsed="0.016767"/>
</kw>
<msg time="2026-04-17T03:30:38.416695" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:38.386077" elapsed="0.030707"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:30:38.433025" elapsed="0.000069"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:30:38.448131" elapsed="0.000063"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:30:38.465035" elapsed="0.000059"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:38.465389" 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-04-17T03:30:38.465631" 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-04-17T03:30:38.466173" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:38.465979" elapsed="0.000262"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:38.465956" elapsed="0.000318"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:38.466480" 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-04-17T03:30:38.466697" 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-04-17T03:30:38.466902" elapsed="0.000049"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:30:38.465895" elapsed="0.001110"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:30:38.465739" elapsed="0.001305"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:38.467263" elapsed="0.000030"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:38.467374" elapsed="0.000025"/>
</return>
<msg time="2026-04-17T03:30:38.467604" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:30:38.380609" elapsed="0.087036"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:38.469452" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:30:38.469039" elapsed="0.000479"/>
</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-04-17T03:30:38.475770" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:38.677713" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:39.080752" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:39.083809" level="INFO">${response} = None</msg>
<msg time="2026-04-17T03:30:39.084038" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:38.472450" elapsed="0.615275">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:38.469600" elapsed="0.618266">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:39.088279" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:39.087949" elapsed="0.000424"/>
</branch>
<status status="FAIL" start="2026-04-17T03:30:38.469578" elapsed="0.618829">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:39.094244" 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-04-17T03:30:39.090726" elapsed="0.003573">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:39.090340" elapsed="0.004053">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:30:39.090299" elapsed="0.004142">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-04-17T03:30:39.097645" 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-04-17T03:30:39.094873" elapsed="0.002807">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:39.094549" elapsed="0.003196">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:30:39.094526" elapsed="0.003251">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:39.098436" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:30:39.098002" elapsed="0.000462"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:39.098779" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:39.098534" elapsed="0.000332"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:39.099425" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:39.099103" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:39.098902" elapsed="0.000585"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:39.098516" elapsed="0.000993"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:39.100092" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:30:39.099673" elapsed="0.000447"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:39.100433" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:39.100190" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:39.101075" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:39.100745" elapsed="0.000357"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:39.100538" elapsed="0.000600"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:39.100172" elapsed="0.000987"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:39.101318" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-17T03:30:39.102190" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:30:39.101862" elapsed="0.000397"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-04-17T03:30:39.104725" 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-04-17T03:30:39.102421" elapsed="0.002339">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-04-17T03:30:39.089561" elapsed="0.015353">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-04-17T03:30:39.105021" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:30:39.107552" level="INFO">${response_text} = None</msg>
<msg time="2026-04-17T03:30:39.107584" 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-04-17T03:30:38.468104" elapsed="0.639510">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-04-17T03:30:39.107683" elapsed="0.000028"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="FAIL" start="2026-04-17T03:30:38.350117" elapsed="0.757745">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:38.349586" elapsed="0.758357"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-04-17T03:30:38.349002" elapsed="0.759078"/>
</kw>
<arg>rt_constrain_type_0</arg>
<arg>${RT_CONSTRAIN_DIR}</arg>
<status status="FAIL" start="2026-04-17T03:30:37.547068" elapsed="1.561093">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:37.479686" elapsed="1.628644">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:30:39.111763" elapsed="0.000251"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:30:39.111490" 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-04-17T03:30:39.113123" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:39.112997" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:39.112976" elapsed="0.000218"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:39.118351" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:39.118232" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:39.118213" elapsed="0.000208"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:39.119497" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:30:39.119090" elapsed="0.000435"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:30:39.120134" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:30:39.119689" elapsed="0.000482"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:30:39.120232" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:30:39.120399" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:30:39.118659" elapsed="0.001765"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:39.126460" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:39.126344" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:39.126317" elapsed="0.000258"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:39.127825" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:39.127712" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:39.127694" elapsed="0.000204"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:39.128497" level="INFO">${karaf_connection_index} = 21</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:30:39.128162" elapsed="0.000362"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:39.128908" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:30:39.128690" elapsed="0.000265"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:30:39.129744" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:30:39.129475" elapsed="0.000949">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:30:39.130614" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:30:39.130660" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:39.129119" elapsed="0.001564"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:30:39.131464" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:30:39.131221" elapsed="0.000937">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:30:39.132344" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:30:39.132393" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:39.130852" elapsed="0.001564"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:30:39.133346" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Play_To_Odl_rt_constrain_type_0"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:30:39.132713" elapsed="0.000694">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Play_To_Odl_rt_constrain_type_0"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:39.132491" elapsed="0.000985">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Play_To_Odl_rt_constrain_type_0"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:30:39.132472" elapsed="0.001037">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Play_To_Odl_rt_constrain_type_0"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:39.133672" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:39.133899" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:39.133758" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:39.133740" elapsed="0.000252"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:30:39.134025" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:30:39.136644" elapsed="0.000144"/>
</kw>
<msg time="2026-04-17T03:30:39.136854" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:39.135507" elapsed="0.001515"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:39.137297" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:39.137630" 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-04-17T03:30:39.134871" 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-04-17T03:30:39.134325" elapsed="0.003550"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:30:39.127396" elapsed="0.010580">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Play_To_Odl_rt_constrain_type_0"</status>
</kw>
<msg time="2026-04-17T03:30:39.138082" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:30:39.138126" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Play_To_Odl_rt_constrain_type_0"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:39.126739" elapsed="0.011415"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:30:39.138344" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:39.138231" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:39.138213" elapsed="0.000240"/>
</if>
<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-04-17T03:30:39.139480" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:39.139374" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:39.139357" elapsed="0.000189"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:39.139821" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:30:39.139954" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:30:39.139700" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:39.140431" level="INFO">{1: 21}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:39.140170" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:39.140867" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:39.140627" elapsed="0.000283"/>
</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-04-17T03:30:39.141467" elapsed="0.000265"/>
</kw>
<msg time="2026-04-17T03:30:39.141829" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:30:39.141875" level="INFO">${old_connection_index} = 21</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:39.141095" elapsed="0.000802"/>
</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-04-17T03:30:39.142720" elapsed="0.000193"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:30:39.144166" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:30:39.143672" elapsed="0.001467">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:39.143193" elapsed="0.002045"/>
</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-04-17T03:30:39.145876" elapsed="0.000296"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:39.145413" elapsed="0.000842"/>
</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-04-17T03:30:39.142210" elapsed="0.004091"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:39.141988" elapsed="0.004360"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:39.141970" elapsed="0.004404"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:39.147248" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:30:39.146917" elapsed="0.000357"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:30:39.147322" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:30:39.147473" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:30:39.146582" elapsed="0.000915"/>
</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-04-17T03:30:39.147657" elapsed="0.000473"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:39.148414" level="INFO">index=22
host=10.30.170.120
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-04-17T03:30:39.148512" level="INFO">${karaf_connection_object} = index=22
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:30:39.148306" 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-04-17T03:30:39.148689" elapsed="0.002353"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:30:39.151464" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:30:39.152526" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:30:39.151208" elapsed="0.001812">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:30:39.166754" elapsed="0.000600"/>
</kw>
<msg time="2026-04-17T03:30:39.167520" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:39.165319" elapsed="0.002390"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:39.167884" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:39.168324" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:30:39.153837" elapsed="0.014575"/>
</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-04-17T03:30:39.153318" elapsed="0.015143"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:30:39.139080" elapsed="0.029477">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:39.169025" elapsed="0.000030"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:30:39.169107" elapsed="0.000023"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:30:39.125893" elapsed="0.043342">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:30:39.169355" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:30:39.169400" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:39.120830" elapsed="0.048594"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:39.169801" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:39.169510" elapsed="0.000345"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:39.169488" elapsed="0.000391"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:30:39.120676" elapsed="0.049229"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:30:39.120490" elapsed="0.049468"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:30:39.117804" elapsed="0.052216"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:30:39.112671" elapsed="0.057406"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:39.112226" elapsed="0.057896"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:30:39.109254" elapsed="0.060923"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:39.171392" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:39.170841" elapsed="0.000579"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:39.172452" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:39.171590" elapsed="0.000899"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:39.173141" 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-04-17T03:30:39.172708" elapsed="0.000463"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:39.173567" 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-04-17T03:30:39.173748" 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-04-17T03:30:39.173337" elapsed="0.000438"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:39.174156" 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-04-17T03:30:39.174290" 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-04-17T03:30:39.173952" elapsed="0.000365"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-04-17T03:30:39.174541" elapsed="0.002497"/>
</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-04-17T03:30:39.177264" elapsed="0.001578"/>
</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-04-17T03:30:39.235080" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:39.234642" elapsed="0.000474"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:39.235905" 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-04-17T03:30:39.235648" elapsed="0.000382">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-04-17T03:30:39.236132" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:39.235295" elapsed="0.000863"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:39.236721" 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-04-17T03:30:39.236328" elapsed="0.000421"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:39.237109" 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-04-17T03:30:39.237278" 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-04-17T03:30:39.236954" elapsed="0.000350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:39.237718" 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-04-17T03:30:39.237467" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:39.238968" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:39.238619" elapsed="0.000400"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:39.239526" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:30:39.239184" elapsed="0.000370"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:39.240484" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:39.239985" elapsed="0.000526"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:39.241850" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:39.241238" elapsed="0.000753"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:39.242098" elapsed="0.000048"/>
</return>
<msg time="2026-04-17T03:30:39.242445" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:39.240709" elapsed="0.001765"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:39.242639" elapsed="0.000480"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:30:39.239786" elapsed="0.003388"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:39.243867" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:39.243446" elapsed="0.000448"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:39.245378" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:39.244797" elapsed="0.000692"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:39.245569" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:30:39.245868" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:39.244326" elapsed="0.001568"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:39.246133" elapsed="0.000383"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:30:39.243304" elapsed="0.003255"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:30:39.239609" elapsed="0.006986"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:30:39.246640" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:30:39.246805" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:30:39.238265" elapsed="0.008566"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:39.237847" elapsed="0.009017"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:39.247096" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:39.246892" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:39.237823" elapsed="0.009361"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:39.247983" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-f...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:30:39.247337" elapsed="0.000713"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:30:39.248102" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:30:39.233946" elapsed="0.014287"/>
</kw>
<msg time="2026-04-17T03:30:39.248291" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:39.220338" elapsed="0.028006"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:30:39.263406" 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-04-17T03:30:39.275915" elapsed="0.000045"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:30:39.288662" elapsed="0.000037"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:39.288911" 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-04-17T03:30:39.289118" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:39.289543" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:39.289384" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:39.289367" 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-04-17T03:30:39.289843" 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-04-17T03:30:39.290080" elapsed="0.000108"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:39.290349" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:30:39.289327" elapsed="0.001078"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:30:39.289204" elapsed="0.001230"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:39.290585" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:39.290665" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:30:39.290821" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-f...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:30:39.215786" elapsed="0.075065"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:39.292414" 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-04-17T03:30:39.292083" elapsed="0.000430">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-04-17T03:30:39.292637" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:39.291629" elapsed="0.001041"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:39.293037" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:39.292746" elapsed="0.000351"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:39.293617" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:39.293313" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:39.293122" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:39.292727" elapsed="0.000973"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:39.296325" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:30:39.293856" elapsed="0.002496"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:30:39.296404" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:30:39.296566" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:30:39.291225" elapsed="0.005365"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:39.297964" 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-04-17T03:30:39.297681" elapsed="0.000353">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-04-17T03:30:39.298133" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:39.297288" elapsed="0.000871"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:30:39.298370" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:30:39.298231" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:39.298213" elapsed="0.000243"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:39.298607" 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-04-17T03:30:39.298837" elapsed="0.000029"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:30:39.298918" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:30:39.300991" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:30:39.296904" elapsed="0.004115"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:39.302622" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:39.302355" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:39.303187" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:39.302849" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:30:39.308440" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:39.514636" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:39.917652" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:39.920720" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:30:39.305450" elapsed="0.620406">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:39.303333" elapsed="0.622705">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:39.926506" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:39.926125" elapsed="0.000490"/>
</branch>
<status status="FAIL" start="2026-04-17T03:30:39.303311" elapsed="0.623341">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:39.927407" elapsed="0.000042"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:39.927665" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:39.927587" elapsed="0.000151"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:39.927549" elapsed="0.000222"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:39.928062" elapsed="0.000045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:30:39.928214" elapsed="0.000025"/>
</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-04-17T03:30:39.301405" elapsed="0.626981">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:39.928559" 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-04-17T03:30:39.192586" elapsed="0.736120">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:39.929137" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:39.928841" elapsed="0.000434"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:39.928817" elapsed="0.000508"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:39.929393" elapsed="0.000031"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-04-17T03:30:39.187584" elapsed="0.742014">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:41.987864" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:41.987417" elapsed="0.000486"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:41.988790" 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-04-17T03:30:41.988499" elapsed="0.000375">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-04-17T03:30:41.988992" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:41.988118" elapsed="0.000901"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:41.989624" 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-04-17T03:30:41.989207" elapsed="0.000447"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:41.990008" 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-04-17T03:30:41.990184" 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-04-17T03:30:41.989839" elapsed="0.000373"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:41.990673" 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-04-17T03:30:41.990404" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:41.991877" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:41.991548" elapsed="0.000405"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:41.992438" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:30:41.992141" elapsed="0.000325"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:41.993384" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:41.992941" elapsed="0.000472"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:41.994726" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:41.994138" elapsed="0.000753"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:41.994995" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:30:41.995319" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:41.993627" elapsed="0.001720"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:41.995526" elapsed="0.000426"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:30:41.992761" elapsed="0.003238"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:41.996955" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:41.996276" elapsed="0.000709"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:41.998291" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:41.997723" elapsed="0.000668"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:41.998467" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:30:41.998764" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:41.997197" elapsed="0.001593"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:41.998972" elapsed="0.000364"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:30:41.996123" elapsed="0.003256"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:30:41.992529" elapsed="0.006885"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:30:41.999457" elapsed="0.000027"/>
</return>
<msg time="2026-04-17T03:30:41.999614" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:30:41.991188" elapsed="0.008451"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:41.990809" elapsed="0.008862"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:41.999848" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:41.999696" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:41.990783" elapsed="0.009159"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:42.000698" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-f...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:30:42.000092" elapsed="0.000649"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:30:42.000791" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:30:41.986697" elapsed="0.014223"/>
</kw>
<msg time="2026-04-17T03:30:42.001108" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:41.973022" elapsed="0.028139"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:30:42.013641" 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-04-17T03:30:42.025992" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:42.038430" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:42.038646" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:42.038829" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:42.039251" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:42.039094" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:42.039077" 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-04-17T03:30:42.039492" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:42.039665" 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-04-17T03:30:42.039837" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:30:42.039039" elapsed="0.000853"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:30:42.038911" elapsed="0.001009"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:42.040094" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:42.040175" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:30:42.040343" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-f...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:30:41.968695" elapsed="0.071685"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:42.041978" 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-04-17T03:30:42.041627" elapsed="0.000431">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-04-17T03:30:42.042156" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:42.041153" elapsed="0.001027"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:42.042542" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:42.042255" elapsed="0.000347"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:42.043136" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:42.042816" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:42.042627" elapsed="0.000571"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:42.042235" elapsed="0.000984"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:42.046115" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:30:42.043374" elapsed="0.002770"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:30:42.046201" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:30:42.046369" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:30:42.040760" elapsed="0.005636"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:42.047732" 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-04-17T03:30:42.047482" elapsed="0.000374">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-04-17T03:30:42.047978" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:42.047111" elapsed="0.000896"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:30:42.048230" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-17T03:30:42.048084" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:42.048064" elapsed="0.000256"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:42.048487" 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-04-17T03:30:42.048678" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:30:42.048766" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:30:42.050939" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:30:42.046736" elapsed="0.004233"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:42.052523" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:42.052244" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:42.053065" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:42.052776" elapsed="0.000337"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:30:42.058733" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:42.260312" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:42.664093" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:42.666876" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:30:42.055477" elapsed="0.616185">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:42.053185" elapsed="0.618628">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:42.672199" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:42.671874" elapsed="0.000423"/>
</branch>
<status status="FAIL" start="2026-04-17T03:30:42.053166" elapsed="0.619165">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:42.672940" elapsed="0.000056"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:42.673241" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:42.673184" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:42.673157" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:42.673544" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:30:42.673643" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:30:42.051320" elapsed="0.622481">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:42.673913" elapsed="0.000026"/>
</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-04-17T03:30:41.945789" elapsed="0.728297">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:42.674534" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:42.674266" elapsed="0.000372"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:42.674234" elapsed="0.000439"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:42.674718" elapsed="0.000020"/>
</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-04-17T03:30:41.940200" elapsed="0.734660">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:44.735000" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:44.734497" elapsed="0.000560"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:44.736161" 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-04-17T03:30:44.735727" elapsed="0.000566">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-04-17T03:30:44.736420" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:44.735289" elapsed="0.001162"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:44.737231" 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-04-17T03:30:44.736681" elapsed="0.000593"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:44.737656" 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-04-17T03:30:44.737880" 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-04-17T03:30:44.737488" elapsed="0.000558"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:44.738533" 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-04-17T03:30:44.738260" elapsed="0.000326"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:44.739985" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:44.739519" elapsed="0.000536"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:44.740648" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:30:44.740284" elapsed="0.000399"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:44.741654" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:44.741191" elapsed="0.000489"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:44.742992" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:44.742374" elapsed="0.000727"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:44.743185" elapsed="0.000048"/>
</return>
<msg time="2026-04-17T03:30:44.743514" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:44.741884" elapsed="0.001656"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:44.743701" elapsed="0.000443"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:30:44.741038" elapsed="0.003151"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:44.745124" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:44.744441" elapsed="0.000710"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:44.748655" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:44.747626" elapsed="0.001193"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:44.748994" elapsed="0.000093"/>
</return>
<msg time="2026-04-17T03:30:44.749555" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:44.745941" elapsed="0.003654"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:44.749842" elapsed="0.000671"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:30:44.744306" elapsed="0.006279"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:30:44.740778" elapsed="0.009878"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:30:44.750737" elapsed="0.000047"/>
</return>
<msg time="2026-04-17T03:30:44.751031" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:30:44.739177" elapsed="0.011896"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:44.738689" elapsed="0.012443"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:44.751482" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:44.751195" elapsed="0.000374"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:44.738653" elapsed="0.012948"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:44.753280" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-f...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:30:44.751866" elapsed="0.001463"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:30:44.753403" 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/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-04-17T03:30:44.733699" elapsed="0.019998"/>
</kw>
<msg time="2026-04-17T03:30:44.753814" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:44.719728" elapsed="0.034190"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:30:44.769253" elapsed="0.000219"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:30:44.783346" elapsed="0.000061"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:30:44.797392" elapsed="0.000049"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:44.797774" 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-04-17T03:30:44.798072" 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-04-17T03:30:44.798776" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:44.798549" elapsed="0.000308"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:44.798520" elapsed="0.000385"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:44.799148" 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-04-17T03:30:44.799393" 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-04-17T03:30:44.799642" elapsed="0.000032"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:30:44.798446" elapsed="0.001276"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:30:44.798213" elapsed="0.001552"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:44.800006" elapsed="0.000032"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:44.800127" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:30:44.800414" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-f...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:30:44.715029" elapsed="0.085431"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:44.802752" 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-04-17T03:30:44.802216" elapsed="0.000650">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-04-17T03:30:44.803037" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:44.801546" elapsed="0.001523"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:44.803519" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:44.803165" elapsed="0.000505"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:44.804450" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:44.803990" elapsed="0.000494"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:44.803708" elapsed="0.000826"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:44.803140" elapsed="0.001426"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:44.808285" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:30:44.804788" elapsed="0.003531"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:30:44.808389" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:30:44.808596" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:30:44.800990" elapsed="0.007636"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:44.810272" 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-04-17T03:30:44.809935" elapsed="0.000423">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-04-17T03:30:44.810476" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:44.809496" elapsed="0.001012"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:30:44.810838" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-17T03:30:44.810601" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:44.810577" elapsed="0.000411"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:44.811208" 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-04-17T03:30:44.811464" elapsed="0.000030"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:30:44.811559" elapsed="0.000023"/>
</return>
<msg time="2026-04-17T03:30:44.814230" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:30:44.809062" elapsed="0.005207"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:44.816554" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:44.816186" elapsed="0.000433"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:44.817186" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:44.816830" elapsed="0.000411"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:30:44.822770" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:45.024892" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:45.427976" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:45.430229" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:30:44.819597" elapsed="0.614090">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:44.817325" elapsed="0.616607">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:45.434380" elapsed="0.000062"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:45.434021" elapsed="0.000492"/>
</branch>
<status status="FAIL" start="2026-04-17T03:30:44.817302" elapsed="0.617245">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:45.435199" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:45.435431" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:45.435343" elapsed="0.000165"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:45.435317" elapsed="0.000226"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:45.435762" elapsed="0.000042"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:30:45.435895" elapsed="0.000030"/>
</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-04-17T03:30:44.814750" elapsed="0.621401">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:45.436304" elapsed="0.000032"/>
</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-04-17T03:30:44.691199" elapsed="0.745301">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:45.437579" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:45.436738" elapsed="0.000987"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:45.436694" elapsed="0.001080"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:45.437834" 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-04-17T03:30:44.685502" elapsed="0.752564">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:30:45.438245" level="FAIL">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-17T03:30:39.179059" elapsed="6.259337">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:30:45.438742" elapsed="0.000034"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:30:45.439075" elapsed="0.000040"/>
</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="NOT RUN" start="2026-04-17T03:30:45.439417" elapsed="0.000095"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:30:45.439813" elapsed="0.000034"/>
</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-04-17T03:30:45.440270" elapsed="0.003242"/>
</kw>
<arg>rt_constrain_type_0</arg>
<arg>${RT_CONSTRAIN_DIR}</arg>
<status status="FAIL" start="2026-04-17T03:30:39.170440" elapsed="6.273192">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:39.108718" elapsed="6.335125">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:30:45.447536" elapsed="0.000363"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:30:45.447258" elapsed="0.000721"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:45.449337" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:45.449133" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:45.449103" elapsed="0.000379"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:45.457422" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:45.457273" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:45.457250" elapsed="0.000246"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:45.458624" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:30:45.458165" elapsed="0.000491"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:30:45.459156" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:30:45.458824" elapsed="0.000359"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:30:45.459227" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:30:45.459390" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:30:45.457751" elapsed="0.001663"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:45.465433" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:45.465316" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:45.465297" elapsed="0.000208"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:45.466767" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:45.466656" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:45.466638" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:45.467400" level="INFO">${karaf_connection_index} = 22</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:30:45.467025" elapsed="0.000405"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:45.467856" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:30:45.467617" elapsed="0.000265"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:30:45.468852" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:30:45.468533" elapsed="0.001086">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:30:45.469813" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:30:45.469861" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:45.468123" elapsed="0.001762"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:30:45.470677" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:30:45.470427" elapsed="0.000938">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:30:45.471551" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:30:45.471598" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:45.470078" elapsed="0.001543"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:30:45.472695" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Odl_To_Play_rt_constrain_type_1"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:30:45.471924" elapsed="0.000834">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Odl_To_Play_rt_constrain_type_1"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:45.471698" elapsed="0.001132">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Odl_To_Play_rt_constrain_type_1"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:30:45.471678" elapsed="0.001185">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Odl_To_Play_rt_constrain_type_1"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:45.473053" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:45.473284" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:45.473141" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:45.473124" elapsed="0.000255"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:30:45.473433" elapsed="0.000022"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:30:45.476073" elapsed="0.000170"/>
</kw>
<msg time="2026-04-17T03:30:45.476313" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:45.475002" elapsed="0.001460"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:45.476750" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:45.477115" 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-04-17T03:30:45.474350" elapsed="0.002952"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:30:45.473771" elapsed="0.003601"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:30:45.466309" elapsed="0.011178">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Odl_To_Play_rt_constrain_type_1"</status>
</kw>
<msg time="2026-04-17T03:30:45.477620" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:30:45.477668" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Odl_To_Play_rt_constrain_type_1"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:45.465668" elapsed="0.012024"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:30:45.477879" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:45.477769" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:45.477751" elapsed="0.000293"/>
</if>
<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-04-17T03:30:45.479078" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:45.478962" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:45.478931" elapsed="0.000238"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:45.479458" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:30:45.479563" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:30:45.479329" elapsed="0.000261"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:45.480134" level="INFO">{1: 22}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:45.479787" elapsed="0.000436"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:45.480667" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:45.480417" elapsed="0.000295"/>
</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-04-17T03:30:45.481361" elapsed="0.000273"/>
</kw>
<msg time="2026-04-17T03:30:45.481734" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:30:45.481781" level="INFO">${old_connection_index} = 22</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:45.480876" elapsed="0.000927"/>
</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-04-17T03:30:45.482722" elapsed="0.000194"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:30:45.484062" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:30:45.483588" elapsed="0.001389">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:45.483107" elapsed="0.001972"/>
</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-04-17T03:30:45.485723" elapsed="0.000312"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:45.485256" elapsed="0.000864"/>
</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-04-17T03:30:45.482209" elapsed="0.003956"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:45.481877" elapsed="0.004337"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:45.481860" elapsed="0.004379"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:45.487169" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:30:45.486786" elapsed="0.000411"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:30:45.487247" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:30:45.487402" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:30:45.486450" elapsed="0.000976"/>
</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-04-17T03:30:45.487588" elapsed="0.000544"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:45.488546" level="INFO">index=23
host=10.30.170.120
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-04-17T03:30:45.488656" level="INFO">${karaf_connection_object} = index=23
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:30:45.488358" elapsed="0.000324"/>
</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-04-17T03:30:45.488877" elapsed="0.004416"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:30:45.493783" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:30:45.495126" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:30:45.493475" elapsed="0.002195">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:30:45.510249" elapsed="0.000410"/>
</kw>
<msg time="2026-04-17T03:30:45.510764" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:45.508579" elapsed="0.002345"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:45.511110" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:45.511278" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:30:45.496800" elapsed="0.014562"/>
</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-04-17T03:30:45.496123" elapsed="0.015287"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:30:45.478647" elapsed="0.032854">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:45.511982" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:30:45.512062" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:30:45.464956" elapsed="0.047223">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:30:45.512297" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:30:45.512342" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:45.460007" elapsed="0.052360"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:45.512727" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:45.512454" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:45.512433" elapsed="0.000378"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:30:45.459656" elapsed="0.053179"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:30:45.459475" elapsed="0.053393"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:30:45.456789" elapsed="0.056143"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:30:45.448647" elapsed="0.064619"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:45.448156" elapsed="0.065158"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:30:45.444680" elapsed="0.068689"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:45.514294" 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-04-17T03:30:45.514474" 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-04-17T03:30:45.514078" elapsed="0.000422"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-17T03:30:45.514905" 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-04-17T03:30:45.514681" elapsed="0.000295"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:45.515344" 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-04-17T03:30:45.515480" 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-04-17T03:30:45.515148" elapsed="0.000358"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-17T03:30:45.515876" 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-04-17T03:30:45.515670" elapsed="0.000232"/>
</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-04-17T03:30:45.516213" elapsed="0.002572"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:45.515995" elapsed="0.002827"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:45.515975" elapsed="0.002873"/>
</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-04-17T03:30:45.557158" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:45.556698" elapsed="0.000502"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:45.558115" 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-04-17T03:30:45.557759" elapsed="0.000447">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-04-17T03:30:45.558380" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:45.557391" elapsed="0.001014"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:45.558999" 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-04-17T03:30:45.558576" elapsed="0.000451"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:45.559422" 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-04-17T03:30:45.559595" 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-04-17T03:30:45.559232" elapsed="0.000394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:45.560250" 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-04-17T03:30:45.559983" 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-04-17T03:30:45.561687" level="INFO">mapping: {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:45.561398" elapsed="0.000342"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:45.562460" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:30:45.562158" elapsed="0.000329"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:45.563210" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:45.562883" elapsed="0.000354"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:45.564317" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:45.563802" elapsed="0.000544"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:45.564405" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:30:45.564584" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:45.563449" elapsed="0.001161"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:45.564786" elapsed="0.000328"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:30:45.562739" elapsed="0.002421"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:45.565769" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:45.565458" elapsed="0.000336"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:45.567218" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:45.566770" elapsed="0.000475"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:45.567301" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:30:45.567459" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:45.566003" 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-04-17T03:30:45.567641" elapsed="0.000226"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:30:45.565285" elapsed="0.002623"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:30:45.562547" elapsed="0.005414"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:30:45.568009" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:30:45.568169" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:30:45.560968" elapsed="0.007226"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:45.560460" elapsed="0.007767"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:45.568406" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:45.568253" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:45.560420" elapsed="0.008063"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:45.569288" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:30:45.568635" elapsed="0.000684"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:30:45.569371" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:30:45.555899" elapsed="0.013662"/>
</kw>
<msg time="2026-04-17T03:30:45.569625" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:45.542661" elapsed="0.027017"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:30:45.584424" 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-04-17T03:30:45.602077" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/${file_name} exists. If yes read and 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-04-17T03:30:45.614709" elapsed="0.000037"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:45.614977" 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-04-17T03:30:45.615256" 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-04-17T03:30:45.615701" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:45.615535" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:45.615518" 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-04-17T03:30:45.615958" 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-04-17T03:30:45.616131" 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-04-17T03:30:45.616312" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:30:45.615481" elapsed="0.000884"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:30:45.615346" elapsed="0.001045"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:45.616538" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:45.616618" elapsed="0.000021"/>
</return>
<msg time="2026-04-17T03:30:45.616776" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:30:45.538093" elapsed="0.078712"/>
</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-04-17T03:30:45.644329" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:45.643787" elapsed="0.000587"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:45.645376" 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-04-17T03:30:45.645060" elapsed="0.000430">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-04-17T03:30:45.645629" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:45.644611" elapsed="0.001048"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:45.646339" 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-04-17T03:30:45.645868" elapsed="0.000500"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:45.646687" 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-04-17T03:30:45.646982" 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-04-17T03:30:45.646536" elapsed="0.000489"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:45.647609" 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-04-17T03:30:45.647257" elapsed="0.000584"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-17T03:30:45.648452" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:45.647979" elapsed="0.000573"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:45.649174" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:45.648766" elapsed="0.000457"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:45.648591" elapsed="0.000682"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:45.647927" elapsed="0.001377"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:45.650152" 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-04-17T03:30:45.649519" elapsed="0.000666"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:30:45.650239" elapsed="0.000063"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/${file_name} exists. If yes read and 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-04-17T03:30:45.642865" elapsed="0.007554"/>
</kw>
<msg time="2026-04-17T03:30:45.650489" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:45.628595" elapsed="0.021957"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:30:45.665639" elapsed="0.000056"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:30:45.680234" elapsed="0.000051"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_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-04-17T03:30:45.693303" elapsed="0.000032"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:45.693543" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:45.693773" 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-04-17T03:30:45.694288" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:45.694117" elapsed="0.000232"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:45.694097" 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-04-17T03:30:45.694524" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:45.694711" 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-04-17T03:30:45.694896" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:30:45.694050" elapsed="0.000918"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:30:45.693862" elapsed="0.001137"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:45.695151" elapsed="0.000036"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:45.695246" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:30:45.695417" 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-04-17T03:30:45.627565" elapsed="0.067884"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:45.697187" 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-04-17T03:30:45.696810" elapsed="0.000474">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-04-17T03:30:45.697390" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:45.696245" elapsed="0.001169"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:45.697778" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:45.697498" elapsed="0.000358"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:45.698399" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:45.698099" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:45.697883" elapsed="0.000578"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:45.697478" elapsed="0.001004"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:45.701541" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:30:45.698637" elapsed="0.003001"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:30:45.701698" elapsed="0.000078"/>
</return>
<msg time="2026-04-17T03:30:45.701961" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:30:45.695827" elapsed="0.006163"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:45.703601" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:30:45.703342" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:45.704132" 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-04-17T03:30:45.703807" elapsed="0.000390"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:45.704614" 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-04-17T03:30:45.704353" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:45.705124" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:45.704812" elapsed="0.000357"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:45.706069" 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-04-17T03:30:45.705837" elapsed="0.000265"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:30:45.706444" 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-04-17T03:30:45.706266" elapsed="0.000210"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:45.706629" elapsed="0.000212"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:45.707348" 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-04-17T03:30:45.707058" elapsed="0.000334"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:30:45.707449" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:30:45.707645" 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-04-17T03:30:45.705392" elapsed="0.002282"/>
</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-04-17T03:30:45.713883" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:45.916320" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:46.320314" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:46.323221" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:30:45.710403" elapsed="0.618551">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:45.707766" elapsed="0.621322">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:30:46.329467" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:46.329212" elapsed="0.000331"/>
</branch>
<status status="FAIL" start="2026-04-17T03:30:45.707748" elapsed="0.621820">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:30:46.330059" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:46.330223" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:46.330183" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:46.330162" elapsed="0.000131"/>
</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-04-17T03:30:46.330446" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:30:46.330515" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>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="FAIL" start="2026-04-17T03:30:45.702348" elapsed="0.628288">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:46.330720" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>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="FAIL" start="2026-04-17T03:30:45.525278" elapsed="0.805543">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:46.331166" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:46.330960" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:46.330923" elapsed="0.000339"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:46.331294" elapsed="0.000014"/>
</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="FAIL" start="2026-04-17T03:30:45.519165" elapsed="0.812233">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:30:46.331590" elapsed="0.000022"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<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="NOT RUN" start="2026-04-17T03:30:46.331830" elapsed="0.000023"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:46.332027" elapsed="0.000052"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations">
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:46.332248" elapsed="0.000023"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:30:46.332451" elapsed="0.000022"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<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="NOT RUN" start="2026-04-17T03:30:46.332677" elapsed="0.000024"/>
</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-04-17T03:30:46.378314" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:46.377828" elapsed="0.000534"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:46.379418" 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-04-17T03:30:46.379100" elapsed="0.000393">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-04-17T03:30:46.379604" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:46.378601" elapsed="0.001039"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:46.380426" 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-04-17T03:30:46.379871" elapsed="0.000594"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:46.380889" 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-04-17T03:30:46.381116" 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-04-17T03:30:46.380696" elapsed="0.000447"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:46.381557" 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-04-17T03:30:46.381305" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:46.382913" level="INFO">mapping: {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:46.382558" elapsed="0.000439"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:46.383510" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:30:46.383219" elapsed="0.000318"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:46.384493" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:46.383911" elapsed="0.000608"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:46.386121" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:46.385520" elapsed="0.000644"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:46.386299" elapsed="0.000049"/>
</return>
<msg time="2026-04-17T03:30:46.386551" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:46.384721" elapsed="0.001858"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:46.386741" elapsed="0.000540"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:30:46.383772" elapsed="0.003553"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:46.388166" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:46.387576" elapsed="0.000625"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:46.389705" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:46.388904" elapsed="0.000843"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:46.389866" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:30:46.390140" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:46.388415" 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-04-17T03:30:46.390367" elapsed="0.000644"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:30:46.387441" elapsed="0.003626"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:30:46.383594" elapsed="0.007521"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:30:46.391249" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:30:46.391474" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:30:46.382075" elapsed="0.009431"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:46.381683" elapsed="0.009860"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:46.391785" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:46.391572" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:46.381658" elapsed="0.010237"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:46.392903" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:30:46.392126" elapsed="0.000812"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:30:46.393004" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/app/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:30:46.377158" elapsed="0.016036"/>
</kw>
<msg time="2026-04-17T03:30:46.393262" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:46.364264" elapsed="0.029067"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:30:46.408351" elapsed="0.000087"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:30:46.424889" elapsed="0.000084"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:30:46.438416" elapsed="0.000053"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:46.438715" 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-04-17T03:30:46.438906" 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-04-17T03:30:46.439426" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:46.439208" elapsed="0.000291"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:46.439189" elapsed="0.000337"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:46.439676" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:46.439847" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:46.440036" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:30:46.439150" elapsed="0.000958"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:30:46.439013" elapsed="0.001122"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:46.440357" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:46.440439" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:30:46.440621" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:30:46.359680" elapsed="0.080974"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:46.442120" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:30:46.441725" elapsed="0.000461"/>
</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-04-17T03:30:46.447572" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:46.649630" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:47.054229" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:47.056888" level="INFO">${response} = None</msg>
<msg time="2026-04-17T03:30:47.056996" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:46.444397" elapsed="0.616013">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:46.442268" elapsed="0.618318">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:47.061026" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:47.060657" elapsed="0.000483"/>
</branch>
<status status="FAIL" start="2026-04-17T03:30:46.442249" elapsed="0.618937">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:47.066990" 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-04-17T03:30:47.063379" elapsed="0.003663">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:47.063029" elapsed="0.004111">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:30:47.062999" elapsed="0.004195">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-04-17T03:30:47.070334" 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-04-17T03:30:47.067614" elapsed="0.002808">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:47.067295" elapsed="0.003194">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:30:47.067271" elapsed="0.003250">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:47.071198" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:30:47.070732" elapsed="0.000494"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:47.071545" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:47.071298" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:47.072133" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:47.071796" elapsed="0.000368"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:47.071627" elapsed="0.000574"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:47.071279" elapsed="0.000942"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:47.072845" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:30:47.072411" elapsed="0.000463"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:47.073230" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:47.072964" elapsed="0.000330"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:47.073807" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:47.073483" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:47.073318" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:47.072927" elapsed="0.000963"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:47.074108" elapsed="0.000384"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-17T03:30:47.075154" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:30:47.074734" elapsed="0.000456"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-04-17T03:30:47.078045" 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-04-17T03:30:47.075399" elapsed="0.002684">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-04-17T03:30:47.062287" elapsed="0.015962">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-04-17T03:30:47.078319" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:30:47.080932" level="INFO">${response_text} = None</msg>
<msg time="2026-04-17T03:30:47.080980" 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-04-17T03:30:46.441017" elapsed="0.639993">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-04-17T03:30:47.081078" elapsed="0.000031"/>
</return>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="FAIL" start="2026-04-17T03:30:46.334000" elapsed="0.747293">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:46.333483" elapsed="0.747890"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-04-17T03:30:46.333016" elapsed="0.748428"/>
</kw>
<arg>rt_constrain_type_1</arg>
<arg>${RT_CONSTRAIN_DIR}</arg>
<status status="FAIL" start="2026-04-17T03:30:45.513671" elapsed="1.567854">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:45.444133" elapsed="1.637649">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:30:47.085568" elapsed="0.000255"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:30:47.085242" elapsed="0.000637"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:47.087143" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:47.086979" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:47.086934" elapsed="0.000296"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:47.094009" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:47.093807" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:47.093780" elapsed="0.000328"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:47.095647" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:30:47.095036" elapsed="0.000654"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:30:47.096382" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:30:47.095935" elapsed="0.000482"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:30:47.096478" elapsed="0.000048"/>
</return>
<msg time="2026-04-17T03:30:47.096703" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:30:47.094459" elapsed="0.002280"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:47.104129" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:47.103993" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:47.103968" 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-04-17T03:30:47.105672" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:47.105550" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:47.105530" elapsed="0.000222"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:47.106341" level="INFO">${karaf_connection_index} = 23</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:30:47.105965" elapsed="0.000408"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:47.106828" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:30:47.106573" elapsed="0.000285"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:30:47.107823" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:30:47.107497" elapsed="0.001191">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:30:47.108912" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:30:47.108988" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:47.107081" elapsed="0.001935"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:30:47.109999" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:30:47.109680" elapsed="0.001115">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:30:47.111043" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:30:47.111102" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:47.109264" elapsed="0.001868"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:30:47.112337" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Play_To_Odl_rt_constrain_type_1"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:30:47.111521" elapsed="0.000898">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Play_To_Odl_rt_constrain_type_1"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:47.111228" elapsed="0.001282">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Play_To_Odl_rt_constrain_type_1"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:30:47.111204" elapsed="0.001449">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Play_To_Odl_rt_constrain_type_1"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:47.112891" elapsed="0.000032"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:47.113268" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:47.113036" elapsed="0.000315"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:47.113010" elapsed="0.000376"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:30:47.113437" 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-04-17T03:30:47.116566" elapsed="0.000157"/>
</kw>
<msg time="2026-04-17T03:30:47.116793" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:47.115276" elapsed="0.001704"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:47.117369" elapsed="0.000090"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:47.117739" 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-04-17T03:30:47.114564" elapsed="0.003372"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:30:47.113847" elapsed="0.004248"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:30:47.105196" elapsed="0.012993">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Play_To_Odl_rt_constrain_type_1"</status>
</kw>
<msg time="2026-04-17T03:30:47.118306" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:30:47.118369" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Play_To_Odl_rt_constrain_type_1"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:47.104409" elapsed="0.013985"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:30:47.118595" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:47.118478" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:47.118459" elapsed="0.000204"/>
</if>
<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-04-17T03:30:47.119787" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:47.119639" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:47.119621" elapsed="0.000257"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:47.120280" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:30:47.120425" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:30:47.120110" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:47.121078" level="INFO">{1: 23}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:47.120696" elapsed="0.000443"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:47.121701" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:47.121379" elapsed="0.000378"/>
</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-04-17T03:30:47.122571" elapsed="0.000351"/>
</kw>
<msg time="2026-04-17T03:30:47.123090" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:30:47.123155" level="INFO">${old_connection_index} = 23</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:47.122060" elapsed="0.001128"/>
</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-04-17T03:30:47.124234" elapsed="0.000217"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:30:47.126123" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:30:47.125389" elapsed="0.002018">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:47.124687" elapsed="0.002858"/>
</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-04-17T03:30:47.128485" elapsed="0.000364"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:47.127793" elapsed="0.001180"/>
</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-04-17T03:30:47.123602" elapsed="0.005512"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:47.123292" elapsed="0.005893"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:47.123265" elapsed="0.005960"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:47.130532" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:30:47.130104" elapsed="0.000464"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:30:47.130633" elapsed="0.000054"/>
</return>
<msg time="2026-04-17T03:30:47.130866" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:30:47.129582" elapsed="0.001319"/>
</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-04-17T03:30:47.131145" elapsed="0.000568"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:47.132141" level="INFO">index=24
host=10.30.170.120
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-04-17T03:30:47.132277" level="INFO">${karaf_connection_object} = index=24
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:30:47.131981" elapsed="0.000333"/>
</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-04-17T03:30:47.132526" elapsed="0.003498"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:30:47.136468" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:30:47.137636" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:30:47.136199" elapsed="0.002014">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:30:47.154345" elapsed="0.000427"/>
</kw>
<msg time="2026-04-17T03:30:47.154880" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:47.152517" elapsed="0.002603"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:47.155368" elapsed="0.000032"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:47.155555" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:30:47.139144" elapsed="0.016497"/>
</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-04-17T03:30:47.138548" elapsed="0.017140"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:30:47.119298" elapsed="0.036500">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:47.156552" elapsed="0.000037"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:30:47.156643" elapsed="0.000023"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:30:47.103551" elapsed="0.053212">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:30:47.156881" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:30:47.156929" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:47.097423" elapsed="0.059546"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:47.157323" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:47.157057" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:47.157036" elapsed="0.000367"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:30:47.097209" elapsed="0.060219"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:30:47.096828" elapsed="0.060634"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:30:47.093268" elapsed="0.064254"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:30:47.086566" elapsed="0.071081"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:47.086096" elapsed="0.071599"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:30:47.082850" elapsed="0.074901"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:47.159019" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:47.158509" elapsed="0.000539"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:47.159704" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:47.159215" elapsed="0.000516"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:47.160512" 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-04-17T03:30:47.159898" elapsed="0.000641"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:47.160908" 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-04-17T03:30:47.161118" 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-04-17T03:30:47.160702" elapsed="0.000442"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:47.161486" 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-04-17T03:30:47.161612" 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-04-17T03:30:47.161298" elapsed="0.000339"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-04-17T03:30:47.161789" elapsed="0.002597"/>
</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-04-17T03:30:47.164568" elapsed="0.001952"/>
</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-04-17T03:30:47.224678" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:47.224255" elapsed="0.000458"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:47.225550" 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-04-17T03:30:47.225267" elapsed="0.000359">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-04-17T03:30:47.225721" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:47.224890" elapsed="0.000855"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:47.226348" 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-04-17T03:30:47.225913" elapsed="0.000463"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:47.226685" 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-04-17T03:30:47.226861" 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-04-17T03:30:47.226539" elapsed="0.000412"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:47.227366" 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-04-17T03:30:47.227118" elapsed="0.000352"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:47.228589" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:47.228247" elapsed="0.000389"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:47.229152" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:30:47.228800" elapsed="0.000383"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:47.230001" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:47.229558" elapsed="0.000477"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:47.231311" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:47.230718" elapsed="0.000693"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:47.231493" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:30:47.231801" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:47.230257" elapsed="0.001571"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:47.232023" elapsed="0.000393"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:30:47.229419" elapsed="0.003040"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:47.233147" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:47.232710" elapsed="0.000464"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:47.455744" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:47.455023" elapsed="0.000858"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:47.456030" elapsed="0.000065"/>
</return>
<msg time="2026-04-17T03:30:47.456423" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:47.454062" elapsed="0.002389"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:47.456622" elapsed="0.000429"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:30:47.232575" elapsed="0.224521"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:30:47.229240" elapsed="0.227897"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:30:47.457190" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:30:47.457396" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:30:47.227899" elapsed="0.229525"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:47.227551" elapsed="0.229907"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:47.457655" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:47.457489" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:47.227527" elapsed="0.230207"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:47.458662" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-f...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:30:47.457891" elapsed="0.000809"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:30:47.458759" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:30:47.223528" elapsed="0.235364"/>
</kw>
<msg time="2026-04-17T03:30:47.458975" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:47.210350" elapsed="0.248685"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:30:47.473271" 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-04-17T03:30:47.486801" 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/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-04-17T03:30:47.500251" elapsed="0.000045"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:47.500562" 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-04-17T03:30:47.500785" 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-04-17T03:30:47.501536" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:47.501336" elapsed="0.000263"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:47.501314" elapsed="0.000317"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:47.501807" 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-04-17T03:30:47.502030" 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-04-17T03:30:47.502226" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:30:47.501259" elapsed="0.001026"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:30:47.501103" elapsed="0.001214"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:47.502491" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:47.502592" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:30:47.502808" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-f...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:30:47.205705" elapsed="0.297135"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:47.504760" 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-04-17T03:30:47.504355" elapsed="0.000502">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-04-17T03:30:47.504999" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:47.503792" elapsed="0.001237"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:47.505428" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:47.505108" elapsed="0.000389"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:47.506128" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:47.505757" elapsed="0.000400"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:47.505525" elapsed="0.000672"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:47.505088" elapsed="0.001133"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:47.509373" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:30:47.506401" elapsed="0.003007"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:30:47.509549" elapsed="0.000048"/>
</return>
<msg time="2026-04-17T03:30:47.509756" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:30:47.503335" elapsed="0.006452"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:47.511534" 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-04-17T03:30:47.511135" elapsed="0.000494">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-04-17T03:30:47.511746" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:47.510659" elapsed="0.001116"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:30:47.512064" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-17T03:30:47.511865" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:47.511841" elapsed="0.000328"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:47.512358" 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-04-17T03:30:47.512575" elapsed="0.000025"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:30:47.512653" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:30:47.515121" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:30:47.510225" elapsed="0.004928"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:47.517009" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:47.516651" elapsed="0.000421"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:47.517583" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:47.517275" elapsed="0.000362"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:30:47.523710" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:47.728160" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:48.134645" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:48.137311" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:30:47.520270" elapsed="0.621850">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:47.517720" elapsed="0.624549">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:48.142633" elapsed="0.000106"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:48.142330" elapsed="0.000474"/>
</branch>
<status status="FAIL" start="2026-04-17T03:30:47.517697" elapsed="0.625141">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:48.143466" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:48.143971" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:48.143889" elapsed="0.000149"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:48.143583" elapsed="0.000486"/>
</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-04-17T03:30:48.144280" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:30:48.144379" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:30:47.515610" elapsed="0.628947">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:48.144668" 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-04-17T03:30:47.180462" elapsed="0.964349">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:48.145223" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:48.144965" elapsed="0.000361"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:48.144920" elapsed="0.000439"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:48.145405" elapsed="0.000020"/>
</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-04-17T03:30:47.174363" elapsed="0.971183">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:50.202845" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:50.202411" elapsed="0.000469"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:50.203722" 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-04-17T03:30:50.203433" elapsed="0.000372">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-04-17T03:30:50.203907" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:50.203077" elapsed="0.000857"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:50.204634" 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-04-17T03:30:50.204239" elapsed="0.000423"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:50.204999" 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-04-17T03:30:50.205175" 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-04-17T03:30:50.204832" elapsed="0.000370"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:50.206332" 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-04-17T03:30:50.205364" elapsed="0.001025"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:50.207815" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:50.207379" elapsed="0.000501"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:50.208565" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:30:50.208174" elapsed="0.000429"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:50.209803" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:50.209149" elapsed="0.000693"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:50.212007" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:50.211135" elapsed="0.001035"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:50.212292" elapsed="0.000054"/>
</return>
<msg time="2026-04-17T03:30:50.212753" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:50.210140" elapsed="0.002653"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:50.213060" elapsed="0.000592"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:30:50.208929" elapsed="0.004839"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:50.214774" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:50.214175" elapsed="0.000627"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:50.216096" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:50.215508" elapsed="0.000690"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:50.216278" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:30:50.216576" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:50.215035" 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-04-17T03:30:50.216763" elapsed="0.000402"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:30:50.213968" elapsed="0.003239"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:30:50.208676" elapsed="0.008567"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:30:50.217286" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:30:50.217449" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:30:50.206876" elapsed="0.010599"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:50.206471" elapsed="0.011037"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:50.217686" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:50.217534" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:50.206447" elapsed="0.011345"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:50.218564" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-f...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:30:50.217965" elapsed="0.000629"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:30:50.218644" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:30:50.201716" elapsed="0.017077"/>
</kw>
<msg time="2026-04-17T03:30:50.218912" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:50.187743" elapsed="0.031241"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:30:50.231765" 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-04-17T03:30:50.245387" 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/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-04-17T03:30:50.258386" elapsed="0.000062"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:50.258763" 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-04-17T03:30:50.259052" 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-04-17T03:30:50.259644" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:50.259425" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:50.259401" 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-04-17T03:30:50.259905" 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-04-17T03:30:50.260110" 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-04-17T03:30:50.260282" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:30:50.259345" elapsed="0.000990"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:30:50.259167" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:50.260507" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:50.260587" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:30:50.260756" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-f...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:30:50.183211" elapsed="0.077574"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:50.262444" 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-04-17T03:30:50.262062" elapsed="0.000464">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-04-17T03:30:50.262621" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:50.261633" elapsed="0.001012"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:50.263004" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:50.262715" elapsed="0.000347"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:50.263587" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:50.263288" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:50.263086" elapsed="0.000572"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:50.262698" elapsed="0.000990"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:50.266421" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:30:50.263870" elapsed="0.002579"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:30:50.266501" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:30:50.266663" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:30:50.261268" elapsed="0.005420"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:50.267997" 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-04-17T03:30:50.267694" elapsed="0.000390">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-04-17T03:30:50.268211" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:50.267348" elapsed="0.000897"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:30:50.268499" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:30:50.268342" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:50.268317" 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-04-17T03:30:50.268734" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:50.268906" elapsed="0.000025"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:30:50.268992" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:30:50.271199" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:30:50.267015" elapsed="0.004221"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:50.272712" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:50.272447" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:50.273237" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:50.272918" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:30:50.278644" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:50.482421" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:50.887142" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:50.890271" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:30:50.275467" elapsed="0.620451">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:50.273347" elapsed="0.622867">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:50.896825" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:50.896310" elapsed="0.000731"/>
</branch>
<status status="FAIL" start="2026-04-17T03:30:50.273330" elapsed="0.623836">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:50.897924" elapsed="0.000046"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:50.898113" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:50.898058" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:50.898033" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:50.898374" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:30:50.898446" 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-04-17T03:30:50.271587" elapsed="0.626975">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:50.898644" 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-04-17T03:30:50.160233" elapsed="0.738511">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:50.899325" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:50.898842" elapsed="0.000560"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:50.898825" elapsed="0.000602"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:50.899461" elapsed="0.000015"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-04-17T03:30:50.154481" elapsed="0.745084">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:52.955394" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:52.954956" elapsed="0.000476"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:52.956296" 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-04-17T03:30:52.956019" elapsed="0.000362">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-04-17T03:30:52.956483" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:52.955628" elapsed="0.000882"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:52.957136" 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-04-17T03:30:52.956699" elapsed="0.000467"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:52.957503" 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-04-17T03:30:52.957677" 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-04-17T03:30:52.957351" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:52.958180" 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-04-17T03:30:52.957891" elapsed="0.000341"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:52.959394" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:52.959058" elapsed="0.000386"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:52.959920" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:30:52.959628" elapsed="0.000345"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:52.960807" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:52.960375" elapsed="0.000461"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:52.962343" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:52.961561" elapsed="0.000926"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:52.962574" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:30:52.962896" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:52.961068" elapsed="0.001858"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:52.963125" elapsed="0.000411"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:30:52.960218" elapsed="0.003362"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:52.964304" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:52.963857" elapsed="0.000475"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:52.965625" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:52.965055" elapsed="0.000677"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:52.965813" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:30:52.966139" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:52.964542" elapsed="0.001624"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:52.966339" elapsed="0.000408"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:30:52.963704" elapsed="0.003088"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:30:52.960030" elapsed="0.006800"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:30:52.966945" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:30:52.967120" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:30:52.958679" elapsed="0.008468"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:52.958314" elapsed="0.008868"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:52.967377" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:52.967208" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:52.958290" elapsed="0.009167"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:52.968276" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-f...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:30:52.967620" elapsed="0.000687"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:30:52.968360" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:30:52.954208" elapsed="0.014286"/>
</kw>
<msg time="2026-04-17T03:30:52.968553" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:52.941215" elapsed="0.027390"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:30:52.983198" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_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-04-17T03:30:52.996584" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:53.009090" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:53.009306" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:53.009485" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:53.009879" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:53.009725" elapsed="0.000226"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:53.009709" 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-04-17T03:30:53.010121" 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-04-17T03:30:53.010286" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:53.010449" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:30:53.009675" elapsed="0.000825"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:30:53.009563" elapsed="0.000963"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:53.010819" elapsed="0.000029"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:53.010908" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:30:53.011065" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-f...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:30:52.936960" elapsed="0.074133"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:53.012698" 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-04-17T03:30:53.012360" elapsed="0.000430">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-04-17T03:30:53.012889" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:53.011864" elapsed="0.001049"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:53.013266" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:53.013004" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:53.013834" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:53.013536" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:53.013349" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:53.012985" elapsed="0.000932"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:53.017300" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:30:53.014089" elapsed="0.003241"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:30:53.017384" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:30:53.017545" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:30:53.011484" elapsed="0.006085"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:53.019100" 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-04-17T03:30:53.018686" elapsed="0.000512">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-04-17T03:30:53.019323" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:53.018239" elapsed="0.001109"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:30:53.019558" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-17T03:30:53.019421" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:53.019402" elapsed="0.000239"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:53.019818" 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-04-17T03:30:53.020047" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:30:53.020115" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:30:53.022088" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:30:53.017883" elapsed="0.004232"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:53.023549" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:53.023289" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:53.024076" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:53.023798" elapsed="0.000367"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:30:53.029322" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:53.231722" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:53.635800" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:53.638521" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:30:53.026348" elapsed="0.616181">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:53.024234" elapsed="0.618474">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:53.643204" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:53.642791" elapsed="0.000570"/>
</branch>
<status status="FAIL" start="2026-04-17T03:30:53.024216" elapsed="0.619191">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:53.644237" elapsed="0.000050"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:53.644497" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:53.644424" elapsed="0.000157"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:53.644388" elapsed="0.000233"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:53.644901" elapsed="0.000067"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:30:53.645061" 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-04-17T03:30:53.022431" elapsed="0.622840">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:53.645409" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:30:52.914796" elapsed="0.730757">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:53.646395" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:53.646092" elapsed="0.000411"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:53.645733" elapsed="0.000805"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:53.646584" elapsed="0.000021"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-04-17T03:30:52.908589" elapsed="0.738141">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:30:53.646883" level="FAIL">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-17T03:30:47.166700" elapsed="6.480353">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:30:53.647388" elapsed="0.000034"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:30:53.647666" elapsed="0.000029"/>
</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="NOT RUN" start="2026-04-17T03:30:53.647900" elapsed="0.000020"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:30:53.648092" elapsed="0.000022"/>
</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-04-17T03:30:53.648362" elapsed="0.003542"/>
</kw>
<arg>rt_constrain_type_1</arg>
<arg>${RT_CONSTRAIN_DIR}</arg>
<status status="FAIL" start="2026-04-17T03:30:47.158112" elapsed="6.493901">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:47.082226" elapsed="6.570021">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:30:53.656047" elapsed="0.000327"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:30:53.655694" 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-04-17T03:30:53.657895" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:53.657725" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:53.657698" elapsed="0.000318"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:53.664856" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:53.664716" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:53.664693" elapsed="0.000269"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:53.666180" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:30:53.665698" elapsed="0.000518"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:30:53.666739" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:30:53.666431" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:30:53.666809" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:30:53.666989" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:30:53.665306" elapsed="0.001708"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:53.672676" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:53.672567" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:53.672548" 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-04-17T03:30:53.673953" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:53.673825" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:53.673808" elapsed="0.000216"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:53.674590" level="INFO">${karaf_connection_index} = 24</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:30:53.674202" elapsed="0.000423"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:53.675072" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:30:53.674820" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:30:53.675914" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:30:53.675643" elapsed="0.000924">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:30:53.676755" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:30:53.676801" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:53.675265" elapsed="0.001559"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:30:53.677603" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:30:53.677361" elapsed="0.000972">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:30:53.678524" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:30:53.678572" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:53.677014" elapsed="0.001580"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:30:53.679544" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Odl_To_Play_rt_constrain_type_2"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:30:53.678900" elapsed="0.000742">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Odl_To_Play_rt_constrain_type_2"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:53.678668" elapsed="0.001044">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Odl_To_Play_rt_constrain_type_2"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:30:53.678649" elapsed="0.001096">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Odl_To_Play_rt_constrain_type_2"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:53.679911" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:53.680226" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:53.680024" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:53.680002" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:30:53.680366" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:30:53.683067" elapsed="0.000149"/>
</kw>
<msg time="2026-04-17T03:30:53.683284" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:53.681957" 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-04-17T03:30:53.683716" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:53.684121" 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-04-17T03:30:53.681223" elapsed="0.003090"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:30:53.680653" elapsed="0.003726"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:30:53.673522" elapsed="0.010942">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Odl_To_Play_rt_constrain_type_2"</status>
</kw>
<msg time="2026-04-17T03:30:53.684570" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:30:53.684615" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Odl_To_Play_rt_constrain_type_2"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:53.672900" elapsed="0.011740"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:30:53.684855" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:53.684717" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:53.684699" elapsed="0.000230"/>
</if>
<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-04-17T03:30:53.686302" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:53.686192" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:53.686172" elapsed="0.000198"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:53.686650" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:30:53.686756" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:30:53.686528" elapsed="0.000255"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:53.687338" level="INFO">{1: 24}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:53.687014" elapsed="0.000369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:53.687859" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:53.687541" elapsed="0.000364"/>
</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-04-17T03:30:53.688539" elapsed="0.000264"/>
</kw>
<msg time="2026-04-17T03:30:53.688902" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:30:53.688968" level="INFO">${old_connection_index} = 24</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:53.688163" elapsed="0.000830"/>
</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-04-17T03:30:53.689837" elapsed="0.000374"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:30:53.691421" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:30:53.691009" elapsed="0.001368">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:53.690387" elapsed="0.002090"/>
</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-04-17T03:30:53.693271" elapsed="0.000315"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:53.692652" elapsed="0.001023"/>
</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-04-17T03:30:53.689299" elapsed="0.004423"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:53.689069" elapsed="0.004702"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:53.689051" elapsed="0.004745"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:53.694682" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:30:53.694366" elapsed="0.000343"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:30:53.694757" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:30:53.694959" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:30:53.694031" elapsed="0.000956"/>
</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-04-17T03:30:53.695146" elapsed="0.000423"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:53.695888" level="INFO">index=25
host=10.30.170.120
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-04-17T03:30:53.696103" level="INFO">${karaf_connection_object} = index=25
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:30:53.695777" elapsed="0.000354"/>
</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-04-17T03:30:53.696319" elapsed="0.002433"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:30:53.699248" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:30:53.700318" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:30:53.698961" elapsed="0.001744">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:30:53.714750" elapsed="0.000425"/>
</kw>
<msg time="2026-04-17T03:30:53.715268" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:53.713333" elapsed="0.002099"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:53.715597" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:53.715761" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:30:53.701574" elapsed="0.014294"/>
</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-04-17T03:30:53.701018" elapsed="0.014898"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:30:53.685802" elapsed="0.030598">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:53.716765" elapsed="0.000030"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:30:53.716878" 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="FAIL" start="2026-04-17T03:30:53.672223" elapsed="0.044835">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:30:53.717177" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:30:53.717221" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:53.667401" elapsed="0.049843"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:53.717621" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:53.717329" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:53.717308" elapsed="0.000394"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:30:53.667254" elapsed="0.050472"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:30:53.667074" elapsed="0.050685"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:30:53.664255" elapsed="0.053564"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:30:53.657311" elapsed="0.060565"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:53.656666" elapsed="0.061296"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:30:53.653108" elapsed="0.064944"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:53.719048" 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-04-17T03:30:53.719269" 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-04-17T03:30:53.718787" elapsed="0.000518"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-17T03:30:53.719721" 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-04-17T03:30:53.719496" elapsed="0.000292"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:53.720284" 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-04-17T03:30:53.720469" 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-04-17T03:30:53.720082" elapsed="0.000419"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-17T03:30:53.720870" 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-04-17T03:30:53.720661" elapsed="0.000236"/>
</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-04-17T03:30:53.721343" elapsed="0.002575"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:53.721122" elapsed="0.002854"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:53.721103" elapsed="0.002900"/>
</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-04-17T03:30:53.766874" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:53.766462" elapsed="0.000446"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:53.767719" 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-04-17T03:30:53.767448" elapsed="0.000363">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-04-17T03:30:53.767907" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:53.767101" elapsed="0.000848"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:53.768565" 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-04-17T03:30:53.768122" elapsed="0.000470"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:53.768916" 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-04-17T03:30:53.769098" 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-04-17T03:30:53.768765" elapsed="0.000360"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:53.769537" 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-04-17T03:30:53.769285" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:53.770592" level="INFO">mapping: {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:53.770332" elapsed="0.000306"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:53.771106" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:30:53.770808" elapsed="0.000324"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:53.771802" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:53.771499" elapsed="0.000335"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:53.772879" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:53.772416" elapsed="0.000491"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:53.772987" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:30:53.773152" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:53.772046" elapsed="0.001131"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:53.773334" elapsed="0.000240"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:30:53.771361" elapsed="0.002253"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:53.774256" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:53.773947" elapsed="0.000335"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:53.775405" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:53.774971" elapsed="0.000462"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:53.775484" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:30:53.775638" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:53.774470" 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-04-17T03:30:53.775816" elapsed="0.000260"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:30:53.773774" elapsed="0.002345"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:30:53.771187" elapsed="0.004967"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:30:53.776197" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:30:53.776422" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:30:53.770005" elapsed="0.006445"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:53.769660" elapsed="0.006824"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:53.776663" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:53.776511" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:53.769637" elapsed="0.007101"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:53.777539" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:30:53.776906" elapsed="0.000663"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:30:53.777617" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:30:53.765809" elapsed="0.011934"/>
</kw>
<msg time="2026-04-17T03:30:53.777798" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:53.750332" elapsed="0.027514"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:30:53.791659" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:53.803808" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:53.816441" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:53.816702" 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-04-17T03:30:53.816944" 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-04-17T03:30:53.817319" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:53.817172" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:53.817157" 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-04-17T03:30:53.817540" 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-04-17T03:30:53.817708" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:53.817874" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:30:53.817127" elapsed="0.000802"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:30:53.817023" elapsed="0.000949"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:53.818120" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:53.818194" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:30:53.818322" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:30:53.746047" elapsed="0.072301"/>
</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-04-17T03:30:53.843390" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:53.842921" elapsed="0.000506"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:53.844331" 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-04-17T03:30:53.844025" elapsed="0.000410">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-04-17T03:30:53.844561" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:53.843618" elapsed="0.000976"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:53.845458" 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-04-17T03:30:53.844857" elapsed="0.000640"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:53.845979" 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-04-17T03:30:53.846230" 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-04-17T03:30:53.845744" elapsed="0.000526"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:53.846832" 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-04-17T03:30:53.846499" elapsed="0.000420"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-17T03:30:53.847547" elapsed="0.000109"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:53.847053" elapsed="0.000655"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:53.848405" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:53.847982" elapsed="0.000461"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:53.847745" elapsed="0.000747"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:53.847018" elapsed="0.001503"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:53.849603" 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-04-17T03:30:53.848791" elapsed="0.000856"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:30:53.849719" 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/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-04-17T03:30:53.842107" elapsed="0.007821"/>
</kw>
<msg time="2026-04-17T03:30:53.850036" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:53.829305" elapsed="0.020805"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:30:53.865821" elapsed="0.000076"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:30:53.881081" 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/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-04-17T03:30:53.896015" elapsed="0.000083"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:53.896424" elapsed="0.000035"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:53.896697" 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-04-17T03:30:53.897322" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:53.897156" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:53.897138" 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-04-17T03:30:53.897587" 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-04-17T03:30:53.897769" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:53.897963" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:30:53.897090" elapsed="0.000928"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:30:53.896815" elapsed="0.001231"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:53.898275" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:53.898355" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:30:53.898533" 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-04-17T03:30:53.828405" elapsed="0.070161"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:53.900426" 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-04-17T03:30:53.899997" elapsed="0.000544">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-04-17T03:30:53.900675" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:53.899446" elapsed="0.001263"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:53.901224" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:53.900809" elapsed="0.000493"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:53.902039" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:53.901604" elapsed="0.000470"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:53.901338" elapsed="0.000784"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:53.900784" elapsed="0.001368"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:53.905527" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:30:53.902370" elapsed="0.003197"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:30:53.905646" elapsed="0.000055"/>
</return>
<msg time="2026-04-17T03:30:53.905886" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:30:53.898972" elapsed="0.006945"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:53.907863" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:30:53.907580" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:53.908333" 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-04-17T03:30:53.908092" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:53.908785" 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-04-17T03:30:53.908541" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:53.909504" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:53.909039" elapsed="0.000530"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:53.910518" 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-04-17T03:30:53.910262" elapsed="0.000286"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:30:53.910955" 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-04-17T03:30:53.910716" elapsed="0.000267"/>
</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-04-17T03:30:53.911142" elapsed="0.000221"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:53.911857" 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-04-17T03:30:53.911602" elapsed="0.000305"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:30:53.911970" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:30:53.912140" 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-04-17T03:30:53.909790" elapsed="0.002375"/>
</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-04-17T03:30:53.918228" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:54.121438" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:54.525134" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:54.528052" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:30:53.914788" elapsed="0.618796">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:53.912244" elapsed="0.621581">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:30:54.534167" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:54.533905" elapsed="0.000337"/>
</branch>
<status status="FAIL" start="2026-04-17T03:30:53.912224" elapsed="0.622043">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:30:54.534730" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:54.534889" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:54.534847" elapsed="0.000106"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:54.534825" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:54.535131" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:30:54.535199" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>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="FAIL" start="2026-04-17T03:30:53.906439" elapsed="0.628877">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:54.535400" elapsed="0.000017"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>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="FAIL" start="2026-04-17T03:30:53.730863" elapsed="0.804704">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:54.535890" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:54.535688" elapsed="0.000314"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:54.535671" elapsed="0.000360"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:54.536066" elapsed="0.000015"/>
</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="FAIL" start="2026-04-17T03:30:53.724279" elapsed="0.811892">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:30:54.536368" elapsed="0.000022"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<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="NOT RUN" start="2026-04-17T03:30:54.536600" elapsed="0.000024"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:54.536777" elapsed="0.000019"/>
</kw>
<kw name="Remove_Configured_Routes" owner="BgpOperations">
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:54.537019" elapsed="0.000026"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:30:54.537224" elapsed="0.000022"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<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="NOT RUN" start="2026-04-17T03:30:54.537449" elapsed="0.000023"/>
</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-04-17T03:30:54.583254" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:54.582723" elapsed="0.000574"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:54.584352" 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-04-17T03:30:54.584013" elapsed="0.000417">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-04-17T03:30:54.584534" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:54.583524" elapsed="0.001040"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:54.585182" 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-04-17T03:30:54.584736" elapsed="0.000475"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:54.585561" 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-04-17T03:30:54.585734" 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-04-17T03:30:54.585401" elapsed="0.000359"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:54.586211" 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-04-17T03:30:54.585955" 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-04-17T03:30:54.587478" level="INFO">mapping: {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:54.587203" elapsed="0.000322"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:54.588049" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:30:54.587720" elapsed="0.000356"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:54.589126" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:54.588453" elapsed="0.000700"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:54.590418" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:54.589925" elapsed="0.000535"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:54.590582" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:30:54.590833" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:54.589368" elapsed="0.001491"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:54.591054" elapsed="0.000579"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:30:54.588312" elapsed="0.003365"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:54.592587" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:54.591972" elapsed="0.000649"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:54.594165" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:54.593405" elapsed="0.000805"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:54.594328" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:30:54.594553" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:54.592831" elapsed="0.001748"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:54.594735" elapsed="0.000517"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:30:54.591807" elapsed="0.003489"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:30:54.588133" elapsed="0.007198"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:30:54.595375" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:30:54.595535" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:30:54.586790" elapsed="0.008770"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:54.586427" elapsed="0.009166"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:54.595774" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:54.595620" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:54.586401" elapsed="0.009449"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:54.596633" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:30:54.596018" elapsed="0.000645"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:30:54.596712" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:30:54.581917" elapsed="0.014923"/>
</kw>
<msg time="2026-04-17T03:30:54.596896" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:54.568348" elapsed="0.028648"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:30:54.609537" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/app/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:54.622693" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_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-04-17T03:30:54.635656" elapsed="0.000035"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:54.635893" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:54.636118" 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-04-17T03:30:54.636582" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:54.636421" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:54.636403" 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-04-17T03:30:54.636848" 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-04-17T03:30:54.637075" 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-04-17T03:30:54.637285" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:30:54.636362" elapsed="0.000982"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:30:54.636220" elapsed="0.001152"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:54.637527" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:54.637606" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:30:54.637848" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:30:54.563757" elapsed="0.074134"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:54.639262" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.120/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-04-17T03:30:54.638957" elapsed="0.000358"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:30:54.644522" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:54.846810" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:55.250175" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:55.253194" level="INFO">${response} = None</msg>
<msg time="2026-04-17T03:30:55.253378" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:54.641665" elapsed="0.616962">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:54.639382" elapsed="0.619399">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:55.259226" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:55.258862" elapsed="0.000468"/>
</branch>
<status status="FAIL" start="2026-04-17T03:30:54.639364" elapsed="0.620014">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:55.266126" 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-04-17T03:30:55.261856" elapsed="0.004332">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:55.261389" elapsed="0.004889">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:30:55.261355" elapsed="0.004963">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-04-17T03:30:55.269347" 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-04-17T03:30:55.266731" elapsed="0.002658">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:55.266406" elapsed="0.003052">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-04-17T03:30:55.266385" elapsed="0.003107">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:55.270259" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:30:55.269729" elapsed="0.000558"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:55.270683" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:55.270362" elapsed="0.000402"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:55.271484" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:55.271067" elapsed="0.000454"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:55.270799" elapsed="0.000769"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:55.270342" elapsed="0.001256"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:55.272218" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:30:55.271808" elapsed="0.000439"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:55.272574" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:55.272324" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:55.273198" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:55.272822" elapsed="0.000406"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:55.272657" elapsed="0.000607"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:55.272301" elapsed="0.000985"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:55.273484" elapsed="0.000370"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-17T03:30:55.274428" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:30:55.274088" elapsed="0.000433"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-04-17T03:30:55.277058" 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-04-17T03:30:55.274702" elapsed="0.002398">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-04-17T03:30:55.260499" elapsed="0.016792">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-04-17T03:30:55.277367" elapsed="0.000055"/>
</return>
<msg time="2026-04-17T03:30:55.280163" level="INFO">${response_text} = None</msg>
<msg time="2026-04-17T03:30:55.280207" 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-04-17T03:30:54.638220" elapsed="0.642029">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-04-17T03:30:55.280345" elapsed="0.000038"/>
</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-04-17T03:30:54.538718" elapsed="0.741866">Replacing variables from keyword return value failed: Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<arg>TemplatedRequests.Delete_Templated</arg>
<arg>${dir}/${totest}/app</arg>
<arg>mapping=${APP_PEER}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:54.538213" elapsed="0.742462"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-04-17T03:30:54.537727" elapsed="0.743038"/>
</kw>
<arg>rt_constrain_type_2</arg>
<arg>${RT_CONSTRAIN_DIR}</arg>
<status status="FAIL" start="2026-04-17T03:30:53.718394" elapsed="1.562479">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:53.652530" elapsed="1.628601">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-family/bgp-route-target-constrain:route-target-constrain-routes (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:30:55.285805" elapsed="0.000335"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:30:55.285457" elapsed="0.000771"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:55.287642" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:55.287463" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:55.287431" elapsed="0.000310"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:55.293684" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:55.293559" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:55.293537" elapsed="0.000244"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:55.294985" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:30:55.294531" elapsed="0.000484"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:30:55.295585" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:30:55.295183" elapsed="0.000440"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:30:55.295678" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:30:55.295851" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:30:55.294121" elapsed="0.001755"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:55.302754" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:55.302624" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:55.302600" elapsed="0.000322"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:30:55.304493" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:55.304383" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:55.304365" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:55.305181" level="INFO">${karaf_connection_index} = 25</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:30:55.304749" elapsed="0.000469"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:55.305752" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:30:55.305419" elapsed="0.000363"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:30:55.306624" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:30:55.306342" elapsed="0.000979">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:30:55.307515" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:30:55.307562" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:55.305971" elapsed="0.001616"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:30:55.308389" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:30:55.308134" elapsed="0.000935">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:30:55.309258" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:30:55.309304" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:55.307760" elapsed="0.001567"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:30:55.310389" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Play_To_Odl_rt_constrain_type_2"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:30:55.309686" elapsed="0.000770">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Play_To_Odl_rt_constrain_type_2"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:55.309406" elapsed="0.001124">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Play_To_Odl_rt_constrain_type_2"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:30:55.309386" elapsed="0.001179">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Play_To_Odl_rt_constrain_type_2"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:55.310735" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:55.311013" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:55.310825" elapsed="0.000255"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:55.310808" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:30:55.311156" elapsed="0.000020"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:30:55.314423" elapsed="0.000155"/>
</kw>
<msg time="2026-04-17T03:30:55.314646" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:55.313028" elapsed="0.001773"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:55.315138" elapsed="0.000093"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:55.315559" 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-04-17T03:30:55.312192" elapsed="0.003639"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:30:55.311519" elapsed="0.004395"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:30:55.304065" elapsed="0.011980">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Play_To_Odl_rt_constrain_type_2"</status>
</kw>
<msg time="2026-04-17T03:30:55.316161" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:30:55.316206" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Play_To_Odl_rt_constrain_type_2"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:55.303309" elapsed="0.012922"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:30:55.316424" elapsed="0.000206"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:55.316311" elapsed="0.000402"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:55.316291" elapsed="0.000447"/>
</if>
<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-04-17T03:30:55.317823" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:55.317704" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:55.317679" elapsed="0.000268"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:55.318301" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:30:55.318413" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:30:55.318162" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:55.318870" level="INFO">{1: 25}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:55.318599" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:55.319345" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:55.319093" elapsed="0.000298"/>
</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-04-17T03:30:55.320131" elapsed="0.000350"/>
</kw>
<msg time="2026-04-17T03:30:55.320591" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:30:55.320638" level="INFO">${old_connection_index} = 25</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:55.319592" elapsed="0.001069"/>
</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-04-17T03:30:55.321579" elapsed="0.000233"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:30:55.323008" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:30:55.322574" elapsed="0.001345">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:55.322001" elapsed="0.002041"/>
</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-04-17T03:30:55.324723" elapsed="0.000354"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:55.324220" elapsed="0.000944"/>
</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-04-17T03:30:55.321061" elapsed="0.004151"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:55.320738" elapsed="0.004522"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:55.320719" elapsed="0.004567"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:30:55.326302" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:30:55.325914" elapsed="0.000417"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:30:55.326381" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:30:55.326540" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:30:55.325497" elapsed="0.001068"/>
</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-04-17T03:30:55.326727" elapsed="0.000549"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:30:55.327572" level="INFO">index=26
host=10.30.170.120
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-04-17T03:30:55.327676" level="INFO">${karaf_connection_object} = index=26
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:30:55.327459" elapsed="0.000244"/>
</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-04-17T03:30:55.327858" elapsed="0.002433"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:30:55.330733" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:30:55.332009" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:30:55.330466" elapsed="0.001933">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:30:55.347002" elapsed="0.000432"/>
</kw>
<msg time="2026-04-17T03:30:55.347590" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:55.345319" elapsed="0.002432"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:55.348348" elapsed="0.000029"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:55.348530" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:30:55.333504" elapsed="0.015113"/>
</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-04-17T03:30:55.332696" elapsed="0.015969"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:30:55.317277" elapsed="0.031480">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:55.349160" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:30:55.349240" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:30:55.302218" elapsed="0.047138">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:30:55.349472" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:30:55.349517" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:55.296395" elapsed="0.053145"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:55.350072" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:55.349622" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:55.349602" elapsed="0.000576"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:30:55.296192" elapsed="0.054013"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:30:55.295978" elapsed="0.054261"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:30:55.293107" elapsed="0.057193"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:30:55.287105" elapsed="0.063256"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:30:55.286447" elapsed="0.063963"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:30:55.282332" elapsed="0.068134"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:55.352144" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:55.351623" elapsed="0.000549"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:55.352800" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:55.352343" elapsed="0.000485"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:55.353405" 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-04-17T03:30:55.353021" elapsed="0.000411"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:55.353836" 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-04-17T03:30:55.354032" 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-04-17T03:30:55.353596" elapsed="0.000463"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:55.354410" 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-04-17T03:30:55.354534" 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-04-17T03:30:55.354218" elapsed="0.000342"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-04-17T03:30:55.354755" elapsed="0.003243"/>
</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-04-17T03:30:55.358203" elapsed="0.002156"/>
</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-04-17T03:30:55.418649" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:55.418115" elapsed="0.000571"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:55.419579" 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-04-17T03:30:55.419284" elapsed="0.000376">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-04-17T03:30:55.419762" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:55.418871" elapsed="0.000918"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:55.420382" 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-04-17T03:30:55.419982" elapsed="0.000427"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:55.420725" 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-04-17T03:30:55.420907" 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-04-17T03:30:55.420577" elapsed="0.000374"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:55.421373" 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-04-17T03:30:55.421118" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:55.422723" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:55.422364" elapsed="0.000422"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:55.423319" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:30:55.423029" elapsed="0.000316"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:55.424207" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:55.423732" elapsed="0.000503"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:55.425494" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:55.424904" elapsed="0.000690"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:55.425676" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:30:55.426010" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:55.424434" elapsed="0.001603"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:55.426252" elapsed="0.000407"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:30:55.423588" elapsed="0.003114"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:55.429445" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:55.428986" elapsed="0.000487"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:55.431202" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:55.430445" elapsed="0.000862"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:55.431390" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:30:55.431699" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:55.429720" elapsed="0.002005"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:55.432321" elapsed="0.000558"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:30:55.426842" elapsed="0.006104"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:30:55.423403" elapsed="0.009585"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:30:55.433035" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:30:55.433233" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:30:55.421968" elapsed="0.011293"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:55.421547" elapsed="0.011750"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:55.433490" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:55.433326" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:55.421512" elapsed="0.012056"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:55.434423" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-f...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:30:55.433718" elapsed="0.000735"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:30:55.434504" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:30:55.417258" elapsed="0.017374"/>
</kw>
<msg time="2026-04-17T03:30:55.434692" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:55.403145" elapsed="0.031599"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:30:55.449350" elapsed="0.000064"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:30:55.463888" elapsed="0.000082"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:30:55.476800" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:55.477058" 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-04-17T03:30:55.477253" 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-04-17T03:30:55.477687" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:55.477526" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:55.477508" 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-04-17T03:30:55.477917" 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-04-17T03:30:55.478111" elapsed="0.000115"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:55.478387" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:30:55.477460" elapsed="0.000983"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:30:55.477337" elapsed="0.001135"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:55.478710" elapsed="0.000033"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:55.478829" elapsed="0.000026"/>
</return>
<msg time="2026-04-17T03:30:55.479051" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-f...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:30:55.398360" elapsed="0.080722"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:55.480636" 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-04-17T03:30:55.480307" elapsed="0.000407">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-04-17T03:30:55.480812" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:55.479855" 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-04-17T03:30:55.481305" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:55.480950" elapsed="0.000431"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:55.482102" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:55.481669" elapsed="0.000465"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:55.481415" elapsed="0.000762"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:55.480901" elapsed="0.001302"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:55.485009" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:30:55.482385" elapsed="0.002652"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:30:55.485092" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:30:55.485257" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:30:55.479444" elapsed="0.005838"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:55.486655" 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-04-17T03:30:55.486347" elapsed="0.000387">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-04-17T03:30:55.486844" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:55.485996" elapsed="0.000872"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:30:55.487095" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:30:55.486954" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:55.486920" elapsed="0.000260"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:55.487329" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:55.487503" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:30:55.487568" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:30:55.489567" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:30:55.485603" elapsed="0.003991"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:55.491274" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:55.490999" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:55.491789" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:55.491478" elapsed="0.000367"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:30:55.497120" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:55.700177" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:56.104471" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:56.107400" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:30:55.494136" elapsed="0.617779">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:55.491945" elapsed="0.620139">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:56.112445" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:56.112146" elapsed="0.000403"/>
</branch>
<status status="FAIL" start="2026-04-17T03:30:55.491908" elapsed="0.620675">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:56.113213" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:56.113409" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:56.113353" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:56.113327" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:56.113709" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:30:56.113830" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:30:55.490069" elapsed="0.623941">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:56.114182" 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-04-17T03:30:55.373878" elapsed="0.740448">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:56.114714" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:56.114458" elapsed="0.000356"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:56.114435" elapsed="0.000411"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:56.114900" elapsed="0.000050"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-04-17T03:30:55.368589" elapsed="0.746505">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:58.173016" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:58.172587" elapsed="0.000465"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:58.173839" 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-04-17T03:30:58.173581" elapsed="0.000335">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-04-17T03:30:58.174036" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:58.173229" elapsed="0.000832"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:58.174694" 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-04-17T03:30:58.174232" elapsed="0.000492"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:30:58.175100" 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-04-17T03:30:58.175278" 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-04-17T03:30:58.174895" elapsed="0.000412"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:58.175738" 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-04-17T03:30:58.175474" elapsed="0.000316"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:58.177046" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:58.176663" elapsed="0.000446"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:30:58.177600" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:30:58.177301" elapsed="0.000332"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:58.178517" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:30:58.178066" elapsed="0.000481"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:58.179875" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:58.179298" elapsed="0.000766"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:58.180151" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:30:58.180468" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:58.178748" elapsed="0.001748"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:30:58.180659" elapsed="0.000427"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:30:58.177899" elapsed="0.003231"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:30:58.182031" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:30:58.181392" elapsed="0.000667"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:30:58.183441" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:30:58.182794" elapsed="0.000750"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:30:58.183628" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:30:58.183971" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:30:58.182255" 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-04-17T03:30:58.184185" elapsed="0.000407"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:30:58.181251" elapsed="0.003399"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:30:58.177703" elapsed="0.006988"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:30:58.184737" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:30:58.184906" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:30:58.176305" elapsed="0.008646"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:58.175881" elapsed="0.009105"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:58.185167" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:58.185011" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:58.175851" elapsed="0.009395"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:30:58.186061" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-f...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:30:58.185394" elapsed="0.000697"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:30:58.186142" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:30:58.171770" elapsed="0.014502"/>
</kw>
<msg time="2026-04-17T03:30:58.186329" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:30:58.158242" elapsed="0.028138"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:30:58.199407" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:58.212305" 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_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-04-17T03:30:58.225147" elapsed="0.000035"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:58.225376" 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-04-17T03:30:58.225564" 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-04-17T03:30:58.226003" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:58.225818" elapsed="0.000245"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:58.225801" 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-04-17T03:30:58.226284" 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-04-17T03:30:58.226465" 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-04-17T03:30:58.226637" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:30:58.225765" elapsed="0.000926"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:30:58.225645" elapsed="0.001074"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:58.226871" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:58.226967" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:30:58.227180" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-f...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:30:58.153450" elapsed="0.073764"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:58.228653" 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-04-17T03:30:58.228361" elapsed="0.000371">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-04-17T03:30:58.228830" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:58.227961" elapsed="0.000894"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:58.229215" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:58.228944" elapsed="0.000330"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:30:58.229800" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:30:58.229493" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-17T03:30:58.229300" elapsed="0.000563"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:58.228910" elapsed="0.000976"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:30:58.232468" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:30:58.230063" elapsed="0.002431"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:30:58.232547" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:30:58.232703" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:30:58.227581" elapsed="0.005146"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:30:58.233987" 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-04-17T03:30:58.233737" elapsed="0.000356">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-04-17T03:30:58.234190" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:30:58.233395" elapsed="0.000819"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:30:58.234421" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-17T03:30:58.234285" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-17T03:30:58.234267" 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-04-17T03:30:58.234653" 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-04-17T03:30:58.234825" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:30:58.234890" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:30:58.236851" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:30:58.233065" elapsed="0.003812"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:58.238300" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:30:58.238046" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:30:58.238749" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:30:58.238504" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:30:58.243862" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:58.446070" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:58.849817" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:58.852229" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:30:58.240963" elapsed="0.614804">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:58.238857" elapsed="0.617093">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:58.856334" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:58.856018" elapsed="0.000421"/>
</branch>
<status status="FAIL" start="2026-04-17T03:30:58.238840" elapsed="0.617635">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:58.857285" elapsed="0.000049"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:58.857740" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:30:58.857658" elapsed="0.000168"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:58.857615" elapsed="0.000252"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:30:58.858205" elapsed="0.000041"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:30:58.858341" elapsed="0.000030"/>
</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-04-17T03:30:58.237207" elapsed="0.621351">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:58.858715" elapsed="0.000030"/>
</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-04-17T03:30:58.131073" elapsed="0.727834">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:30:58.860262" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:30:58.859318" elapsed="0.001098"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:30:58.859096" elapsed="0.001375"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:30:58.860544" elapsed="0.000031"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-04-17T03:30:58.126075" elapsed="0.734690">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:00.924282" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_2/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:00.923738" elapsed="0.000581"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:00.925198" 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-04-17T03:31:00.924889" elapsed="0.000388">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-04-17T03:31:00.925377" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:00.924507" elapsed="0.000895"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:00.926006" 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-04-17T03:31:00.925574" elapsed="0.000460"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:31:00.926351" 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-04-17T03:31:00.926522" 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-04-17T03:31:00.926203" elapsed="0.000440"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:00.927108" 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-04-17T03:31:00.926819" elapsed="0.000340"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:00.928401" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.238/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-04-17T03:31:00.928052" elapsed="0.000410"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:31:00.929040" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:31:00.928678" elapsed="0.000392"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:00.929971" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.238/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-04-17T03:31:00.929511" elapsed="0.000490"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:00.931690" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:31:00.930708" elapsed="0.001096"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:00.931894" elapsed="0.000071"/>
</return>
<msg time="2026-04-17T03:31:00.932295" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:31:00.930227" elapsed="0.002097"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:31:00.932514" elapsed="0.000440"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.238/adj-rib-in</var>
<status status="PASS" start="2026-04-17T03:31:00.929325" elapsed="0.003676"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:00.933756" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:31:00.933292" elapsed="0.000493"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:00.935151" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:31:00.934553" elapsed="0.000704"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:00.935339" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:31:00.935651" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:31:00.934047" elapsed="0.001633"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:31:00.935856" elapsed="0.000439"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:31:00.933136" elapsed="0.003204"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:31:00.929129" elapsed="0.007250"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:31:00.936426" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:31:00.936602" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:31:00.927629" elapsed="0.009001"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:00.927244" elapsed="0.009422"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:00.936876" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:00.936699" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:00.927218" elapsed="0.009758"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:31:00.937896" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-f...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-17T03:31:00.937148" elapsed="0.000831"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:31:00.938034" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_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-04-17T03:31:00.922867" elapsed="0.015300"/>
</kw>
<msg time="2026-04-17T03:31:00.938226" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:00.908991" elapsed="0.029293"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:31:00.951963" elapsed="0.000264"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:31:00.967074" elapsed="0.000061"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:31:00.982684" elapsed="0.000066"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:00.983064" 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-04-17T03:31:00.983302" 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-04-17T03:31:00.983850" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:00.983644" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:00.983620" elapsed="0.000353"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:00.984197" 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-04-17T03:31:00.984433" 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-04-17T03:31:00.984681" elapsed="0.000026"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:31:00.983572" elapsed="0.001176"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:31:00.983404" elapsed="0.001377"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:00.984995" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:00.985096" elapsed="0.000022"/>
</return>
<msg time="2026-04-17T03:31:00.985334" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-f...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-17T03:31:00.904387" elapsed="0.080983"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:00.987345" 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-04-17T03:31:00.986911" elapsed="0.000527">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-04-17T03:31:00.987551" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:00.986380" elapsed="0.001206"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:00.987986" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:00.987678" elapsed="0.000442"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:31:00.988717" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:00.988406" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:00.988196" elapsed="0.000584"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:00.987657" elapsed="0.001145"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:00.992237" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:31:00.988974" elapsed="0.003306"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:31:00.992355" elapsed="0.000048"/>
</return>
<msg time="2026-04-17T03:31:00.992583" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:31:00.985862" elapsed="0.006757"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:00.994409" 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-04-17T03:31:00.994066" elapsed="0.000428">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-04-17T03:31:00.994610" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:00.993565" elapsed="0.001073"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:31:00.994878" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-04-17T03:31:00.994715" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:00.994694" elapsed="0.000331"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:00.995239" 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-04-17T03:31:00.995496" elapsed="0.000031"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:31:00.995593" elapsed="0.000023"/>
</return>
<msg time="2026-04-17T03:31:00.997970" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:31:00.993112" elapsed="0.004888"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:00.999512" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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-04-17T03:31:00.999235" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:00.999989" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:00.999720" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:31:01.006777" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:31:01.208687" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:31:01.611901" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:31:01.614748" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:31:01.002984" elapsed="0.616403">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:31:01.000110" elapsed="0.619515">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:01.620052" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:01.619694" elapsed="0.000462"/>
</branch>
<status status="FAIL" start="2026-04-17T03:31:01.000090" elapsed="0.620103">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:01.620850" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:01.621086" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:01.621026" elapsed="0.000127"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:01.620997" elapsed="0.000189"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:01.621410" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:31:01.621513" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:31:00.998353" elapsed="0.623327">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:01.621796" elapsed="0.000055"/>
</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-04-17T03:31:00.874427" elapsed="0.747572">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:01.622807" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:01.622165" elapsed="0.000751"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:01.622136" elapsed="0.000838"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:01.623025" elapsed="0.000021"/>
</return>
<arg>${dir}/${totest}/rib</arg>
<arg>mapping=${adj_rib_in}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-04-17T03:31:00.868303" elapsed="0.754876">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:31:01.623342" level="FAIL">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-17T03:30:55.360825" elapsed="6.262665">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:31:01.623837" elapsed="0.000033"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:31:01.624151" elapsed="0.000031"/>
</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="NOT RUN" start="2026-04-17T03:31:01.624422" elapsed="0.000030"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:31:01.624678" elapsed="0.000029"/>
</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-04-17T03:31:01.625085" elapsed="0.002574"/>
</kw>
<arg>rt_constrain_type_2</arg>
<arg>${RT_CONSTRAIN_DIR}</arg>
<status status="FAIL" start="2026-04-17T03:30:55.350731" elapsed="6.277013">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:30:55.281658" elapsed="6.346315">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:31:01.631440" elapsed="0.000247"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:31:01.631163" 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-04-17T03:31:01.632820" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:01.632691" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:01.632671" elapsed="0.000219"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:01.639858" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:01.639699" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:01.639672" elapsed="0.000310"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:01.641496" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:31:01.640894" elapsed="0.000642"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:31:01.642315" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:31:01.641779" elapsed="0.000574"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:31:01.642418" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:31:01.642651" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:31:01.640323" elapsed="0.002364"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:01.648489" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:01.648380" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:01.648362" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:01.649743" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:01.649636" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:01.649619" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:01.650331" level="INFO">${karaf_connection_index} = 26</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:31:01.650017" elapsed="0.000342"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:01.650744" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:31:01.650525" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:31:01.651615" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:31:01.651352" elapsed="0.000990">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:31:01.652533" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:31:01.652580" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:01.650968" elapsed="0.001636"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:31:01.653397" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:31:01.653150" elapsed="0.000931">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:31:01.654268" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:31:01.654315" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:01.652778" elapsed="0.001561"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:31:01.655281" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Kill_Talking_BGP_Speaker"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:31:01.654639" elapsed="0.000705">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Kill_Talking_BGP_Speaker"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:31:01.654414" elapsed="0.001000">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Kill_Talking_BGP_Speaker"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:31:01.654395" elapsed="0.001052">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Kill_Talking_BGP_Speaker"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:01.655614" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:01.655846" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:01.655701" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:01.655684" elapsed="0.000237"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:31:01.655974" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:31:01.658663" elapsed="0.000146"/>
</kw>
<msg time="2026-04-17T03:31:01.658876" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:01.657461" 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-04-17T03:31:01.659313" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:01.659648" 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-04-17T03:31:01.656825" elapsed="0.003007"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:31:01.656262" 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="FAIL" start="2026-04-17T03:31:01.649333" elapsed="0.010666">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Kill_Talking_BGP_Speaker"</status>
</kw>
<msg time="2026-04-17T03:31:01.660104" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:31:01.660148" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Kill_Talking_BGP_Speaker"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:01.648712" elapsed="0.011460"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:31:01.660354" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:01.660247" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:01.660229" elapsed="0.000191"/>
</if>
<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-04-17T03:31:01.661600" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:01.661467" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:01.661449" elapsed="0.000222"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:01.661991" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:31:01.662100" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:31:01.661832" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:01.662550" level="INFO">{1: 26}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:01.662286" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:01.663090" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:01.662801" elapsed="0.000338"/>
</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-04-17T03:31:01.663686" elapsed="0.000291"/>
</kw>
<msg time="2026-04-17T03:31:01.664080" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:31:01.664127" level="INFO">${old_connection_index} = 26</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:01.663306" elapsed="0.000844"/>
</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-04-17T03:31:01.665028" elapsed="0.000198"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:31:01.666364" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:31:01.665897" elapsed="0.001362">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:01.665414" elapsed="0.001943"/>
</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-04-17T03:31:01.668013" elapsed="0.000283"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:01.667532" elapsed="0.000848"/>
</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-04-17T03:31:01.664454" elapsed="0.003972"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:01.664227" elapsed="0.004248"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:01.664209" elapsed="0.004291"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:01.669372" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:31:01.669063" elapsed="0.000336"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:31:01.669447" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:31:01.669600" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:31:01.668709" elapsed="0.000915"/>
</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-04-17T03:31:01.669783" elapsed="0.000462"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:01.670526" level="INFO">index=27
host=10.30.170.120
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-04-17T03:31:01.670626" level="INFO">${karaf_connection_object} = index=27
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:31:01.670417" elapsed="0.000235"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:31:01.670803" elapsed="0.002432"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:31:01.673692" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:31:01.674998" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:31:01.673404" elapsed="0.002212">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:31:01.689890" elapsed="0.000723"/>
</kw>
<msg time="2026-04-17T03:31:01.690710" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:01.688469" elapsed="0.002395"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:01.691049" elapsed="0.000027"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:01.691248" elapsed="0.000023"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:31:01.676456" elapsed="0.014881"/>
</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-04-17T03:31:01.675912" elapsed="0.015475"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:31:01.661171" elapsed="0.030304">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:01.691947" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:31:01.692028" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:31:01.648035" elapsed="0.044110">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:31:01.692299" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:31:01.692345" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:01.643195" elapsed="0.049174"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:01.692757" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:01.692470" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:01.692448" elapsed="0.000390"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:31:01.643042" elapsed="0.049821"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:31:01.642770" elapsed="0.050127"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:31:01.639150" elapsed="0.053837"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:31:01.632390" elapsed="0.060706"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:01.631900" elapsed="0.061258"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:31:01.628839" elapsed="0.064384"/>
</kw>
<kw name="Kill_BGP_Speaker" owner="BGPSpeaker">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:31:01.694700" 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-04-17T03:31:01.694346" elapsed="0.000382"/>
</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-04-17T03:31:01.694886" elapsed="0.000370"/>
</kw>
<doc>Construct ctrl+c character and SSH-write it (without endline) to the current SSH connection.
Do not read anything yet.</doc>
<status status="PASS" start="2026-04-17T03:31:01.693870" elapsed="0.001449"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:31:01.713118" level="INFO">^C
[?2004h[jenkins@releng-26932-188-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-04-17T03:31:01.695836" elapsed="0.017422"/>
</kw>
<msg time="2026-04-17T03:31:01.713427" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:31:01.713475" level="INFO">${message} = ^C
[?2004h[jenkins@releng-26932-188-1-mininet-ovs-217-0 ~]&gt;</msg>
<var>${status}</var>
<var>${message}</var>
<arg>SSHLibrary.Read_Until_Prompt</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:01.695494" elapsed="0.018009"/>
</kw>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:31:01.714453" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-04-17T03:31:01.728066" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:31:01.728489" level="INFO">${output_log} = 2026-04-17 03:30:23,600 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:30:23,600 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.238
2026-04-17 03:30:23,600 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-04-17T03:31:01.714277" elapsed="0.014260"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:01.729914" level="INFO">2026-04-17 03:30:23,600 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:30:23,600 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.238
2026-04-17 03:30:23,600 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-04-17 03:30:23,600 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.120
2026-04-17 03:30:23,600 DEBUG BGP-Thread-1 (job): Remote port: 1790
Exception in thread Thread-1 (job):
Traceback (most recent call last):
  File "/usr/lib/python3.10/threading.py", line 1016, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.10/threading.py", line 953, in run
    self._target(*self._args, **self._kwargs)
  File "/home/jenkins/play.py", line 2406, in job
    bgp_socket = establish_connection(arguments)
  File "/home/jenkins/play.py", line 284, in establish_connection
    talking_socket.connect((str(arguments.peerip), arguments.peerport))
ConnectionRefusedError: [Errno 111] Connection refused
10.30.171.144 - - [17/Apr/2026 03:30:29] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:30:31] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:30:31] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:30:37] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:30:37] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:30:39] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:30:39] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:30:45] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:30:45] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:30:47] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:30:47] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:30:53] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:30:53] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:30:55] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:30:55] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:31:01] "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-04-17T03:31:01.729131" elapsed="0.001183"/>
</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-04-17T03:31:01.713814" elapsed="0.016652"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<status status="PASS" start="2026-04-17T03:31:01.730961" elapsed="0.000077"/>
</return>
<status status="PASS" start="2026-04-17T03:31:01.730660" elapsed="0.000436"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:01.730607" elapsed="0.000530"/>
</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-04-17T03:31:01.731470" elapsed="0.000048"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was not seen within timeout period.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:01.731812" elapsed="0.000037"/>
</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-04-17T03:31:01.693510" elapsed="0.038479"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:31:01.748175" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-04-17T03:31:01.775671" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:31:01.776183" level="INFO">${output_log} = 2026-04-17 03:30:23,600 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:30:23,600 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.238
2026-04-17 03:30:23,600 DEBUG BGP-Thr...</msg>
<var>${output_log}</var>
<arg>cat ${source_file_name}</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-17T03:31:01.747803" elapsed="0.028452"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:01.778079" level="INFO">2026-04-17 03:30:23,600 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:30:23,600 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.238
2026-04-17 03:30:23,600 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-04-17 03:30:23,600 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.120
2026-04-17 03:30:23,600 DEBUG BGP-Thread-1 (job): Remote port: 1790
Exception in thread Thread-1 (job):
Traceback (most recent call last):
  File "/usr/lib/python3.10/threading.py", line 1016, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.10/threading.py", line 953, in run
    self._target(*self._args, **self._kwargs)
  File "/home/jenkins/play.py", line 2406, in job
    bgp_socket = establish_connection(arguments)
  File "/home/jenkins/play.py", line 284, in establish_connection
    talking_socket.connect((str(arguments.peerip), arguments.peerport))
ConnectionRefusedError: [Errno 111] Connection refused
10.30.171.144 - - [17/Apr/2026 03:30:29] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:30:31] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:30:31] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:30:37] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:30:37] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:30:39] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:30:39] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:30:45] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:30:45] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:30:47] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:30:47] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:30:53] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:30:53] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:30:55] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:30:55] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:31:01] "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-04-17T03:31:01.777010" elapsed="0.001379"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-04-17T03:31:01.780282" 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-04-17T03:31:01.779110" elapsed="0.001327"/>
</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-04-17T03:31:01.746713" elapsed="0.033941"/>
</kw>
<doc>Abort the Python speaker</doc>
<status status="PASS" start="2026-04-17T03:31:01.628337" elapsed="0.152726"/>
</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-04-17T03:31:01.786377" elapsed="0.000389"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:31:01.786042" elapsed="0.000787"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:01.788092" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:01.787901" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:01.787870" elapsed="0.000303"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:01.793979" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:01.793812" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:01.793788" elapsed="0.000280"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:01.795347" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:31:01.794836" elapsed="0.000540"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:31:01.795980" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:31:01.795548" elapsed="0.000463"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:31:01.796198" elapsed="0.000049"/>
</return>
<msg time="2026-04-17T03:31:01.796388" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:31:01.794408" 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-04-17T03:31:01.804382" elapsed="0.000047"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:01.804009" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:01.803868" elapsed="0.000754"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:01.808161" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:01.807976" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:01.807910" elapsed="0.000360"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:01.809064" level="INFO">${karaf_connection_index} = 27</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:31:01.808504" elapsed="0.000609"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:01.809725" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:31:01.809380" elapsed="0.000385"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:31:01.811232" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:31:01.810679" elapsed="0.001633">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:31:01.812603" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:31:01.812674" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:01.810072" elapsed="0.002636"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:31:01.814002" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:31:01.813573" elapsed="0.001524">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:31:01.815321" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:31:01.815369" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:01.813013" elapsed="0.002379"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:31:01.816408" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Delete_Bgp_Peer_Configuration"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:31:01.815735" elapsed="0.000740">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Delete_Bgp_Peer_Configuration"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:31:01.815485" elapsed="0.001071">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Delete_Bgp_Peer_Configuration"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:31:01.815459" elapsed="0.001138">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Delete_Bgp_Peer_Configuration"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:01.816773" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:01.817055" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:01.816863" elapsed="0.000260"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:01.816843" elapsed="0.000305"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:31:01.817185" elapsed="0.000018"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:31:01.820228" elapsed="0.000164"/>
</kw>
<msg time="2026-04-17T03:31:01.820472" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:01.818982" elapsed="0.001674"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:01.821026" elapsed="0.000090"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:01.821420" 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-04-17T03:31:01.818165" elapsed="0.003495"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:31:01.817531" elapsed="0.004199"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:31:01.807372" elapsed="0.014617">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Delete_Bgp_Peer_Configuration"</status>
</kw>
<msg time="2026-04-17T03:31:01.822147" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:31:01.822197" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Delete_Bgp_Peer_Configuration"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:01.805255" elapsed="0.016968"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:31:01.822480" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:01.822312" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:01.822291" elapsed="0.000263"/>
</if>
<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-04-17T03:31:01.823886" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:01.823774" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:01.823754" elapsed="0.000222"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:01.824283" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:31:01.824395" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:31:01.824141" elapsed="0.000281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:01.824877" level="INFO">{1: 27}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:01.824591" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:01.825349" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:01.825100" elapsed="0.000294"/>
</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-04-17T03:31:01.825986" elapsed="0.000299"/>
</kw>
<msg time="2026-04-17T03:31:01.826407" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:31:01.826454" level="INFO">${old_connection_index} = 27</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:01.825560" elapsed="0.000916"/>
</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-04-17T03:31:01.827435" elapsed="0.000198"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:31:01.828905" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:31:01.828364" elapsed="0.001559">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:01.827807" elapsed="0.002284"/>
</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-04-17T03:31:01.831027" elapsed="0.000288"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:01.830296" elapsed="0.001104"/>
</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-04-17T03:31:01.826817" elapsed="0.004633"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:01.826582" elapsed="0.004919"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:01.826560" elapsed="0.004984"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:01.832658" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:31:01.832306" elapsed="0.000380"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:31:01.832740" elapsed="0.000050"/>
</return>
<msg time="2026-04-17T03:31:01.832930" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:31:01.831871" elapsed="0.001099"/>
</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-04-17T03:31:01.833141" elapsed="0.000497"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:01.833993" level="INFO">index=28
host=10.30.170.120
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-04-17T03:31:01.834115" level="INFO">${karaf_connection_object} = index=28
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:31:01.833825" elapsed="0.000317"/>
</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-04-17T03:31:01.834302" elapsed="0.002496"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:31:01.837381" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:31:01.838690" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:31:01.837091" elapsed="0.002201">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:31:01.854493" elapsed="0.000659"/>
</kw>
<msg time="2026-04-17T03:31:01.855275" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:01.852814" elapsed="0.002640"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:01.855631" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:01.855800" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:31:01.840304" elapsed="0.015607"/>
</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-04-17T03:31:01.839662" elapsed="0.016350"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:31:01.823111" elapsed="0.033031">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:01.856605" elapsed="0.000031"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:31:01.856693" 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="FAIL" start="2026-04-17T03:31:01.802222" elapsed="0.054603">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:31:01.857222" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:31:01.857273" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:01.796871" elapsed="0.060427"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:01.857676" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:01.857396" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:01.857371" elapsed="0.000388"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:31:01.796699" elapsed="0.061086"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:31:01.796490" elapsed="0.061336"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:31:01.793319" elapsed="0.064576"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:31:01.787560" elapsed="0.070414"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:01.787022" elapsed="0.071005"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:31:01.783403" elapsed="0.074683"/>
</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-04-17T03:31:01.904108" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:01.903634" elapsed="0.000520"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:01.905100" 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-04-17T03:31:01.904773" elapsed="0.000419">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-04-17T03:31:01.905296" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:01.904366" elapsed="0.000956"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:01.906068" 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-04-17T03:31:01.905621" elapsed="0.000477"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:31:01.906441" 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-04-17T03:31:01.906704" 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-04-17T03:31:01.906286" elapsed="0.000446"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:01.907194" 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-04-17T03:31:01.906900" elapsed="0.000342"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:01.908372" level="INFO">mapping: {'IP': '10.30.171.238', '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-04-17T03:31:01.908102" elapsed="0.000315"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:31:01.908868" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:31:01.908583" elapsed="0.000310"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:01.909666" level="INFO">${value} = 10.30.171.238</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:31:01.909359" elapsed="0.000333"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:01.910860" level="INFO">${encoded} = 10.30.171.238</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:31:01.910625" elapsed="0.000262"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:01.910959" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:31:01.911144" level="INFO">${encoded_value} = 10.30.171.238</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:31:01.909955" 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-04-17T03:31:01.911331" elapsed="0.000254"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.238</var>
<status status="PASS" start="2026-04-17T03:31:01.909211" elapsed="0.002416"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:01.912211" 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-04-17T03:31:01.911882" elapsed="0.000355"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:01.913076" 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-04-17T03:31:01.912799" elapsed="0.000306"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:01.913155" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:31:01.913309" 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-04-17T03:31:01.912428" 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-04-17T03:31:01.913543" elapsed="0.000280"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:31:01.911745" elapsed="0.002121"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:01.914483" 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-04-17T03:31:01.914138" elapsed="0.000380"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:01.915585" 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-04-17T03:31:01.915297" elapsed="0.000316"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:01.915671" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:31:01.915873" 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-04-17T03:31:01.914825" elapsed="0.001081"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:31:01.916141" elapsed="0.000257"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:31:01.913999" elapsed="0.002445"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:01.917062" 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-04-17T03:31:01.916720" elapsed="0.000370"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:01.917888" 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-04-17T03:31:01.917658" elapsed="0.000258"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:01.918034" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:31:01.918203" 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-04-17T03:31:01.917302" 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-04-17T03:31:01.918405" elapsed="0.000261"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:31:01.916566" elapsed="0.002146"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:01.919332" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:31:01.919004" elapsed="0.000355"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:01.920170" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:31:01.919920" elapsed="0.000278"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:01.920252" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:31:01.920413" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:31:01.919569" 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-04-17T03:31:01.920613" elapsed="0.000238"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:31:01.918834" elapsed="0.002062"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:01.921509" 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-04-17T03:31:01.921188" elapsed="0.000348"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:01.922352" 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-04-17T03:31:01.922116" elapsed="0.000263"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:01.922435" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:31:01.922623" 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-04-17T03:31:01.921745" 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-04-17T03:31:01.922825" elapsed="0.000490"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:31:01.921034" elapsed="0.002328"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:31:01.908971" elapsed="0.014429"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:31:01.923451" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:31:01.923626" level="INFO">${mapping_to_use} = {'IP': '10.30.171.238', '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-04-17T03:31:01.907740" elapsed="0.015914"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:01.907328" elapsed="0.016361"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:01.923893" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:01.923720" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:01.907300" elapsed="0.016692"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:31:01.924948" 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-04-17T03:31:01.924164" elapsed="0.000817"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:31:01.925034" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name} exists. If 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-04-17T03:31:01.902982" elapsed="0.022186"/>
</kw>
<msg time="2026-04-17T03:31:01.925229" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:01.889601" elapsed="0.035681"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:31:01.938660" 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/bgp_peer.vanadium/${file_name} exists. If 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-04-17T03:31:01.951250" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/bgp_peer.vanadium/${file_name} exists. If 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-04-17T03:31:01.963655" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:01.963875" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:01.964082" 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-04-17T03:31:01.964490" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:01.964337" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:01.964321" 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-04-17T03:31:01.964717" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:01.964887" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:01.965071" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:31:01.964285" elapsed="0.000839"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:31:01.964169" elapsed="0.000981"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:01.965297" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:01.965374" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:31:01.965517" 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-04-17T03:31:01.884657" elapsed="0.080888"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:01.966763" 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.238</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:01.966453" elapsed="0.000361"/>
</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-04-17T03:31:01.971876" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:31:02.173621" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:31:02.576273" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:31:02.579130" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:01.968950" elapsed="0.615757">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:31:01.966881" elapsed="0.618087">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:02.585446" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:02.585081" elapsed="0.000470"/>
</branch>
<status status="FAIL" start="2026-04-17T03:31:01.966864" elapsed="0.618724">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:31:02.586327" elapsed="0.000044"/>
</kw>
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:02.586453" elapsed="0.000032"/>
</return>
<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-04-17T03:31:01.965816" elapsed="0.620840">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:02.586762" elapsed="0.000033"/>
</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="FAIL" start="2026-04-17T03:31:01.858392" elapsed="0.728572">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="FAIL" start="2026-04-17T03:31:01.781898" elapsed="0.805522">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.238 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:31:02.593305" elapsed="0.000279"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:31:02.592987" 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-04-17T03:31:02.594779" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:02.594641" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:02.594618" 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-04-17T03:31:02.600309" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:02.600115" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:02.600090" elapsed="0.000314"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:02.601647" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:31:02.601200" elapsed="0.000477"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:31:02.602238" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:31:02.601886" elapsed="0.000379"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:31:02.602415" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:31:02.602599" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:31:02.600688" elapsed="0.001945"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:02.608603" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:02.608486" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:02.608465" elapsed="0.000209"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:02.609914" elapsed="0.000042"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:02.609806" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:02.609788" elapsed="0.000226"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:02.610482" level="INFO">${karaf_connection_index} = 28</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:31:02.610165" elapsed="0.000345"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:02.610901" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:31:02.610676" elapsed="0.000268"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:31:02.612015" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:31:02.611501" elapsed="0.002053">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:31:02.613759" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:31:02.613807" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:02.611149" elapsed="0.002682"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:31:02.614655" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:31:02.614394" elapsed="0.000976">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:31:02.615564" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:31:02.615625" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:02.614027" elapsed="0.001640"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:31:02.616787" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Deconfigure_App_Peer"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:31:02.616037" elapsed="0.000814">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Deconfigure_App_Peer"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:31:02.615776" elapsed="0.001150">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Deconfigure_App_Peer"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:31:02.615750" elapsed="0.001230">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Deconfigure_App_Peer"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:02.617152" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:02.617385" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:02.617241" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:02.617224" elapsed="0.000237"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:31:02.617495" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:31:02.620328" elapsed="0.000168"/>
</kw>
<msg time="2026-04-17T03:31:02.620566" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:02.619106" 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-04-17T03:31:02.621000" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:02.621340" 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-04-17T03:31:02.618377" elapsed="0.003150"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:31:02.617796" elapsed="0.003796"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:31:02.609497" elapsed="0.012181">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Deconfigure_App_Peer"</status>
</kw>
<msg time="2026-04-17T03:31:02.621843" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:31:02.621887" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain.Deconfigure_App_Peer"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:02.608836" elapsed="0.013075"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:31:02.622126" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:02.622009" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:02.621989" elapsed="0.000205"/>
</if>
<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-04-17T03:31:02.623094" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:02.622909" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:02.622891" elapsed="0.000271"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:02.623445" level="INFO">index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:31:02.623551" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.171.238
alias=None
port=22
timeout=6 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-04-17T03:31:02.623318" elapsed="0.000259"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:02.624132" level="INFO">{1: 28}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:02.623731" elapsed="0.000446"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:02.624612" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:02.624363" elapsed="0.000292"/>
</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-04-17T03:31:02.625276" elapsed="0.000370"/>
</kw>
<msg time="2026-04-17T03:31:02.625785" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:31:02.625849" level="INFO">${old_connection_index} = 28</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:02.624817" elapsed="0.001064"/>
</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-04-17T03:31:02.627136" elapsed="0.000276"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:31:02.629284" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:31:02.628483" elapsed="0.001724">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:02.627678" elapsed="0.002632"/>
</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-04-17T03:31:02.630998" elapsed="0.000285"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:02.630490" elapsed="0.000880"/>
</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-04-17T03:31:02.626377" elapsed="0.005039"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:02.626018" elapsed="0.005446"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:02.625990" elapsed="0.005501"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:02.632435" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:31:02.632072" elapsed="0.000393"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:31:02.632515" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:31:02.632675" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:31:02.631712" elapsed="0.000987"/>
</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-04-17T03:31:02.632858" elapsed="0.000450"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:02.633593" level="INFO">index=29
host=10.30.170.120
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-04-17T03:31:02.633694" level="INFO">${karaf_connection_object} = index=29
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:31:02.633481" elapsed="0.000238"/>
</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-04-17T03:31:02.633871" elapsed="0.002272"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:31:02.636689" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:31:02.638076" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:31:02.636419" elapsed="0.002069">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:31:02.652651" elapsed="0.000666"/>
</kw>
<msg time="2026-04-17T03:31:02.653419" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:02.651154" elapsed="0.002425"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:02.653745" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:02.653913" elapsed="0.000040"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:31:02.639507" elapsed="0.014513"/>
</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-04-17T03:31:02.638813" elapsed="0.015255"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:31:02.622611" elapsed="0.031551">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:02.654557" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:31:02.654636" 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="FAIL" start="2026-04-17T03:31:02.608067" elapsed="0.046685">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:31:02.654869" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:31:02.654914" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:02.603091" elapsed="0.052009"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:02.655459" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:02.655192" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:02.655170" elapsed="0.000368"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:31:02.602918" elapsed="0.052644"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:31:02.602714" elapsed="0.052884"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:31:02.599581" elapsed="0.056078"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:31:02.594322" elapsed="0.061398"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:02.593817" elapsed="0.061952"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:31:02.588816" elapsed="0.067010"/>
</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-04-17T03:31:02.701203" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:02.700364" elapsed="0.000916"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:02.702670" 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-04-17T03:31:02.702241" elapsed="0.000544">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-04-17T03:31:02.702972" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:02.701623" elapsed="0.001394"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:02.703969" 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-04-17T03:31:02.703279" elapsed="0.000841"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:31:02.704686" 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-04-17T03:31:02.704957" 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-04-17T03:31:02.704382" elapsed="0.000633"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:02.705716" 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-04-17T03:31:02.705276" elapsed="0.000511"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:02.707382" level="INFO">mapping: {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:02.706986" elapsed="0.000464"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:31:02.708175" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:31:02.707730" elapsed="0.000484"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:02.709232" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:31:02.708813" elapsed="0.000445"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:02.710115" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:31:02.709867" elapsed="0.000275"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:02.710195" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:31:02.710363" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:31:02.709503" 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-04-17T03:31:02.710585" elapsed="0.000282"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:31:02.708605" elapsed="0.002305"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:02.711500" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:31:02.711186" elapsed="0.000342"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:02.712649" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:31:02.712140" elapsed="0.000537"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:02.712729" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:31:02.712884" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:31:02.711757" 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-04-17T03:31:02.713081" elapsed="0.000225"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:31:02.711046" elapsed="0.002300"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:31:02.708293" elapsed="0.005088"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:31:02.713424" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:31:02.713583" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:31:02.706461" elapsed="0.007148"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:02.705905" elapsed="0.007736"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:02.713824" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:02.713669" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:02.705871" elapsed="0.008028"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:31:02.714685" 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-04-17T03:31:02.714066" elapsed="0.000648"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:31:02.714763" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/app_peer/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:31:02.699359" elapsed="0.015531"/>
</kw>
<msg time="2026-04-17T03:31:02.715027" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:02.685849" elapsed="0.029234"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:31:02.728262" elapsed="0.000074"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:31:02.743004" elapsed="0.000067"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:31:02.756075" elapsed="0.000072"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:02.756430" 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-04-17T03:31:02.756733" elapsed="0.000036"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:02.757320" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:02.757092" elapsed="0.000303"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:02.757065" elapsed="0.000366"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:02.757627" 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-04-17T03:31:02.757837" 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-04-17T03:31:02.758031" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:31:02.757023" elapsed="0.001062"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:31:02.756858" elapsed="0.001256"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:02.758266" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:02.758346" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:31:02.758514" 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-04-17T03:31:02.680816" elapsed="0.077728"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:02.759954" 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.120</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:02.759618" elapsed="0.000392"/>
</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-04-17T03:31:02.765413" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:31:02.967500" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:31:03.370723" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:31:03.373315" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:02.762332" elapsed="0.616291">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:31:02.760080" elapsed="0.618689">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:03.379195" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:03.378832" elapsed="0.000461"/>
</branch>
<status status="FAIL" start="2026-04-17T03:31:02.760060" elapsed="0.619267">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:31:03.380667" elapsed="0.000055"/>
</kw>
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:03.380827" elapsed="0.000036"/>
</return>
<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-04-17T03:31:02.758893" elapsed="0.622170">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:03.381168" elapsed="0.000029"/>
</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="FAIL" start="2026-04-17T03:31:02.656083" elapsed="0.725234">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Revert the BGP configuration to the original state: without application peer</doc>
<status status="FAIL" start="2026-04-17T03:31:02.587786" elapsed="0.793822">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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.120 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:31:03.382867" elapsed="0.000565"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-17T03:31:03.383818" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-17T03:31:03.383698" elapsed="0.000360"/>
</kw>
<doc>Suite teardown keyword</doc>
<status status="PASS" start="2026-04-17T03:31:03.382501" elapsed="0.001688"/>
</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="FAIL" start="2026-04-17T03:30:17.362651" elapsed="46.021583"/>
</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-04-17T03:31:03.509420" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:31:03.504817" elapsed="0.004668"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-17T03:31:03.504509" elapsed="0.005061"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-17T03:31:03.516059" 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-04-17T03:31:03.510848" elapsed="0.005258"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-17T03:31:03.516402" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:03.516233" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:03.516200" elapsed="0.000290"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:31:03.517269" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:31:03.516711" elapsed="0.000620"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-17T03:31:03.518028" 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-04-17T03:31:03.517577" elapsed="0.000488"/>
</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-04-17T03:31:03.518841" elapsed="0.000458"/>
</kw>
<msg time="2026-04-17T03:31:03.519432" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:31:03.519496" level="INFO">${possibly_int_of_members} = 1</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:03.518347" elapsed="0.001182"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:03.520251" 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-04-17T03:31:03.519775" elapsed="0.000503"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:31:03.521414" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:31:03.521136" elapsed="0.000307"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:31:03.521993" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:31:03.521602" elapsed="0.000429"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:31:03.522766" 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-04-17T03:31:03.522311" elapsed="0.000498"/>
</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-04-17T03:31:03.528251" elapsed="0.000551"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:31:03.529672" level="INFO">${member_ip} = 10.30.170.120</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:03.529095" elapsed="0.000626"/>
</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-04-17T03:31:03.529996" elapsed="0.000561"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:31:03.531712" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:03.531302" elapsed="0.000446"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-17T03:31:03.531814" elapsed="0.000054"/>
</return>
<msg time="2026-04-17T03:31:03.532065" 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-04-17T03:31:03.530850" elapsed="0.001251"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:31:03.533121" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.120:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a4416654e10&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-04-17T03:31:03.532518" elapsed="0.000776"/>
</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-04-17T03:31:03.533470" elapsed="0.000225"/>
</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-04-17T03:31:03.527169" elapsed="0.006610"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:31:03.526868" elapsed="0.006973"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-04-17T03:31:03.522908" elapsed="0.010984"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:31:03.534753" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:31:03.534203" elapsed="0.000692"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:31:03.535657" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.120'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:31:03.535161" elapsed="0.000541"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:31:03.536463" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:31:03.535910" elapsed="0.000602"/>
</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-04-17T03:31:03.520570" elapsed="0.016005"/>
</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-04-17T03:31:03.510479" elapsed="0.026154"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:03.536849" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:03.536712" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:03.536689" elapsed="0.000232"/>
</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-04-17T03:31:03.540719" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:31:03.540235" elapsed="0.000514"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:31:03.541338" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:31:03.540966" elapsed="0.000408"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:31:03.541436" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:31:03.541619" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:31:03.539818" elapsed="0.001834"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:03.543214" level="INFO">${member_ip} = 10.30.170.120</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-04-17T03:31:03.542785" elapsed="0.000466"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:03.544290" 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-04-17T03:31:03.544433" 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-04-17T03:31:03.544054" elapsed="0.000415"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:03.549054" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:03.548265" elapsed="0.000907"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:03.548240" elapsed="0.000975"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:03.549964" 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-04-17T03:31:03.550291" 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-04-17T03:31:03.549433" elapsed="0.000933"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:03.551429" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.120" 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-04-17T03:31:03.550662" elapsed="0.000876"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:03.552785" 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-04-17T03:31:03.551821" elapsed="0.001028"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-17T03:31:03.554706" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:31:03.554894" 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-04-17T03:31:03.554297" elapsed="0.000656"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:03.555325" elapsed="0.000471"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:31:03.557135" level="INFO">Logging into '10.30.170.120:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:31:04.296176" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 17 03:31:03 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:30:17 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:31:03.556787" elapsed="0.739563"/>
</kw>
<msg time="2026-04-17T03:31:04.296452" 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-04-17T03:31:03.556324" elapsed="0.740305"/>
</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-04-17T03:31:03.553336" elapsed="0.743454"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:31:04.297728" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-17T03:31:04.311139" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-17T03:31:04.311647" level="INFO">${stdout} = </msg>
<msg time="2026-04-17T03:31:04.311966" 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-04-17T03:31:04.297229" elapsed="0.014855"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:31:04.312850" elapsed="0.001259"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:04.316733" 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-04-17T03:31:04.315451" elapsed="0.001550"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-17T03:31:04.317893" elapsed="0.000125"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:04.317365" elapsed="0.000808"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:04.317299" elapsed="0.000950"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:31:04.318839" elapsed="0.000159"/>
</return>
<status status="PASS" start="2026-04-17T03:31:04.318411" elapsed="0.000742"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:04.318377" elapsed="0.000856"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-17T03:31:04.319353" elapsed="0.000034"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:04.325489" elapsed="0.000779"/>
</kw>
<kw name="Open 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-04-17T03:31:04.326684" elapsed="0.000461"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:31:04.327539" elapsed="0.000370"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:31:04.320435" elapsed="0.007601"/>
</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-04-17T03:31:03.547216" elapsed="0.781095"/>
</kw>
<msg time="2026-04-17T03:31:04.328425" 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-04-17T03:31:03.546068" elapsed="0.782457"/>
</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-04-17T03:31:03.545522" elapsed="0.783124"/>
</kw>
<msg time="2026-04-17T03:31:04.328708" 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-04-17T03:31:03.544709" elapsed="0.784070"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:04.333179" elapsed="0.000542"/>
</kw>
<kw name="Open 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-04-17T03:31:04.334012" elapsed="0.000249"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:31:04.334659" elapsed="0.000149"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:31:04.329423" elapsed="0.005466"/>
</kw>
<msg time="2026-04-17T03:31:04.335059" 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-04-17T03:31:03.543502" elapsed="0.791594"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:04.335865" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:04.335421" elapsed="0.000526"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-17T03:31:04.336018" elapsed="0.000064"/>
</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-04-17T03:31:03.542243" elapsed="0.794014"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:31:03.541963" elapsed="0.794346"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:31:03.541752" elapsed="0.794608"/>
</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-04-17T03:31:03.537217" elapsed="0.799233"/>
</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-04-17T03:31:04.336695" elapsed="0.000482"/>
</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-04-17T03:31:04.354664" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:04.354511" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:04.354480" elapsed="0.000277"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:04.355270" 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-04-17T03:31:04.355432" 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-04-17T03:31:04.355035" elapsed="0.000438"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:04.356186" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:04.355727" elapsed="0.000536"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:04.357312" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:04.357010" elapsed="0.000353"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:04.358387" 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-04-17T03:31:04.358077" elapsed="0.000476">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-17T03:31:04.358725" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:31:04.358792" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:04.357547" elapsed="0.001279"/>
</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-04-17T03:31:04.359482" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:04.359007" elapsed="0.000612"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:04.358971" elapsed="0.000687"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:04.361057" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:31:04.360587" elapsed="0.000509"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:31:04.361165" elapsed="0.000095"/>
</return>
<msg time="2026-04-17T03:31:04.361628" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:31:04.360114" elapsed="0.001548"/>
</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-04-17T03:31:04.361893" elapsed="0.000915"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:04.363283" level="INFO">index=4
host=10.30.170.120
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-04-17T03:31:04.363436" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.120
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-04-17T03:31:04.363105" elapsed="0.000371"/>
</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-04-17T03:31:04.363704" elapsed="0.004171"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:31:04.368611" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:31:04.369818" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:31:04.368266" elapsed="0.002071">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:04.373783" elapsed="0.000389"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-17T03:31:04.374345" elapsed="0.000163"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:31:04.374666" elapsed="0.000102"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:31:04.371393" elapsed="0.003430"/>
</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-04-17T03:31:04.370730" elapsed="0.004140"/>
</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="FAIL" start="2026-04-17T03:31:04.353918" elapsed="0.021069">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:31:05.395748" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:05.395576" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:05.395533" elapsed="0.000305"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:05.396295" 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-04-17T03:31:05.396420" 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-04-17T03:31:05.396102" elapsed="0.000345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:05.396969" 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-04-17T03:31:05.396636" elapsed="0.000401"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:05.397729" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:05.397225" elapsed="0.000553"/>
</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-04-17T03:31:05.398430" elapsed="0.000196"/>
</kw>
<msg time="2026-04-17T03:31:05.398746" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:31:05.398793" level="INFO">${old_connection_index} = 4</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:05.397976" elapsed="0.000839"/>
</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-04-17T03:31:05.399735" elapsed="0.000212"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:31:05.401079" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:31:05.400847" elapsed="0.000812">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:05.400197" elapsed="0.001528"/>
</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-04-17T03:31:05.402269" elapsed="0.000104"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:05.401909" elapsed="0.000511"/>
</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-04-17T03:31:05.399150" elapsed="0.003315"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:05.398893" elapsed="0.003621"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:05.398874" elapsed="0.003666"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:05.403408" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:31:05.403123" elapsed="0.000312"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:31:05.403485" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:31:05.403648" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:31:05.402774" elapsed="0.000898"/>
</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-04-17T03:31:05.403843" elapsed="0.000654"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:05.404899" level="INFO">index=6
host=10.30.170.120
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-04-17T03:31:05.405023" level="INFO">${karaf_connection_object} = index=6
host=10.30.170.120
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-04-17T03:31:05.404784" elapsed="0.000267"/>
</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-04-17T03:31:05.405211" elapsed="0.002663"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:31:05.408384" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:31:05.409617" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:31:05.408106" elapsed="0.002026">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:05.413495" 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-04-17T03:31:05.414132" elapsed="0.000195"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:31:05.414491" elapsed="0.000104"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:31:05.411188" elapsed="0.003462"/>
</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-04-17T03:31:05.410497" elapsed="0.004199"/>
</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="FAIL" start="2026-04-17T03:31:05.395115" elapsed="0.019672">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:31:06.437133" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:06.436980" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:06.436950" elapsed="0.000288"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:06.437653" 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-04-17T03:31:06.437776" 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-04-17T03:31:06.437462" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:06.438300" level="INFO">{1: 6}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:06.437985" elapsed="0.000363"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:06.438758" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:06.438509" elapsed="0.000293"/>
</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-04-17T03:31:06.439493" elapsed="0.000198"/>
</kw>
<msg time="2026-04-17T03:31:06.439795" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:31:06.439841" level="INFO">${old_connection_index} = 6</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:06.438990" elapsed="0.000874"/>
</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-04-17T03:31:06.440725" elapsed="0.000141"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:31:06.441589" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:31:06.441404" elapsed="0.000800">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:06.441057" elapsed="0.001226"/>
</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-04-17T03:31:06.442962" elapsed="0.000130"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:06.442509" elapsed="0.000643"/>
</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-04-17T03:31:06.440198" elapsed="0.003058"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:06.439957" elapsed="0.003435"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:06.439921" elapsed="0.003498"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:06.444245" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:31:06.443963" elapsed="0.000309"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:31:06.444321" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:31:06.444482" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:31:06.443652" elapsed="0.000856"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-17T03:31:06.444674" elapsed="0.000491"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:06.445459" level="INFO">index=8
host=10.30.170.120
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-04-17T03:31:06.445564" level="INFO">${karaf_connection_object} = index=8
host=10.30.170.120
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-04-17T03:31:06.445349" elapsed="0.000241"/>
</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-04-17T03:31:06.445748" elapsed="0.002599"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:31:06.448783" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:31:06.450097" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:31:06.448522" elapsed="0.001959">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:06.453593" elapsed="0.000382"/>
</kw>
<kw name="Open 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-04-17T03:31:06.454149" elapsed="0.000148"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:31:06.454451" elapsed="0.000098"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:31:06.451381" elapsed="0.003220"/>
</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-04-17T03:31:06.450784" elapsed="0.003863"/>
</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="FAIL" start="2026-04-17T03:31:06.436507" elapsed="0.018223">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:31:07.475549" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:07.475398" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:07.475368" elapsed="0.000275"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:07.476083" 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-04-17T03:31:07.476215" 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-04-17T03:31:07.475869" elapsed="0.000375"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:07.476988" level="INFO">{1: 8}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:07.476417" elapsed="0.000629"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:07.477673" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:07.477308" elapsed="0.000476"/>
</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-04-17T03:31:07.478642" elapsed="0.000217"/>
</kw>
<msg time="2026-04-17T03:31:07.478980" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:31:07.479028" level="INFO">${old_connection_index} = 8</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:07.477997" elapsed="0.001055"/>
</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-04-17T03:31:07.480020" elapsed="0.000148"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:31:07.481189" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:31:07.480918" elapsed="0.000828">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:07.480344" elapsed="0.001470"/>
</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-04-17T03:31:07.482384" elapsed="0.000106"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:07.482030" elapsed="0.000507"/>
</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-04-17T03:31:07.479384" elapsed="0.003199"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:07.479133" elapsed="0.003500"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:07.479113" elapsed="0.003549"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:07.483545" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:31:07.483264" elapsed="0.000307"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:31:07.483624" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:31:07.483789" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:31:07.482944" elapsed="0.000870"/>
</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-04-17T03:31:07.483995" elapsed="0.000431"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:07.484767" level="INFO">index=10
host=10.30.170.120
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-04-17T03:31:07.484874" level="INFO">${karaf_connection_object} = index=10
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:31:07.484606" elapsed="0.000294"/>
</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-04-17T03:31:07.485124" elapsed="0.002713"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:31:07.488364" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:31:07.489955" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:31:07.488031" elapsed="0.002345">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:07.493786" elapsed="0.000392"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-17T03:31:07.494356" elapsed="0.000171"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:31:07.494698" elapsed="0.000103"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:31:07.491387" elapsed="0.003469"/>
</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-04-17T03:31:07.490739" elapsed="0.004163"/>
</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="FAIL" start="2026-04-17T03:31:07.474940" elapsed="0.020077">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:31:07.495138" level="FAIL">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<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="FAIL" start="2026-04-17T03:31:04.338255" elapsed="3.156981">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:04.337701" elapsed="3.157604"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:31:04.337491" elapsed="3.157866"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-04-17T03:31:04.337266" elapsed="3.158129"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-17T03:31:03.509950" elapsed="3.985509"/>
</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-04-17T03:31:07.498713" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:07.498534" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:07.498503" elapsed="0.000288"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:07.504852" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:07.504734" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:07.504710" elapsed="0.000214"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:07.506133" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:31:07.505652" elapsed="0.000510"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:31:07.506640" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:31:07.506335" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:31:07.506711" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:31:07.506892" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:31:07.505242" 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-04-17T03:31:07.513098" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:07.512977" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:07.512954" elapsed="0.000215"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:07.514535" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:07.514403" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:07.514385" elapsed="0.000240"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:07.515166" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:31:07.514800" elapsed="0.000394"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:07.515698" 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-04-17T03:31:07.515434" elapsed="0.000303"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:31:07.517100" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:31:07.516489" elapsed="0.001658">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:31:07.518383" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:31:07.518451" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:07.515944" elapsed="0.002552"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:31:07.520245" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:31:07.519634" elapsed="0.001733">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:31:07.521568" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:31:07.521628" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:07.518779" elapsed="0.002880"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:31:07.523029" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/090_bgp_functional_rt_constrain_validation.robot"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:31:07.522185" elapsed="0.000937">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/090_bgp_functional_rt_constrain_validation.robot"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:31:07.521787" elapsed="0.001485">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/090_bgp_functional_rt_constrain_validation.robot"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:31:07.521748" elapsed="0.001567">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/090_bgp_functional_rt_constrain_validation.robot"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:07.523520" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:07.523784" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:07.523617" elapsed="0.000336"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:07.523598" elapsed="0.000462"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:31:07.524107" elapsed="0.000021"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:07.526421" elapsed="0.000467"/>
</kw>
<kw name="Open 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-04-17T03:31:07.527517" elapsed="0.000319"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:31:07.528194" elapsed="0.000264"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:31:07.525584" elapsed="0.002994"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:31:07.524490" elapsed="0.004272"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:31:07.514073" elapsed="0.014853">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/090_bgp_functional_rt_constrain_validation.robot"</status>
</kw>
<msg time="2026-04-17T03:31:07.529080" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:31:07.529150" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/090_bgp_functional_rt_constrain_validation....</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:07.513349" elapsed="0.015839"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:31:07.529481" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:07.529337" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:07.529304" elapsed="0.000262"/>
</if>
<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-04-17T03:31:07.530559" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:07.530400" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:07.530381" elapsed="0.000277"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:07.533442" 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-04-17T03:31:07.533622" 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-04-17T03:31:07.530895" elapsed="0.002789"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:07.534301" level="INFO">{1: 10}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:07.533889" elapsed="0.000488"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:07.534862" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:07.534601" elapsed="0.000308"/>
</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-04-17T03:31:07.535651" elapsed="0.000339"/>
</kw>
<msg time="2026-04-17T03:31:07.536129" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:31:07.536178" level="INFO">${old_connection_index} = 10</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:07.535205" elapsed="0.000997"/>
</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-04-17T03:31:07.537681" elapsed="0.000329"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:31:07.539735" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:31:07.539364" elapsed="0.000940">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:07.538357" elapsed="0.002042"/>
</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-04-17T03:31:07.541538" elapsed="0.000217"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:07.540660" elapsed="0.001177"/>
</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-04-17T03:31:07.536583" elapsed="0.005339"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:07.536290" elapsed="0.005701"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:07.536267" elapsed="0.005754"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:07.543127" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:31:07.542604" elapsed="0.000553"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:31:07.543210" elapsed="0.000122"/>
</return>
<msg time="2026-04-17T03:31:07.543508" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:31:07.542265" elapsed="0.001277"/>
</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-04-17T03:31:07.543776" elapsed="0.000594"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:07.544782" level="INFO">index=13
host=10.30.170.120
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-04-17T03:31:07.544915" level="INFO">${karaf_connection_object} = index=13
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:31:07.544608" elapsed="0.000353"/>
</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-04-17T03:31:07.545136" elapsed="0.002871"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:31:07.548491" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:31:07.549870" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:31:07.548198" elapsed="0.002154">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:07.554432" elapsed="0.000715"/>
</kw>
<kw name="Open 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-04-17T03:31:07.555409" elapsed="0.000443"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:31:07.556115" elapsed="0.000210"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:31:07.551404" elapsed="0.005005"/>
</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-04-17T03:31:07.550760" elapsed="0.005699"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:31:07.530111" elapsed="0.026467">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:07.556992" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:31:07.557069" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:31:07.512603" elapsed="0.044581">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:31:07.557299" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:31:07.557344" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:07.507355" elapsed="0.050013"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:07.557812" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:07.557452" elapsed="0.000416"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:07.557431" elapsed="0.000462"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:31:07.507188" elapsed="0.050730"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:31:07.507001" elapsed="0.050972"/>
</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-04-17T03:31:07.504297" elapsed="0.053745"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-17T03:31:07.496192" elapsed="0.061909"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:07.495637" elapsed="0.062508"/>
</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-04-17T03:31:03.504171" elapsed="4.054029"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:07.558727" level="INFO">${conn_id} = 15</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-04-17T03:31:07.558367" elapsed="0.000386"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:31:07.559293" level="INFO">${conn_id} = 15</msg>
<arg>${conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:31:07.558947" 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-04-17T03:31:07.561573" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:31:07.561682" 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-04-17T03:31:07.561197" elapsed="0.000517"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:07.561993" elapsed="0.000449"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:31:07.563395" level="INFO">Logging into '10.30.170.120:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:31:07.917944" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 17 03:31:03 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:31:04 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:31:07.563063" elapsed="0.355056"/>
</kw>
<msg time="2026-04-17T03:31:07.918209" 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-04-17T03:31:07.562663" elapsed="0.355636"/>
</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-04-17T03:31:07.560612" elapsed="0.357808"/>
</kw>
<msg time="2026-04-17T03:31:07.918473" 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-04-17T03:31:07.560077" elapsed="0.358445"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-17T03:31:07.559678" elapsed="0.358925"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:31:07.919325" level="INFO">Creating Session using : alias=config-session, url=http://10.30.170.120:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a4416681610&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-04-17T03:31:07.918876" elapsed="0.000642"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-04-17T03:31:07.929506" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-04-17T03:31:07.944387" 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-04-17T03:31:07.919704" elapsed="0.024791"/>
</kw>
<kw name="Assure_Library_Ipaddr" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:31:07.947193" level="INFO">Executing command 'bash -c 'cd "." &amp;&amp; python -c "import ipaddr"''.</msg>
<msg time="2026-04-17T03:31:07.980091" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:31:07.980478" level="INFO">${stdout} = </msg>
<msg time="2026-04-17T03:31:07.980584" level="INFO">${stderr} = </msg>
<msg time="2026-04-17T03:31:07.980679" 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-04-17T03:31:07.946887" elapsed="0.033846"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:31:07.983102" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-04-17T03:31:07.982405" elapsed="0.000807"/>
</kw>
<msg time="2026-04-17T03:31:07.983439" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-04-17T03:31:07.983540" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:07.981407" elapsed="0.002185"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:07.985085" 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-04-17T03:31:07.984031" elapsed="0.001115"/>
</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-04-17T03:31:07.986279" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:07.985382" elapsed="0.001051"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:07.985323" elapsed="0.001174"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-04-17T03:31:07.986855" elapsed="0.000109"/>
</return>
<status status="PASS" start="2026-04-17T03:31:07.986623" elapsed="0.000423"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:07.986588" elapsed="0.000515"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-04-17T03:31:07.987314" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:07.987234" elapsed="0.000168"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:07.987198" elapsed="0.000382"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:07.987973" elapsed="0.000052"/>
</kw>
<msg time="2026-04-17T03:31:07.988338" 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-04-17T03:31:07.946310" elapsed="0.042085"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-04-17T03:31:07.988770" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-04-17T03:31:07.988556" elapsed="0.000339"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:07.988517" elapsed="0.000469"/>
</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-04-17T03:31:07.989426" elapsed="0.000052"/>
</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-04-17T03:31:07.945040" elapsed="0.044583"/>
</kw>
<doc>Initialize SetupUtils. Suite setup keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:03.503760" elapsed="4.485979"/>
</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-04-17T03:31:07.995232" elapsed="0.000346"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:31:07.994776" elapsed="0.000898"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:07.997363" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:07.997131" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:07.997101" elapsed="0.000371"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:08.003153" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:08.003040" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:08.003020" elapsed="0.000204"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.004326" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:31:08.003893" elapsed="0.000462"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.004855" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:31:08.004532" elapsed="0.000352"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:31:08.004947" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:31:08.005119" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:31:08.003472" elapsed="0.001673"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:08.011287" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:08.011168" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:08.011147" elapsed="0.000213"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:08.012643" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:08.012533" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:08.012515" elapsed="0.000199"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:08.013251" level="INFO">${karaf_connection_index} = 13</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:31:08.012873" elapsed="0.000407"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:08.013722" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:31:08.013490" elapsed="0.000259"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:31:08.014597" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:31:08.014312" elapsed="0.001013">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:31:08.015523" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:31:08.015570" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:08.013918" elapsed="0.001677"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:31:08.016418" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:31:08.016161" elapsed="0.001009">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:31:08.017452" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:31:08.017526" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:08.015772" elapsed="0.001787"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.018627" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Reconfigure_ODL_To_Accept_Connection"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:31:08.017884" elapsed="0.000809">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Reconfigure_ODL_To_Accept_Connection"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:31:08.017644" elapsed="0.001323">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Reconfigure_ODL_To_Accept_Connection"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:31:08.017621" elapsed="0.001387">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Reconfigure_ODL_To_Accept_Connection"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:08.019194" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:08.019441" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:08.019287" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:08.019269" elapsed="0.000251"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:31:08.019555" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:31:08.022433" elapsed="0.000153"/>
</kw>
<msg time="2026-04-17T03:31:08.022656" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:08.021162" 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-04-17T03:31:08.023106" elapsed="0.000103"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:08.023491" 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-04-17T03:31:08.020456" elapsed="0.003227"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:31:08.019860" elapsed="0.003891"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:31:08.012211" elapsed="0.011630">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Reconfigure_ODL_To_Accept_Connection"</status>
</kw>
<msg time="2026-04-17T03:31:08.024078" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:31:08.024130" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Reconfigure_ODL_To_Accept_Connection"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:08.011526" elapsed="0.012633"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:31:08.024354" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:08.024241" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:08.024222" elapsed="0.000201"/>
</if>
<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-04-17T03:31:08.025281" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:08.025163" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:08.025140" elapsed="0.000249"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:08.025693" level="INFO">index=15
host=10.30.170.120
alias=None
port=22
timeout=6 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-04-17T03:31:08.025802" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
alias=None
port=22
timeout=6 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-04-17T03:31:08.025561" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.026355" level="INFO">{1: 13}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:08.026034" elapsed="0.000372"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.026820" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:08.026570" elapsed="0.000295"/>
</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-04-17T03:31:08.027473" elapsed="0.000271"/>
</kw>
<msg time="2026-04-17T03:31:08.027846" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:31:08.027894" level="INFO">${old_connection_index} = 13</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:08.027049" elapsed="0.000868"/>
</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-04-17T03:31:08.028875" elapsed="0.000241"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:31:08.030379" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:31:08.029878" elapsed="0.001489">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:08.029316" elapsed="0.002154"/>
</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-04-17T03:31:08.032156" elapsed="0.000293"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:08.031654" elapsed="0.000880"/>
</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-04-17T03:31:08.028315" elapsed="0.004268"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:08.028061" elapsed="0.004574"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:08.028041" elapsed="0.004619"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:08.033587" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:31:08.033236" elapsed="0.000379"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:31:08.033664" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:31:08.033821" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:31:08.032879" elapsed="0.000967"/>
</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-04-17T03:31:08.034048" elapsed="0.000517"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:08.034874" level="INFO">index=16
host=10.30.170.120
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-04-17T03:31:08.035009" level="INFO">${karaf_connection_object} = index=16
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:31:08.034761" elapsed="0.000276"/>
</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-04-17T03:31:08.035197" elapsed="0.002564"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:31:08.038228" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:31:08.039377" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:31:08.037959" elapsed="0.001849">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:31:08.055390" elapsed="0.000450"/>
</kw>
<msg time="2026-04-17T03:31:08.055972" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:08.053272" elapsed="0.002866"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:08.056319" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:08.056496" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:31:08.040729" elapsed="0.015852"/>
</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-04-17T03:31:08.040145" elapsed="0.016485"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:31:08.024835" elapsed="0.031890">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:08.057149" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:31:08.057229" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:31:08.010774" elapsed="0.046575">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:31:08.057788" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:31:08.057835" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:08.005692" elapsed="0.052168"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:08.058350" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:08.057994" elapsed="0.000420"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:08.057962" elapsed="0.000487"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:31:08.005521" elapsed="0.052964"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:31:08.005208" elapsed="0.053325"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:31:08.002627" elapsed="0.055989"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:31:07.996633" elapsed="0.062063"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:07.995947" elapsed="0.062806"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:31:07.991138" elapsed="0.067676"/>
</kw>
<for flavor="IN ZIP">
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.060570" 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-04-17T03:31:08.059345" elapsed="0.001256"/>
</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-04-17T03:31:08.097830" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:08.097330" elapsed="0.000538"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:08.098958" 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-04-17T03:31:08.098528" elapsed="0.000546">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-04-17T03:31:08.099220" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:08.098077" elapsed="0.001180"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.100255" 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-04-17T03:31:08.099572" elapsed="0.000734"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:31:08.100790" 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-04-17T03:31:08.101079" 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-04-17T03:31:08.100578" elapsed="0.000544"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.101819" 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-04-17T03:31:08.101377" elapsed="0.000531"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.103136" 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-04-17T03:31:08.102833" elapsed="0.000351"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.103708" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:31:08.103360" elapsed="0.000376"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.104526" 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-04-17T03:31:08.104206" elapsed="0.000347"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:08.105662" 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-04-17T03:31:08.105118" elapsed="0.000644"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:08.105821" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:31:08.106027" 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-04-17T03:31:08.104757" elapsed="0.001297"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:31:08.106221" elapsed="0.000259"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.2</var>
<status status="PASS" start="2026-04-17T03:31:08.104046" elapsed="0.002477"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.107292" 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-04-17T03:31:08.106847" elapsed="0.000472"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:08.108392" 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-04-17T03:31:08.107908" elapsed="0.000512"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:08.108471" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:31:08.108633" 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-04-17T03:31:08.107518" elapsed="0.001143"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:31:08.108843" elapsed="0.000248"/>
</kw>
<var name="${key}">TYPE</var>
<var name="${value}">external</var>
<status status="PASS" start="2026-04-17T03:31:08.106640" elapsed="0.002493"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.109764" 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-04-17T03:31:08.109388" elapsed="0.000403"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:08.111087" 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-04-17T03:31:08.110548" elapsed="0.000574"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:08.111181" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:31:08.111369" 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-04-17T03:31:08.110210" 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-04-17T03:31:08.111600" elapsed="0.000238"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:31:08.109247" elapsed="0.002634"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.112472" 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-04-17T03:31:08.112158" elapsed="0.000342"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:08.113518" 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-04-17T03:31:08.113050" elapsed="0.000496"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:08.113596" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:31:08.113793" 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-04-17T03:31:08.112693" elapsed="0.001132"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:31:08.114008" elapsed="0.000300"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:31:08.112015" elapsed="0.002338"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.114955" 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-04-17T03:31:08.114617" elapsed="0.000370"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:08.116078" 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-04-17T03:31:08.115537" elapsed="0.000569"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:08.116158" elapsed="0.000048"/>
</return>
<msg time="2026-04-17T03:31:08.116355" 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-04-17T03:31:08.115190" 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-04-17T03:31:08.116544" elapsed="0.000232"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:31:08.114471" elapsed="0.002346"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.117521" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:31:08.117095" elapsed="0.000459"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:08.118568" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:31:08.118109" elapsed="0.000487"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:08.118731" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:31:08.118895" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:31:08.117754" elapsed="0.001167"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:31:08.119104" elapsed="0.000283"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:31:08.116951" elapsed="0.002483"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.120063" 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-04-17T03:31:08.119714" elapsed="0.000379"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:08.121155" 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-04-17T03:31:08.120668" elapsed="0.000515"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:08.121239" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:31:08.121402" 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-04-17T03:31:08.120310" elapsed="0.001134"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:31:08.121623" elapsed="0.000241"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:31:08.119558" elapsed="0.002350"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:31:08.103793" elapsed="0.018171"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:31:08.122015" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:31:08.122194" 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-04-17T03:31:08.102481" elapsed="0.019742"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:08.102066" elapsed="0.020198"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:08.122485" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:08.122300" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:08.102029" elapsed="0.020540"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.123562" 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-04-17T03:31:08.122745" elapsed="0.000848"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:31:08.123646" 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-04-17T03:31:08.096435" elapsed="0.027350"/>
</kw>
<msg time="2026-04-17T03:31:08.123848" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:08.082950" elapsed="0.040960"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:31:08.138819" elapsed="0.000048"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:31:08.152132" 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/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-04-17T03:31:08.165426" elapsed="0.000040"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:08.165832" 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-04-17T03:31:08.166091" 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-04-17T03:31:08.166620" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:08.166402" elapsed="0.000301"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:08.166384" elapsed="0.000356"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:08.166975" 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-04-17T03:31:08.167228" elapsed="0.000029"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:08.167477" elapsed="0.000031"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:31:08.166343" elapsed="0.001213"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:31:08.166206" elapsed="0.001389"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:08.167812" elapsed="0.000031"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:08.167939" elapsed="0.000026"/>
</return>
<msg time="2026-04-17T03:31:08.168164" 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-04-17T03:31:08.077289" elapsed="0.090915"/>
</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-04-17T03:31:08.200186" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:08.199515" elapsed="0.000721"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:08.201197" 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-04-17T03:31:08.200880" elapsed="0.000408">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-04-17T03:31:08.201390" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:08.200485" elapsed="0.000931"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.202130" 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-04-17T03:31:08.201623" elapsed="0.000546"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:31:08.202607" 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-04-17T03:31:08.202844" 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-04-17T03:31:08.202409" elapsed="0.000476"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.203430" 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-04-17T03:31:08.203123" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-17T03:31:08.204089" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:08.203574" elapsed="0.000606"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.204961" level="INFO">${mapping_to_use} = {'IP': '127.0.0.2', 'TYPE': 'external', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:08.204502" elapsed="0.000502"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:08.204222" elapsed="0.000934"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:08.203547" elapsed="0.001645"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.206528" 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-04-17T03:31:08.205418" elapsed="0.001154"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:31:08.206645" elapsed="0.000057"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:31:08.198425" elapsed="0.008435"/>
</kw>
<msg time="2026-04-17T03:31:08.206969" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:08.183241" elapsed="0.023812"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:31:08.222676" elapsed="0.000077"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:31:08.235608" elapsed="0.000045"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:31:08.248996" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:08.249231" 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-04-17T03:31:08.249425" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:08.249893" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:08.249720" elapsed="0.000247"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:08.249700" elapsed="0.000296"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:08.250152" 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-04-17T03:31:08.250330" 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-04-17T03:31:08.250506" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:31:08.249650" elapsed="0.000909"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:31:08.249509" elapsed="0.001078"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:08.250742" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:08.250820" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:31:08.251004" 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-04-17T03:31:08.179514" elapsed="0.071610"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:08.252751" 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-04-17T03:31:08.252386" elapsed="0.000452">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-04-17T03:31:08.252957" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:08.251948" elapsed="0.001037"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:08.253341" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:08.253060" elapsed="0.000341"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.254021" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:08.253695" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:08.253427" elapsed="0.000658"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:08.253042" elapsed="0.001064"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.256526" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:31:08.254266" elapsed="0.002288"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:31:08.256607" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:31:08.256805" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:31:08.251481" elapsed="0.005352"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.258320" 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-04-17T03:31:08.258061" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.258770" 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-04-17T03:31:08.258529" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.259244" 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-04-17T03:31:08.258996" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.259687" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:08.259445" elapsed="0.000286"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:08.260604" 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-04-17T03:31:08.260368" elapsed="0.000264"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:31:08.261000" 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-04-17T03:31:08.260795" elapsed="0.000232"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:31:08.261188" elapsed="0.000216"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.261897" 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-04-17T03:31:08.261576" elapsed="0.000399"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:31:08.262020" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:31:08.262182" 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-04-17T03:31:08.259950" elapsed="0.002258"/>
</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-04-17T03:31:08.268115" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:31:08.469900" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:31:08.873254" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:31:08.875979" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:31:08.264606" elapsed="0.615298">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:31:08.262279" elapsed="0.617816">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:08.880512" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:08.880161" elapsed="0.000460"/>
</branch>
<status status="FAIL" start="2026-04-17T03:31:08.262261" elapsed="0.618395">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:08.881390" elapsed="0.000043"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:08.881607" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:08.881550" elapsed="0.000121"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:08.881520" 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-04-17T03:31:08.881945" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:31:08.882047" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:31:08.257191" elapsed="0.625019">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:08.882322" elapsed="0.000067"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:31:08.065655" elapsed="0.816880">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:08.882993" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:08.882705" elapsed="0.000387"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:08.882678" elapsed="0.000539"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:08.883267" elapsed="0.000016"/>
</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="FAIL" start="2026-04-17T03:31:08.060911" elapsed="0.822463">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<var name="${i}">2</var>
<var name="${type}">external</var>
<status status="FAIL" start="2026-04-17T03:31:08.059135" elapsed="0.824318">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</iter>
<var>${i}</var>
<var>${type}</var>
<value>${ODL_IP_INDICES_ALL}</value>
<value>${BGP_PEER_TYPES}</value>
<status status="FAIL" start="2026-04-17T03:31:08.058893" elapsed="0.824647">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</for>
<doc>Configures BGP peer module with initiate-connection set to false.</doc>
<status status="FAIL" start="2026-04-17T03:31:07.989864" elapsed="0.893861">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:31:08.888312" elapsed="0.000367"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:31:08.887892" elapsed="0.000870"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:08.890183" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:08.889996" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:08.889966" elapsed="0.000315"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:08.896833" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:08.896695" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:08.896671" elapsed="0.000245"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.898182" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:31:08.897710" elapsed="0.000502"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.898784" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:31:08.898441" elapsed="0.000370"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:31:08.898857" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:31:08.899043" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:31:08.897293" elapsed="0.001775"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:08.904941" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:08.904798" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:08.904776" elapsed="0.000240"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:08.906348" elapsed="0.000055"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:08.906224" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:08.906204" elapsed="0.000255"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:08.906955" level="INFO">${karaf_connection_index} = 16</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:31:08.906616" elapsed="0.000369"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:08.907383" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:31:08.907157" elapsed="0.000252"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:31:08.910256" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:31:08.907922" elapsed="0.003116">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:31:08.911298" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:31:08.911351" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:08.907575" elapsed="0.003801"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:31:08.912264" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:31:08.911992" elapsed="0.000956">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:31:08.913140" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:31:08.913187" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:08.911565" elapsed="0.001647"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.914205" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Start_Bgp_Peers"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:31:08.913543" elapsed="0.000727">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Start_Bgp_Peers"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:31:08.913297" elapsed="0.001046">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Start_Bgp_Peers"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:31:08.913275" elapsed="0.001150">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Start_Bgp_Peers"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:08.914626" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:08.914865" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:08.914715" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:08.914697" elapsed="0.000275"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:31:08.915010" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:31:08.917766" elapsed="0.000153"/>
</kw>
<msg time="2026-04-17T03:31:08.918036" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:08.916604" elapsed="0.001573"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:08.918496" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:08.918843" 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-04-17T03:31:08.915918" elapsed="0.003178"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:31:08.915338" elapsed="0.003834"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:31:08.905851" elapsed="0.013412">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Start_Bgp_Peers"</status>
</kw>
<msg time="2026-04-17T03:31:08.919374" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:31:08.919419" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Start_Bgp_Peers"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:08.905187" elapsed="0.014256"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:31:08.919648" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:08.919527" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:08.919506" elapsed="0.000246"/>
</if>
<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-04-17T03:31:08.920656" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:08.920545" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:08.920526" elapsed="0.000206"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:08.921231" level="INFO">index=15
host=10.30.170.120
alias=None
port=22
timeout=6 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-04-17T03:31:08.921379" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
alias=None
port=22
timeout=6 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-04-17T03:31:08.921053" elapsed="0.000364"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.922046" level="INFO">{1: 16}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:08.921651" elapsed="0.000451"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.922798" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:08.922325" elapsed="0.000534"/>
</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-04-17T03:31:08.923680" elapsed="0.000389"/>
</kw>
<msg time="2026-04-17T03:31:08.924209" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:31:08.924275" level="INFO">${old_connection_index} = 16</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:08.923120" elapsed="0.001188"/>
</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-04-17T03:31:08.925673" elapsed="0.000288"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:31:08.927899" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:31:08.926920" elapsed="0.002311">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:08.926222" elapsed="0.003163"/>
</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-04-17T03:31:08.930339" elapsed="0.000464"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:08.929647" elapsed="0.001277"/>
</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-04-17T03:31:08.924752" elapsed="0.006265"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:08.924419" elapsed="0.006668"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:08.924391" elapsed="0.006744"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:08.932666" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:31:08.932033" elapsed="0.000671"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:31:08.932775" elapsed="0.000057"/>
</return>
<msg time="2026-04-17T03:31:08.933030" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:31:08.931488" elapsed="0.001575"/>
</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-04-17T03:31:08.933306" elapsed="0.000818"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:08.934578" level="INFO">index=17
host=10.30.170.120
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-04-17T03:31:08.934719" level="INFO">${karaf_connection_object} = index=17
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:31:08.934383" elapsed="0.000368"/>
</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-04-17T03:31:08.935188" elapsed="0.003481"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:31:08.939456" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:31:08.940702" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:31:08.939038" elapsed="0.002311">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:31:08.959584" elapsed="0.000661"/>
</kw>
<msg time="2026-04-17T03:31:08.960365" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:08.957833" elapsed="0.002707"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:08.960726" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:08.960902" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:31:08.942840" elapsed="0.018174"/>
</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-04-17T03:31:08.941904" elapsed="0.019164"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:31:08.920224" elapsed="0.040942">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:08.961702" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:31:08.961786" elapsed="0.000023"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:31:08.904421" elapsed="0.057486">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:31:08.962052" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:31:08.962097" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:08.899472" elapsed="0.062648"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:08.962526" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:08.962210" elapsed="0.000372"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:08.962187" elapsed="0.000421"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:31:08.899317" elapsed="0.063316"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:31:08.899131" elapsed="0.063537"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:31:08.896170" elapsed="0.066558"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:31:08.889564" elapsed="0.073224"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:08.889011" elapsed="0.073824"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:31:08.885063" elapsed="0.077828"/>
</kw>
<for flavor="IN ZIP">
<iter>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.963695" level="INFO">IP: 127.0.0.2</msg>
<msg time="2026-04-17T03:31:08.963769" 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-04-17T03:31:08.963359" elapsed="0.000449"/>
</kw>
<kw name="Start_Bgp_Peer">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.965391" level="INFO">${command} = python3 play.py --amount 0 --myip=127.0.0.2 --myport=17900 --peerip=10.30.170.120 --asnumber=65000 --peerport=1790 --port=8002 --usepeerip --debug --allf --wfr 1 &amp;&gt; play.py.090.2 &amp;</msg>
<var>${command}</var>
<arg>python3 play.py --amount 0 --myip=${ip} --myport=${BGP_TOOL_PORT} --peerip=${ODL_SYSTEM_IP} --asnumber=${as_number} --peerport=${ODL_BGP_PORT} --port=${port} --usepeerip --debug --allf --wfr 1 &amp;&gt; ${filename} &amp;</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:08.964856" elapsed="0.000569"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.965852" level="INFO">python3 play.py --amount 0 --myip=127.0.0.2 --myport=17900 --peerip=10.30.170.120 --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-04-17T03:31:08.965599" elapsed="0.000301"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:31:08.970123" level="INFO">python3 play.py --amount 0 --myip=127.0.0.2 --myport=17900 --peerip=10.30.170.120 --asnumber=65000 --peerport=1790 --port=8002 --usepeerip --debug --allf --wfr 1 &amp;&gt; play.py.090.2 &amp;</msg>
<msg time="2026-04-17T03:31:08.970288" level="INFO">${output} =  python3 play.py --amount 0 --myip=127.0.0.2 --myport=17900 --peerip=10.30.170.120 --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-04-17T03:31:08.966076" elapsed="0.004244"/>
</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-04-17T03:31:08.964322" elapsed="0.006083"/>
</kw>
<var name="${i}">2</var>
<var name="${as_number}">65000</var>
<status status="PASS" start="2026-04-17T03:31:08.963208" elapsed="0.007305"/>
</iter>
<iter>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.971410" level="INFO">IP: 127.0.0.3</msg>
<msg time="2026-04-17T03:31:08.971508" 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-04-17T03:31:08.970915" elapsed="0.000645"/>
</kw>
<kw name="Start_Bgp_Peer">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.973240" level="INFO">${command} = python3 play.py --amount 0 --myip=127.0.0.3 --myport=17900 --peerip=10.30.170.120 --asnumber=64496 --peerport=1790 --port=8003 --usepeerip --debug --allf --wfr 1 &amp;&gt; play.py.090.3 &amp;</msg>
<var>${command}</var>
<arg>python3 play.py --amount 0 --myip=${ip} --myport=${BGP_TOOL_PORT} --peerip=${ODL_SYSTEM_IP} --asnumber=${as_number} --peerport=${ODL_BGP_PORT} --port=${port} --usepeerip --debug --allf --wfr 1 &amp;&gt; ${filename} &amp;</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:08.972534" elapsed="0.000752"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.974309" level="INFO">python3 play.py --amount 0 --myip=127.0.0.3 --myport=17900 --peerip=10.30.170.120 --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-04-17T03:31:08.973529" elapsed="0.000850"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:31:08.975445" level="INFO">[?2004l[1] 5139</msg>
<msg time="2026-04-17T03:31:08.975571" level="INFO">${output} = [?2004l[1] 5139
</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-04-17T03:31:08.974652" elapsed="0.000956"/>
</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-04-17T03:31:08.971774" elapsed="0.003932"/>
</kw>
<var name="${i}">3</var>
<var name="${as_number}">64496</var>
<status status="PASS" start="2026-04-17T03:31:08.970670" elapsed="0.005204"/>
</iter>
<iter>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.976802" level="INFO">IP: 127.0.0.4</msg>
<msg time="2026-04-17T03:31:08.976945" 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-04-17T03:31:08.976306" elapsed="0.000698"/>
</kw>
<kw name="Start_Bgp_Peer">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.979074" level="INFO">${command} = python3 play.py --amount 0 --myip=127.0.0.4 --myport=17900 --peerip=10.30.170.120 --asnumber=64496 --peerport=1790 --port=8004 --usepeerip --debug --allf --wfr 1 &amp;&gt; play.py.090.4 &amp;</msg>
<var>${command}</var>
<arg>python3 play.py --amount 0 --myip=${ip} --myport=${BGP_TOOL_PORT} --peerip=${ODL_SYSTEM_IP} --asnumber=${as_number} --peerport=${ODL_BGP_PORT} --port=${port} --usepeerip --debug --allf --wfr 1 &amp;&gt; ${filename} &amp;</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:08.978490" elapsed="0.000617"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.979537" level="INFO">python3 play.py --amount 0 --myip=127.0.0.4 --myport=17900 --peerip=10.30.170.120 --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-04-17T03:31:08.979284" elapsed="0.000301"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:31:08.982391" level="INFO">[?2004h[jenkins@releng-26932-188-0-builder-0 ~]&gt; python3 play.py --amount 0 --myip=127.0.0.3 --myport=17900 --peerip=10.30.170.120 --asnumber=64496 --peerport=1790 --port=8003 --usepeerip --debug --allf --wfr 1 &amp;&gt; play.py.090.3 &amp;</msg>
<msg time="2026-04-17T03:31:08.982535" level="INFO">${output} = [?2004h[jenkins@releng-26932-188-0-builder-0 ~]&gt; python3 play.py --amount 0 --myip=127.0.0.3 --myport=17900 --peerip=10.30.170.120 --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-04-17T03:31:08.979745" elapsed="0.002819"/>
</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-04-17T03:31:08.977216" elapsed="0.005426"/>
</kw>
<var name="${i}">4</var>
<var name="${as_number}">64496</var>
<status status="PASS" start="2026-04-17T03:31:08.976083" elapsed="0.006604"/>
</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-04-17T03:31:08.962980" elapsed="0.019749"/>
</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-04-17T03:31:08.884184" elapsed="0.098713"/>
</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-04-17T03:31:08.987515" elapsed="0.000269"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:31:08.987214" elapsed="0.000635"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:08.989017" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:08.988856" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:08.988829" 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-04-17T03:31:08.995241" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:08.995096" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:08.995069" elapsed="0.000260"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.996547" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:31:08.996078" elapsed="0.000500"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:31:08.997091" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:31:08.996750" elapsed="0.000369"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:31:08.997165" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:31:08.997342" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:31:08.995634" elapsed="0.001735"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:09.003865" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:09.003726" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:09.003701" 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-04-17T03:31:09.005334" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:09.005223" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:09.005205" elapsed="0.000199"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:09.005891" level="INFO">${karaf_connection_index} = 17</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:31:09.005563" elapsed="0.000356"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:09.006333" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:31:09.006111" elapsed="0.000334"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:31:09.007417" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:31:09.007109" elapsed="0.001025">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:31:09.008327" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:31:09.008375" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:09.006678" elapsed="0.001720"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:31:09.009282" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:31:09.008989" elapsed="0.001041">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:31:09.010225" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:31:09.010273" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:09.008577" elapsed="0.001721"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:31:09.011378" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Play_To_Odl_ext_l3vpn_rt_arg"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:31:09.010679" elapsed="0.000772">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Play_To_Odl_ext_l3vpn_rt_arg"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:31:09.010384" elapsed="0.001142">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Play_To_Odl_ext_l3vpn_rt_arg"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:31:09.010360" elapsed="0.001204">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Play_To_Odl_ext_l3vpn_rt_arg"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:09.011741" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:09.012028" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:09.011831" elapsed="0.000259"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:09.011813" elapsed="0.000303"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:31:09.012155" elapsed="0.000019"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:31:09.015136" elapsed="0.000175"/>
</kw>
<msg time="2026-04-17T03:31:09.015384" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:09.013825" elapsed="0.001717"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:09.015848" elapsed="0.000128"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:09.016262" 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-04-17T03:31:09.013151" elapsed="0.003305"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:31:09.012520" elapsed="0.004002"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:31:09.004882" elapsed="0.011731">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Play_To_Odl_ext_l3vpn_rt_arg"</status>
</kw>
<msg time="2026-04-17T03:31:09.016728" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:31:09.016773" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Play_To_Odl_ext_l3vpn_rt_arg"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:09.004172" elapsed="0.012626"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:31:09.017045" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:09.016886" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:09.016862" elapsed="0.000257"/>
</if>
<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-04-17T03:31:09.018317" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:09.018193" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:09.018173" elapsed="0.000217"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:09.018749" level="INFO">index=15
host=10.30.170.120
alias=None
port=22
timeout=6 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-04-17T03:31:09.018864" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
alias=None
port=22
timeout=6 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-04-17T03:31:09.018601" elapsed="0.000365"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:09.019477" level="INFO">{1: 17}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:09.019137" elapsed="0.000388"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:09.020092" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:09.019703" elapsed="0.000437"/>
</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-04-17T03:31:09.020776" elapsed="0.000300"/>
</kw>
<msg time="2026-04-17T03:31:09.021182" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:31:09.021232" level="INFO">${old_connection_index} = 17</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:09.020327" elapsed="0.000929"/>
</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-04-17T03:31:09.022183" elapsed="0.000227"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:31:09.023674" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:31:09.023241" elapsed="0.001440">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:09.022667" elapsed="0.002116"/>
</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-04-17T03:31:09.025476" elapsed="0.000297"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:09.024987" elapsed="0.000872"/>
</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-04-17T03:31:09.021579" elapsed="0.004328"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:09.021335" elapsed="0.004638"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:09.021315" elapsed="0.004685"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:09.027334" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:31:09.026925" elapsed="0.000445"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:31:09.027443" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:31:09.027630" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:31:09.026302" elapsed="0.001355"/>
</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-04-17T03:31:09.027824" elapsed="0.000466"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:09.028620" level="INFO">index=18
host=10.30.170.120
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-04-17T03:31:09.028744" level="INFO">${karaf_connection_object} = index=18
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:31:09.028481" elapsed="0.000292"/>
</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-04-17T03:31:09.029005" elapsed="0.002638"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:31:09.032138" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:31:09.033507" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:31:09.031837" elapsed="0.002184">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:31:09.050321" elapsed="0.000485"/>
</kw>
<msg time="2026-04-17T03:31:09.051066" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:09.048681" elapsed="0.002603"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:09.051473" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:09.051665" elapsed="0.000032"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:31:09.035060" elapsed="0.016731"/>
</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-04-17T03:31:09.034375" elapsed="0.017483"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:31:09.017569" elapsed="0.034819">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:09.052913" elapsed="0.000052"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:31:09.053031" elapsed="0.000029"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:31:09.003259" elapsed="0.049923">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:31:09.053334" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:31:09.053389" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:08.997787" elapsed="0.055630"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:09.053879" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:09.053524" elapsed="0.000442"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:09.053497" elapsed="0.000503"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:31:08.997631" elapsed="0.056402"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:31:08.997434" elapsed="0.056644"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:31:08.994433" elapsed="0.059722"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:31:08.988531" elapsed="0.065705"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:08.988041" elapsed="0.066270"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:31:08.984630" elapsed="0.069769"/>
</kw>
<kw name="Play_To_Odl_Non_Removal_BgpRpcClient2">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:31:09.070835" 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-04-17T03:31:09.071113" 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-04-17T03:31:09.070510" elapsed="0.000633"/>
</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-04-17T03:31:09.071324" elapsed="0.002279"/>
</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-04-17T03:31:09.069864" elapsed="0.003855"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:31:09.074615" 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-04-17T03:31:09.073978" elapsed="0.000669"/>
</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-04-17T03:31:09.134558" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:09.134019" elapsed="0.000578"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:09.135576" 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-04-17T03:31:09.135276" elapsed="0.000398">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-04-17T03:31:09.135794" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:09.134851" elapsed="0.000975"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:09.136499" 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-04-17T03:31:09.136071" elapsed="0.000550"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:31:09.136977" 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-04-17T03:31:09.137182" 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-04-17T03:31:09.136803" elapsed="0.000415"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:09.137687" 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-04-17T03:31:09.137397" elapsed="0.000342"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:09.138993" 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-04-17T03:31:09.138693" elapsed="0.000354"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:31:09.139562" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:31:09.139238" elapsed="0.000353"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:09.140539" 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-04-17T03:31:09.140034" elapsed="0.000534"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:09.141696" 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-04-17T03:31:09.141276" elapsed="0.000449"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:09.141781" elapsed="0.000048"/>
</return>
<msg time="2026-04-17T03:31:09.141986" 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-04-17T03:31:09.140830" elapsed="0.001182"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:31:09.142181" elapsed="0.000308"/>
</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-04-17T03:31:09.139848" elapsed="0.002683"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:09.143203" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:31:09.142842" elapsed="0.000389"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:09.144158" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:31:09.143794" elapsed="0.000391"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:09.144237" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:31:09.144396" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:31:09.143429" elapsed="0.000992"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:31:09.144581" elapsed="0.000282"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:31:09.142693" elapsed="0.002213"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:31:09.139650" elapsed="0.005333"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:31:09.145041" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:31:09.145218" 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-04-17T03:31:09.138275" elapsed="0.006970"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:09.137828" elapsed="0.007452"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:09.145483" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:09.145314" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:09.137800" elapsed="0.007763"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:31:09.146677" 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-04-17T03:31:09.145727" elapsed="0.000984"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:31:09.146765" elapsed="0.000033"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/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-04-17T03:31:09.132978" elapsed="0.013924"/>
</kw>
<msg time="2026-04-17T03:31:09.147051" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:09.118905" elapsed="0.028216"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:31:09.162416" elapsed="0.000075"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:31:09.175543" elapsed="0.000064"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:31:09.189089" elapsed="0.000060"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:09.189406" 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-04-17T03:31:09.189601" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:09.190066" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:09.189888" elapsed="0.000235"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:09.189870" 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-04-17T03:31:09.190301" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:09.190476" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:09.190648" elapsed="0.000036"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:31:09.189830" elapsed="0.000888"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:31:09.189685" elapsed="0.001062"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:09.190903" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:09.191002" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:31:09.191178" 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-04-17T03:31:09.114060" elapsed="0.077166"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:09.192763" 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-04-17T03:31:09.192444" elapsed="0.000396">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-04-17T03:31:09.192951" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:09.192009" elapsed="0.001039"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:09.193404" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:09.193124" elapsed="0.000337"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:31:09.194006" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:09.193689" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:09.193485" elapsed="0.000584"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:09.193105" elapsed="0.000986"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:09.196571" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:31:09.194252" elapsed="0.002346"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:31:09.196654" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:31:09.196831" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:31:09.191619" elapsed="0.005249"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:09.198265" 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-04-17T03:31:09.197988" elapsed="0.000347">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-04-17T03:31:09.198431" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:09.197611" elapsed="0.000845"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:31:09.198670" elapsed="0.000044"/>
</return>
<status status="PASS" start="2026-04-17T03:31:09.198529" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:09.198510" elapsed="0.000262"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:09.198943" 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-04-17T03:31:09.199125" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:31:09.199190" elapsed="0.000014"/>
</return>
<msg time="2026-04-17T03:31:09.201519" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:31:09.197240" elapsed="0.004307"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:09.203256" 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-04-17T03:31:09.202957" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:09.203727" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:09.203477" 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-04-17T03:31:09.209071" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:09.410693" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:09.813232" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:09.816083" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:31:09.206062" elapsed="0.615147">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:31:09.203846" elapsed="0.617697">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:09.822120" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:09.821637" elapsed="0.000642"/>
</branch>
<status status="FAIL" start="2026-04-17T03:31:09.203825" elapsed="0.618509">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:09.823287" elapsed="0.000110"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:09.823656" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:09.823567" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:09.823527" elapsed="0.000275"/>
</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-04-17T03:31:09.824177" elapsed="0.000051"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:31:09.824339" elapsed="0.000032"/>
</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-04-17T03:31:09.201916" elapsed="0.622560">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:09.824555" 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-04-17T03:31:09.086952" elapsed="0.737702">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:09.824951" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:09.824750" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:09.824733" elapsed="0.000318"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:09.825084" 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-04-17T03:31:09.079720" elapsed="0.745464">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:11.889843" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:11.889366" elapsed="0.000514"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:11.890945" 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-04-17T03:31:11.890632" elapsed="0.000406">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-04-17T03:31:11.891148" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:11.890092" elapsed="0.001083"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:11.891809" 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-04-17T03:31:11.891358" elapsed="0.000481"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:31:11.892202" 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-04-17T03:31:11.892414" 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-04-17T03:31:11.892034" elapsed="0.000410"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:11.892882" 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-04-17T03:31:11.892619" 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-04-17T03:31:11.894137" 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-04-17T03:31:11.893844" elapsed="0.000342"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:31:11.894781" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:31:11.894394" elapsed="0.000416"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:11.895728" 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-04-17T03:31:11.895306" elapsed="0.000450"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:11.896857" 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-04-17T03:31:11.896442" elapsed="0.000444"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:11.896962" elapsed="0.000049"/>
</return>
<msg time="2026-04-17T03:31:11.897194" 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-04-17T03:31:11.896029" 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-04-17T03:31:11.897432" elapsed="0.000316"/>
</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-04-17T03:31:11.895119" elapsed="0.002674"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:11.898692" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:31:11.898079" elapsed="0.000641"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:11.899721" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:31:11.899353" elapsed="0.000396"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:11.899804" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:31:11.899989" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:31:11.898973" elapsed="0.001043"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:31:11.900191" elapsed="0.000295"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:31:11.897915" elapsed="0.002617"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:31:11.894871" elapsed="0.005699"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:31:11.900625" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:31:11.900816" 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-04-17T03:31:11.893470" elapsed="0.007373"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:11.893037" elapsed="0.007840"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:11.901098" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:11.900907" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:11.893010" elapsed="0.008171"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:31:11.902161" 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-04-17T03:31:11.901481" elapsed="0.000715"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:31:11.902260" 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/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-04-17T03:31:11.888396" elapsed="0.014020"/>
</kw>
<msg time="2026-04-17T03:31:11.902477" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:11.873324" elapsed="0.029210"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:31:11.917611" elapsed="0.000083"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:31:11.931729" elapsed="0.000063"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:31:11.945394" elapsed="0.000062"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:11.945731" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:11.945948" 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-04-17T03:31:11.946493" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:11.946275" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:11.946254" 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-04-17T03:31:11.946779" 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-04-17T03:31:11.946973" 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-04-17T03:31:11.947149" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:31:11.946206" elapsed="0.000998"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:31:11.946039" elapsed="0.001193"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:11.947390" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:11.947472" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:31:11.947657" 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-04-17T03:31:11.867173" elapsed="0.080514"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:11.949355" 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-04-17T03:31:11.948998" elapsed="0.000441">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-04-17T03:31:11.949538" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:11.948551" elapsed="0.001012"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:11.949966" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:11.949647" elapsed="0.000397"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:31:11.950641" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:11.950319" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:11.950076" elapsed="0.000629"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:11.949627" elapsed="0.001101"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:11.953511" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:31:11.950895" elapsed="0.002645"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:31:11.953607" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:31:11.953823" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:31:11.948171" elapsed="0.005681"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:11.955277" 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-04-17T03:31:11.955007" elapsed="0.000343">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-04-17T03:31:11.955449" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:11.954602" elapsed="0.000872"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:31:11.955756" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-17T03:31:11.955547" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:11.955528" elapsed="0.000331"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:11.956045" elapsed="0.000025"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:11.956231" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:31:11.956299" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:31:11.958440" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:31:11.954220" elapsed="0.004248"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:11.960016" 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-04-17T03:31:11.959721" elapsed="0.000346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:11.960501" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:11.960231" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:31:11.965825" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:12.167594" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:12.570613" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:12.575220" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:31:11.962817" elapsed="0.617750">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:31:11.960629" elapsed="0.620131">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:12.581203" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:12.580831" elapsed="0.000473"/>
</branch>
<status status="FAIL" start="2026-04-17T03:31:11.960608" elapsed="0.620732">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:12.582027" elapsed="0.000040"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:12.582253" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:12.582175" elapsed="0.000161"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:12.582149" elapsed="0.000219"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:12.582591" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:31:12.582721" 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-04-17T03:31:11.958828" elapsed="0.624065">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:12.583029" 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-04-17T03:31:11.840543" elapsed="0.742630">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:12.586166" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:12.583346" elapsed="0.002954"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:12.583316" elapsed="0.003043"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:12.586409" elapsed="0.000027"/>
</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-04-17T03:31:11.834642" elapsed="0.751913">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:14.646726" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:14.646265" elapsed="0.000499"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:14.647650" 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-04-17T03:31:14.647376" elapsed="0.000355">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-04-17T03:31:14.647831" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:14.646971" elapsed="0.000885"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:14.648458" 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-04-17T03:31:14.648052" elapsed="0.000434"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:31:14.648861" 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-04-17T03:31:14.649091" 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-04-17T03:31:14.648665" elapsed="0.000459"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:14.649618" 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-04-17T03:31:14.649353" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:14.650914" 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-04-17T03:31:14.650597" elapsed="0.000384"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:31:14.651491" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:31:14.651155" elapsed="0.000363"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:14.652289" 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-04-17T03:31:14.651903" elapsed="0.000412"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:14.653353" 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-04-17T03:31:14.652965" elapsed="0.000416"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:14.653438" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:31:14.653611" 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-04-17T03:31:14.652519" elapsed="0.001117"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:31:14.653800" elapsed="0.000335"/>
</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-04-17T03:31:14.651755" elapsed="0.002424"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:14.655042" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:31:14.654691" elapsed="0.000378"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:14.656053" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:31:14.655692" elapsed="0.000388"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:14.656133" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:31:14.656289" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:31:14.655322" elapsed="0.000992"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:31:14.656475" elapsed="0.000277"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:31:14.654295" elapsed="0.002500"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:31:14.651573" elapsed="0.005258"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:31:14.656873" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:31:14.657187" 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-04-17T03:31:14.650159" elapsed="0.007061"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:14.649754" elapsed="0.007511"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:14.657530" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:14.657305" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:14.649728" elapsed="0.007910"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:31:14.658520" 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-04-17T03:31:14.657810" elapsed="0.000740"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:31:14.658617" elapsed="0.000041"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/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-04-17T03:31:14.645330" elapsed="0.013455"/>
</kw>
<msg time="2026-04-17T03:31:14.658848" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:14.630260" elapsed="0.028643"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:31:14.673988" elapsed="0.000065"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:31:14.688721" elapsed="0.000058"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:31:14.704031" elapsed="0.000090"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:14.704428" 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-04-17T03:31:14.704628" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:14.705118" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:14.704950" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:14.704912" elapsed="0.000292"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:14.705361" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:14.705536" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:14.705719" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:31:14.704871" elapsed="0.000904"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:31:14.704718" elapsed="0.001085"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:14.706065" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:14.706153" elapsed="0.000024"/>
</return>
<msg time="2026-04-17T03:31:14.706364" 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-04-17T03:31:14.625426" elapsed="0.080970"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:14.708128" 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-04-17T03:31:14.707793" elapsed="0.000417">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-04-17T03:31:14.708309" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:14.707257" elapsed="0.001077"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:14.708724" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:14.708408" elapsed="0.000392"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:31:14.709365" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:14.709057" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:14.708828" elapsed="0.000599"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:14.708388" elapsed="0.001061"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:14.712523" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:31:14.709612" elapsed="0.002951"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:31:14.712628" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:31:14.712807" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:31:14.706813" elapsed="0.006020"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:14.714435" 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-04-17T03:31:14.714133" elapsed="0.000382">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-04-17T03:31:14.714620" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:14.713688" elapsed="0.000960"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:31:14.714892" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-17T03:31:14.714729" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:14.714708" elapsed="0.000298"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:14.715235" elapsed="0.000025"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:14.715425" elapsed="0.000023"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:31:14.715495" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:31:14.717703" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:31:14.713250" elapsed="0.004485"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:14.719510" 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-04-17T03:31:14.719165" elapsed="0.000399"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:14.720000" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:14.719729" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:31:14.725855" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:14.927727" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:15.331118" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:15.333179" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:31:14.722733" elapsed="0.613108">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:31:14.720118" elapsed="0.615875">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:15.336308" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:15.336044" elapsed="0.000337"/>
</branch>
<status status="FAIL" start="2026-04-17T03:31:14.720098" elapsed="0.616308">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:15.336951" elapsed="0.000032"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:15.337111" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:15.337069" elapsed="0.000091"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:15.337046" elapsed="0.000136"/>
</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-04-17T03:31:15.337339" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:31:15.337410" 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-04-17T03:31:14.718170" elapsed="0.619378">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:15.337658" 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-04-17T03:31:14.600645" elapsed="0.737127">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:15.338147" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:15.337894" elapsed="0.000426"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:15.337870" elapsed="0.000488"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:15.338406" elapsed="0.000021"/>
</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-04-17T03:31:14.593741" elapsed="0.744812">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:31:15.338712" level="FAIL">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:09.074842" elapsed="6.264003">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:08.983713" elapsed="6.355388">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:15.345651" elapsed="0.000437"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:31:15.345182" elapsed="0.001002"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:15.348064" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:15.347841" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:15.347806" elapsed="0.000371"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:15.353773" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:15.353640" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:15.353619" elapsed="0.000227"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:15.355028" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:31:15.354551" elapsed="0.000517"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:31:15.355692" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:31:15.355298" elapsed="0.000420"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:31:15.355766" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:31:15.355968" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:31:15.354130" elapsed="0.001881"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:15.364314" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:15.364101" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:15.364067" 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-04-17T03:31:15.366807" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:15.366611" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:15.366574" elapsed="0.000336"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:15.367766" level="INFO">${karaf_connection_index} = 18</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:31:15.367170" elapsed="0.000639"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:15.368568" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:31:15.368192" elapsed="0.000404"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:31:15.369436" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:31:15.369149" elapsed="0.001047">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:31:15.370412" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:31:15.370465" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:15.368770" elapsed="0.001719"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:31:15.371459" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:31:15.371147" elapsed="0.001134">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:31:15.372476" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:31:15.372523" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:15.370682" elapsed="0.001864"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:31:15.373677" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Play_To_Odl_rt_constrain_type_0"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:31:15.372915" elapsed="0.000848">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Play_To_Odl_rt_constrain_type_0"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:31:15.372642" elapsed="0.001211">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Play_To_Odl_rt_constrain_type_0"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:31:15.372608" elapsed="0.001296">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Play_To_Odl_rt_constrain_type_0"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:15.374182" elapsed="0.000032"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:15.374498" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:15.374299" elapsed="0.000269"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:15.374276" elapsed="0.000321"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:31:15.374632" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:31:15.377778" elapsed="0.000228"/>
</kw>
<msg time="2026-04-17T03:31:15.378097" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:15.376489" 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-04-17T03:31:15.378533" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:15.378897" elapsed="0.000172"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:31:15.375780" elapsed="0.003410"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:31:15.375014" elapsed="0.004243"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:31:15.366007" elapsed="0.013341">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Play_To_Odl_rt_constrain_type_0"</status>
</kw>
<msg time="2026-04-17T03:31:15.379516" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:31:15.379570" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Play_To_Odl_rt_constrain_type_0"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:15.364763" elapsed="0.014833"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:31:15.379849" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:15.379698" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:15.379670" elapsed="0.000290"/>
</if>
<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-04-17T03:31:15.381219" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:15.381087" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:15.381062" elapsed="0.000245"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:15.381779" level="INFO">index=15
host=10.30.170.120
alias=None
port=22
timeout=6 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-04-17T03:31:15.381920" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
alias=None
port=22
timeout=6 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-04-17T03:31:15.381537" elapsed="0.000430"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:15.382431" level="INFO">{1: 18}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:15.382136" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:15.382990" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:15.382673" elapsed="0.000374"/>
</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-04-17T03:31:15.383824" elapsed="0.000359"/>
</kw>
<msg time="2026-04-17T03:31:15.384311" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:31:15.384366" level="INFO">${old_connection_index} = 18</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:15.383270" elapsed="0.001124"/>
</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-04-17T03:31:15.385344" elapsed="0.000205"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:31:15.386723" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:31:15.386270" elapsed="0.001556">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:15.385736" elapsed="0.002221"/>
</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-04-17T03:31:15.388646" elapsed="0.000319"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:15.388149" elapsed="0.000905"/>
</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-04-17T03:31:15.384726" elapsed="0.004376"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:15.384475" elapsed="0.004679"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:15.384456" elapsed="0.004728"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:15.390182" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:31:15.389821" elapsed="0.000388"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:31:15.390262" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:31:15.390428" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:31:15.389425" elapsed="0.001029"/>
</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-04-17T03:31:15.390652" elapsed="0.000520"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:15.391501" level="INFO">index=19
host=10.30.170.120
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-04-17T03:31:15.391605" level="INFO">${karaf_connection_object} = index=19
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:31:15.391375" elapsed="0.000256"/>
</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-04-17T03:31:15.391791" elapsed="0.002728"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:31:15.395047" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:31:15.396495" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:31:15.394720" elapsed="0.002571">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:31:15.414679" elapsed="0.000641"/>
</kw>
<msg time="2026-04-17T03:31:15.415657" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:15.412893" elapsed="0.002937"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:15.416027" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:15.416202" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:31:15.398745" elapsed="0.017636"/>
</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-04-17T03:31:15.397828" elapsed="0.018607"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:31:15.380643" elapsed="0.035892">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:15.416971" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:31:15.417052" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:31:15.363449" elapsed="0.053726">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:31:15.417295" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:31:15.417340" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:15.356570" elapsed="0.060794"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:15.417732" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:15.417452" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:15.417430" elapsed="0.000384"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:31:15.356355" elapsed="0.061484"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:31:15.356098" elapsed="0.061777"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:31:15.353220" elapsed="0.064732"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:31:15.347255" elapsed="0.070760"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:15.346440" elapsed="0.071624"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:31:15.340907" elapsed="0.077214"/>
</kw>
<kw name="Play_To_Odl_Non_Removal_BgpRpcClient3">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:31:15.430372" 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-04-17T03:31:15.430583" 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-04-17T03:31:15.430140" elapsed="0.000469"/>
</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-04-17T03:31:15.430774" elapsed="0.002993"/>
</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-04-17T03:31:15.429677" elapsed="0.004160"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:31:15.434541" 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-04-17T03:31:15.434074" elapsed="0.000496"/>
</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-04-17T03:31:15.496789" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:15.496348" elapsed="0.000478"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:15.497688" 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-04-17T03:31:15.497391" elapsed="0.000380">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-04-17T03:31:15.497871" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:15.497032" elapsed="0.000864"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:15.498600" 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-04-17T03:31:15.498182" elapsed="0.000447"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:31:15.499043" 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-04-17T03:31:15.499250" 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-04-17T03:31:15.498836" elapsed="0.000445"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:15.499806" 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-04-17T03:31:15.499508" elapsed="0.000350"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:15.501062" 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-04-17T03:31:15.500739" elapsed="0.000370"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:31:15.501574" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:31:15.501284" elapsed="0.000318"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:15.502373" 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-04-17T03:31:15.502006" elapsed="0.000395"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:15.503353" 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-04-17T03:31:15.502994" elapsed="0.000389"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:15.503487" elapsed="0.000055"/>
</return>
<msg time="2026-04-17T03:31:15.503693" 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-04-17T03:31:15.502601" elapsed="0.001117"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:31:15.503880" elapsed="0.000319"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-04-17T03:31:15.501841" elapsed="0.002401"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:15.504896" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:31:15.504556" elapsed="0.000367"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:15.505987" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:31:15.505540" elapsed="0.000476"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:15.506068" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:31:15.506228" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:31:15.505136" elapsed="0.001117"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:31:15.506434" elapsed="0.000290"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:31:15.504397" elapsed="0.002370"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:31:15.501657" elapsed="0.005147"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:31:15.506847" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:31:15.507030" 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-04-17T03:31:15.500369" elapsed="0.006686"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:15.499958" elapsed="0.007131"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:15.507274" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:15.507115" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:15.499917" elapsed="0.007435"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:31:15.508522" 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-04-17T03:31:15.507562" elapsed="0.000992"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:31:15.508604" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:31:15.495623" elapsed="0.013135"/>
</kw>
<msg time="2026-04-17T03:31:15.508900" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:15.479375" elapsed="0.029622"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:31:15.522703" elapsed="0.000056"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:31:15.537353" 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/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-04-17T03:31:15.552521" elapsed="0.000062"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:15.552838" 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-04-17T03:31:15.553048" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:15.553491" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:15.553326" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:15.553308" 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-04-17T03:31:15.553724" 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-04-17T03:31:15.553916" elapsed="0.000042"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:15.554153" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:31:15.553271" elapsed="0.000939"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:31:15.553133" elapsed="0.001105"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:15.554461" elapsed="0.000032"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:15.554558" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:31:15.554780" 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-04-17T03:31:15.474829" elapsed="0.079987"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:15.556403" 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-04-17T03:31:15.556054" elapsed="0.000491">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-04-17T03:31:15.556843" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:15.555619" elapsed="0.001274"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:15.557453" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:15.557029" elapsed="0.000547"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:31:15.558472" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:15.557996" elapsed="0.000517"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:15.557624" elapsed="0.000942"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:15.557001" elapsed="0.001596"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:15.561870" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:31:15.558851" elapsed="0.003048"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:31:15.561994" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:31:15.562180" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:31:15.555216" elapsed="0.006991"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:15.563728" 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-04-17T03:31:15.563393" elapsed="0.000428">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-04-17T03:31:15.563944" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:15.562987" elapsed="0.000985"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:31:15.564238" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-17T03:31:15.564051" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:15.564028" elapsed="0.000312"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:15.564502" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:15.564683" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:31:15.564751" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:31:15.567351" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:31:15.562565" elapsed="0.004816"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:15.569011" 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-04-17T03:31:15.568661" elapsed="0.000402"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:15.569523" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:15.569236" elapsed="0.000331"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:31:15.575113" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:15.776882" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:16.179538" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:16.182349" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:31:15.571965" elapsed="0.614532">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:31:15.569637" elapsed="0.617103">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:16.187200" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:16.186807" elapsed="0.000527"/>
</branch>
<status status="FAIL" start="2026-04-17T03:31:15.569618" elapsed="0.617754">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:16.188065" elapsed="0.000040"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:16.188270" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:16.188212" elapsed="0.000121"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:16.188186" elapsed="0.000177"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:16.188594" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:31:16.188699" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:31:15.567760" elapsed="0.621109">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:16.189005" 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-04-17T03:31:15.445735" elapsed="0.743420">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:16.189573" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:16.189297" elapsed="0.000383"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:16.189271" elapsed="0.000445"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:16.189764" elapsed="0.000021"/>
</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-04-17T03:31:15.439599" elapsed="0.750313">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:18.249998" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:18.249518" elapsed="0.000606"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:18.250957" 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-04-17T03:31:18.250682" elapsed="0.000354">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-04-17T03:31:18.251135" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:18.250318" elapsed="0.000842"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:18.251753" 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-04-17T03:31:18.251336" elapsed="0.000451"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:31:18.252170" 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-04-17T03:31:18.252422" 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-04-17T03:31:18.251982" elapsed="0.000470"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:18.253004" 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-04-17T03:31:18.252677" elapsed="0.000382"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:18.254208" 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-04-17T03:31:18.253916" elapsed="0.000339"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:31:18.254711" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:31:18.254425" elapsed="0.000312"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:18.255525" 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-04-17T03:31:18.255144" elapsed="0.000408"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:18.256576" 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-04-17T03:31:18.256207" elapsed="0.000396"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:18.256659" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:31:18.256832" 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-04-17T03:31:18.255749" elapsed="0.001108"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:31:18.257040" elapsed="0.000301"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-04-17T03:31:18.254995" elapsed="0.002389"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:18.258202" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:31:18.257642" elapsed="0.000588"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:18.259149" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:31:18.258784" elapsed="0.000394"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:18.259242" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:31:18.259405" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:31:18.258423" elapsed="0.001008"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:31:18.259592" elapsed="0.000285"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:31:18.257501" elapsed="0.002421"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:31:18.254795" elapsed="0.005192"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:31:18.260038" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:31:18.260242" 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-04-17T03:31:18.253561" elapsed="0.006713"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:18.253146" elapsed="0.007166"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:18.260531" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:18.260342" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:18.253120" elapsed="0.007543"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:31:18.261599" 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-04-17T03:31:18.260849" elapsed="0.000782"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:31:18.261682" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:31:18.248650" elapsed="0.013164"/>
</kw>
<msg time="2026-04-17T03:31:18.261871" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:18.235237" elapsed="0.026683"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:31:18.275158" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:18.288776" elapsed="0.000042"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:18.302232" elapsed="0.000038"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:18.302490" elapsed="0.000042"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:18.302773" 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-04-17T03:31:18.303225" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:18.303061" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:18.303043" 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-04-17T03:31:18.303464" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:18.303645" 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-04-17T03:31:18.303820" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:31:18.303006" elapsed="0.000891"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:31:18.302865" elapsed="0.001092"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:18.304174" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:18.304260" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:31:18.304454" 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-04-17T03:31:18.230601" elapsed="0.073972"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:18.306148" 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-04-17T03:31:18.305827" elapsed="0.000434">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-04-17T03:31:18.306381" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:18.305402" elapsed="0.001012"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:18.306797" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:18.306510" elapsed="0.000346"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:31:18.307411" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:18.307104" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:18.306881" elapsed="0.000593"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:18.306484" elapsed="0.001012"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:18.312106" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:31:18.307659" elapsed="0.004530"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:31:18.312252" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:31:18.312434" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:31:18.304975" elapsed="0.007485"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:18.313897" 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-04-17T03:31:18.313616" elapsed="0.000396">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-04-17T03:31:18.314134" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:18.313225" elapsed="0.000940"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:31:18.314407" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:31:18.314257" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:18.314233" elapsed="0.000261"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:18.314650" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:18.314829" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:31:18.314895" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:31:18.317239" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:31:18.312837" elapsed="0.004447"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:18.318887" 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-04-17T03:31:18.318610" elapsed="0.000342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:18.319432" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:18.319166" elapsed="0.000316"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:31:18.325026" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:18.526538" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:18.929456" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:18.931477" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:31:18.321956" elapsed="0.612960">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:31:18.319573" elapsed="0.615515">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:18.935470" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:18.935153" elapsed="0.000415"/>
</branch>
<status status="FAIL" start="2026-04-17T03:31:18.319547" elapsed="0.616056">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:18.936241" elapsed="0.000038"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:18.936507" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:18.936445" elapsed="0.000130"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:18.936410" elapsed="0.000197"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:18.936830" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:31:18.936955" elapsed="0.000025"/>
</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-04-17T03:31:18.317714" elapsed="0.619409">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:18.937231" 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-04-17T03:31:18.206478" elapsed="0.730898">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:18.937793" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:18.937523" elapsed="0.000374"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:18.937496" elapsed="0.000456"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:18.938001" elapsed="0.000021"/>
</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-04-17T03:31:18.200166" elapsed="0.738046">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:21.006009" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:21.005487" elapsed="0.000565"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:21.006958" 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-04-17T03:31:21.006651" elapsed="0.000391">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-17T03:31:21.007144" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:21.006263" elapsed="0.000908"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:21.007778" 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-04-17T03:31:21.007354" elapsed="0.000453"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:31:21.008154" 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-04-17T03:31:21.008327" 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-04-17T03:31:21.008000" elapsed="0.000356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:21.008804" 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-04-17T03:31:21.008537" elapsed="0.000376"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:21.010132" 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-04-17T03:31:21.009779" elapsed="0.000402"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:31:21.010649" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:31:21.010353" elapsed="0.000323"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:21.011488" 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-04-17T03:31:21.011093" elapsed="0.000427"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:21.012579" 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-04-17T03:31:21.012179" elapsed="0.000428"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:21.012663" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:31:21.012866" 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-04-17T03:31:21.011762" elapsed="0.001134"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:31:21.013085" elapsed="0.000310"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-04-17T03:31:21.010915" elapsed="0.002534"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:21.014124" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:31:21.013735" elapsed="0.000416"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:21.015335" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:31:21.014983" elapsed="0.000381"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:21.015417" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:31:21.015588" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:31:21.014598" elapsed="0.001100"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:31:21.015870" elapsed="0.000350"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:31:21.013587" elapsed="0.002678"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:31:21.010733" elapsed="0.005569"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:31:21.016348" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:31:21.016523" 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-04-17T03:31:21.009405" elapsed="0.007149"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:21.009027" elapsed="0.007565"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:21.016787" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:21.016622" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:21.009000" elapsed="0.007969"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:31:21.017857" 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-04-17T03:31:21.017140" elapsed="0.000749"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:31:21.017960" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_0/rib/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:31:21.004488" elapsed="0.013634"/>
</kw>
<msg time="2026-04-17T03:31:21.018194" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:20.987547" elapsed="0.030718"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:31:21.031960" elapsed="0.000047"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_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-04-17T03:31:21.045845" elapsed="0.000048"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:31:21.059141" elapsed="0.000057"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:21.059460" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:21.059663" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:21.060130" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:21.059964" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:21.059943" elapsed="0.000273"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:21.060371" 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-04-17T03:31:21.060670" 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-04-17T03:31:21.060892" elapsed="0.000024"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:31:21.059885" elapsed="0.001083"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:31:21.059749" elapsed="0.001250"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:21.061161" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:21.061245" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:31:21.061418" 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-04-17T03:31:20.981812" elapsed="0.079637"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:21.063011" 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-04-17T03:31:21.062699" elapsed="0.000390">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-04-17T03:31:21.063190" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:21.062281" elapsed="0.000934"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:21.063567" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:21.063289" elapsed="0.000342"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:31:21.064186" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:21.063862" elapsed="0.000352"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:21.063656" elapsed="0.000595"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:21.063269" elapsed="0.001004"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:21.067091" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:31:21.064436" elapsed="0.002694"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:31:21.067194" elapsed="0.000045"/>
</return>
<msg time="2026-04-17T03:31:21.067383" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:31:21.061860" elapsed="0.005548"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:21.068748" 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-04-17T03:31:21.068501" elapsed="0.000314">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-04-17T03:31:21.068990" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:21.068142" elapsed="0.000881"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:31:21.069277" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-17T03:31:21.069103" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:21.069083" 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-04-17T03:31:21.069524" 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-04-17T03:31:21.069706" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:31:21.069773" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:31:21.071769" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:31:21.067736" elapsed="0.004060"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:21.073440" 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-04-17T03:31:21.073161" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:21.073907" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:21.073659" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:31:21.079474" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:21.281275" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:21.684314" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:21.687815" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:31:21.076255" elapsed="0.616382">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:31:21.074041" elapsed="0.618792">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:21.693426" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:21.692915" elapsed="0.000631"/>
</branch>
<status status="FAIL" start="2026-04-17T03:31:21.074021" elapsed="0.619568">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:21.694435" elapsed="0.000043"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:21.694705" elapsed="0.000043"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:21.694614" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:21.694575" elapsed="0.000261"/>
</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-04-17T03:31:21.695103" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:31:21.695211" elapsed="0.000024"/>
</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-04-17T03:31:21.072207" elapsed="0.623225">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:21.695604" elapsed="0.000039"/>
</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-04-17T03:31:20.954260" elapsed="0.741554">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:21.696550" elapsed="0.000776"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:21.696172" elapsed="0.001267"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:21.696136" elapsed="0.001353"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:21.697557" elapsed="0.000030"/>
</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-04-17T03:31:20.948715" elapsed="0.749044">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:31:21.698030" level="FAIL">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-17T03:31:15.434751" elapsed="6.263484">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Sends RT route from node 2 to odl and then checks that odl advertizes l3vpn route from previous TC.</doc>
<status status="FAIL" start="2026-04-17T03:31:15.339612" elapsed="6.359033">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:31:21.704525" elapsed="0.000353"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:31:21.704193" 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-04-17T03:31:21.707505" elapsed="0.000051"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:21.707114" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:21.707001" elapsed="0.000725"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:21.716886" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:21.716760" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:21.716738" elapsed="0.000242"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:21.718480" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:31:21.717790" elapsed="0.000724"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:31:21.719071" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:31:21.718704" elapsed="0.000395"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:31:21.719147" elapsed="0.000048"/>
</return>
<msg time="2026-04-17T03:31:21.719337" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:31:21.717314" elapsed="0.002049"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:21.726240" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:21.726112" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:21.726087" 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-04-17T03:31:21.727720" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:21.727595" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:21.727576" elapsed="0.000216"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:21.728333" level="INFO">${karaf_connection_index} = 19</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:31:21.727989" elapsed="0.000374"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:21.728811" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:31:21.728542" elapsed="0.000296"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:31:21.729727" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:31:21.729418" elapsed="0.001109">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:31:21.730730" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:31:21.730779" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:21.729047" elapsed="0.001757"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:31:21.731625" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:31:21.731364" elapsed="0.000951">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:31:21.732507" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:31:21.732554" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:21.731001" elapsed="0.001578"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:31:21.733606" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Check_Presence_Of_l3vpn_Route_In_Node_2_Effective_Rib_In_Table"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:31:21.732903" elapsed="0.000768">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Check_Presence_Of_l3vpn_Route_In_Node_2_Effective_Rib_In_Table"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:31:21.732661" elapsed="0.001091">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Check_Presence_Of_l3vpn_Route_In_Node_2_Effective_Rib_In_Table"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:31:21.732639" elapsed="0.001150">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Check_Presence_Of_l3vpn_Route_In_Node_2_Effective_Rib_In_Table"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:21.733983" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:21.734225" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:21.734075" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:21.734056" elapsed="0.000248"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:31:21.734338" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:31:21.737068" elapsed="0.000157"/>
</kw>
<msg time="2026-04-17T03:31:21.737298" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:21.735952" elapsed="0.001503"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:21.737829" elapsed="0.000080"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:21.738231" 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-04-17T03:31:21.735273" elapsed="0.003159"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:31:21.734672" elapsed="0.003830"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:31:21.727251" elapsed="0.011348">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Check_Presence_Of_l3vpn_Route_In_Node_2_Effective_Rib_In_Table"</status>
</kw>
<msg time="2026-04-17T03:31:21.738718" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:31:21.738765" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Check_Presence_Of_l3vpn_Route_In_Node_2_Effective_Rib_In_Table"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:21.726520" elapsed="0.012334"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:31:21.739167" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:21.739037" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:21.739011" elapsed="0.000230"/>
</if>
<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-04-17T03:31:21.740412" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:21.740286" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:21.740267" elapsed="0.000222"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:21.740815" level="INFO">index=15
host=10.30.170.120
alias=None
port=22
timeout=6 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-04-17T03:31:21.740967" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
alias=None
port=22
timeout=6 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-04-17T03:31:21.740656" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:21.741547" level="INFO">{1: 19}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:21.741209" elapsed="0.000389"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:21.742073" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:21.741785" elapsed="0.000334"/>
</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-04-17T03:31:21.742721" elapsed="0.000385"/>
</kw>
<msg time="2026-04-17T03:31:21.743213" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:31:21.743261" level="INFO">${old_connection_index} = 19</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:21.742302" elapsed="0.000983"/>
</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-04-17T03:31:21.744156" elapsed="0.000215"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:31:21.745627" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:31:21.745165" elapsed="0.001461">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:21.744578" elapsed="0.002156"/>
</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-04-17T03:31:21.747519" elapsed="0.000330"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:21.746921" elapsed="0.001051"/>
</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-04-17T03:31:21.743600" elapsed="0.004424"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:21.743363" elapsed="0.004710"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:21.743343" elapsed="0.004758"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:21.749261" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:31:21.748836" elapsed="0.000453"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:31:21.749342" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:31:21.749511" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:31:21.748359" elapsed="0.001177"/>
</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-04-17T03:31:21.749704" elapsed="0.000491"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:21.750549" level="INFO">index=20
host=10.30.170.120
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-04-17T03:31:21.750654" level="INFO">${karaf_connection_object} = index=20
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:31:21.750422" elapsed="0.000258"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:31:21.750845" elapsed="0.002680"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:31:21.754087" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:31:21.755471" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:31:21.753742" elapsed="0.002156">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:31:21.772672" elapsed="0.000545"/>
</kw>
<msg time="2026-04-17T03:31:21.773346" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:21.770552" elapsed="0.002976"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:21.773711" elapsed="0.000025"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:21.773890" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:31:21.757243" elapsed="0.016761"/>
</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-04-17T03:31:21.756395" elapsed="0.017679"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:31:21.739955" elapsed="0.034243">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:21.774669" elapsed="0.000039"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:31:21.774780" 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="FAIL" start="2026-04-17T03:31:21.725582" elapsed="0.049677">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:31:21.775431" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:31:21.775496" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:21.719814" elapsed="0.055717"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:21.776056" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:21.775658" elapsed="0.000470"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:21.775626" elapsed="0.000541"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:31:21.719647" elapsed="0.056557"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:31:21.719438" elapsed="0.056818"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:31:21.716216" elapsed="0.060132"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:31:21.705752" elapsed="0.070685"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:21.705184" elapsed="0.071327"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:31:21.700410" elapsed="0.076187"/>
</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-04-17T03:31:21.833844" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:21.833392" elapsed="0.000490"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:21.834849" 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-04-17T03:31:21.834508" elapsed="0.000450">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-04-17T03:31:21.835062" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:21.834101" elapsed="0.000988"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:21.835721" 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-04-17T03:31:21.835271" elapsed="0.000480"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:31:21.836098" 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-04-17T03:31:21.836370" 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-04-17T03:31:21.835942" elapsed="0.000456"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:21.836828" 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-04-17T03:31:21.836568" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:21.838034" 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-04-17T03:31:21.837744" elapsed="0.000337"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:31:21.838538" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:31:21.838253" elapsed="0.000312"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:21.839347" 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-04-17T03:31:21.838978" elapsed="0.000396"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:21.840328" 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-04-17T03:31:21.839962" elapsed="0.000393"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:21.840411" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:31:21.840589" 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-04-17T03:31:21.839572" elapsed="0.001043"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:31:21.840779" elapsed="0.000343"/>
</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-04-17T03:31:21.838814" elapsed="0.002351"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:21.841766" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:31:21.841433" elapsed="0.000359"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:21.842709" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:31:21.842364" elapsed="0.000372"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:21.842786" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:31:21.842968" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:31:21.842004" 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-04-17T03:31:21.843177" elapsed="0.000284"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:31:21.841287" elapsed="0.002216"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:31:21.838625" elapsed="0.004913"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:31:21.843582" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:31:21.843748" 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-04-17T03:31:21.837398" elapsed="0.006377"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:21.836997" elapsed="0.006811"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:21.844012" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:21.843835" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:21.836965" elapsed="0.007128"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:31:21.845108" 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-04-17T03:31:21.844249" elapsed="0.000890"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:31:21.845189" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:31:21.832561" elapsed="0.012754"/>
</kw>
<msg time="2026-04-17T03:31:21.845371" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:21.818393" elapsed="0.027063"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:31:21.858289" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/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-04-17T03:31:21.871076" elapsed="0.000037"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/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-04-17T03:31:21.884740" elapsed="0.000047"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:21.885152" elapsed="0.000040"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:21.885430" 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-04-17T03:31:21.885972" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:21.885785" elapsed="0.000247"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:21.885765" elapsed="0.000296"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:21.886214" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:21.886419" 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-04-17T03:31:21.886673" elapsed="0.000025"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:31:21.885707" elapsed="0.001045"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:31:21.885543" elapsed="0.001246"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:21.886972" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:21.887058" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:31:21.887232" 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-04-17T03:31:21.813137" elapsed="0.074126"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:21.889160" 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-04-17T03:31:21.888730" elapsed="0.000539">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-04-17T03:31:21.889395" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:21.888223" elapsed="0.001204"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:21.890062" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:21.889743" elapsed="0.000379"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:31:21.890741" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:21.890363" elapsed="0.000409"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:21.890148" elapsed="0.000665"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:21.889719" elapsed="0.001124"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:21.893624" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:31:21.891073" elapsed="0.002579"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:31:21.893708" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:31:21.893879" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:31:21.887702" elapsed="0.006201"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:21.895213" 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-04-17T03:31:21.894960" elapsed="0.000320">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-04-17T03:31:21.895374" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:21.894600" elapsed="0.000798"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:31:21.895602" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-17T03:31:21.895467" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:21.895449" elapsed="0.000234"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:21.895833" 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-04-17T03:31:21.896026" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:31:21.896092" elapsed="0.000014"/>
</return>
<msg time="2026-04-17T03:31:21.898380" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:31:21.894252" elapsed="0.004157"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:21.900041" 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-04-17T03:31:21.899760" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:21.900508" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:21.900248" elapsed="0.000324"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:31:21.906583" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-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>
<msg time="2026-04-17T03:31:22.108267" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-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>
<msg time="2026-04-17T03:31:22.510859" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-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>
<msg time="2026-04-17T03:31:22.513317" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:31:21.903248" elapsed="0.616232">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:31:21.900662" elapsed="0.619163">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:22.520423" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:22.519924" elapsed="0.000663"/>
</branch>
<status status="FAIL" start="2026-04-17T03:31:21.900637" elapsed="0.620009">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:22.521735" elapsed="0.000035"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:22.521892" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:22.521849" elapsed="0.000110"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:22.521829" 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-04-17T03:31:22.522144" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:31:22.522223" elapsed="0.000017"/>
</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-04-17T03:31:21.898741" elapsed="0.623613">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:22.522474" 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-04-17T03:31:21.788708" elapsed="0.733892">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:22.522959" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:22.522709" elapsed="0.000340"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:22.522689" elapsed="0.000389"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:22.523125" elapsed="0.000017"/>
</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-04-17T03:31:21.782893" elapsed="0.740356">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:24.584917" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:24.584413" elapsed="0.000558"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:24.585947" 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-04-17T03:31:24.585574" elapsed="0.000484">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-17T03:31:24.586321" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:24.585161" elapsed="0.001197"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:24.587079" 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-04-17T03:31:24.586559" elapsed="0.000560"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:31:24.587522" 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-04-17T03:31:24.587733" 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-04-17T03:31:24.587353" elapsed="0.000417"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:24.588358" 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-04-17T03:31:24.588019" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:24.589865" 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-04-17T03:31:24.589472" elapsed="0.000442"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:31:24.590385" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:31:24.590106" elapsed="0.000306"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:24.591168" 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-04-17T03:31:24.590791" elapsed="0.000404"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:24.592150" 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-04-17T03:31:24.591768" elapsed="0.000410"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:24.592232" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:31:24.592433" 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-04-17T03:31:24.591400" elapsed="0.001064"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:31:24.592632" elapsed="0.002175"/>
</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-04-17T03:31:24.590641" elapsed="0.004211"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:24.595489" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:31:24.595136" elapsed="0.000381"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:24.596474" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:31:24.596092" elapsed="0.000410"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:24.596554" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:31:24.596713" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:31:24.595715" elapsed="0.001023"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:31:24.596899" elapsed="0.000306"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:31:24.594988" elapsed="0.002259"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:31:24.590465" elapsed="0.006818"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:31:24.597327" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:31:24.597490" 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-04-17T03:31:24.589007" elapsed="0.008509"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:24.588537" elapsed="0.009011"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:24.597746" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:24.597575" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:24.588503" elapsed="0.009368"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:31:24.598690" 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-04-17T03:31:24.598060" elapsed="0.000661"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:31:24.598837" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:31:24.583627" elapsed="0.015361"/>
</kw>
<msg time="2026-04-17T03:31:24.599046" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:24.570122" elapsed="0.028979"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:31:24.612205" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:24.631568" elapsed="0.000115"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:31:24.648699" elapsed="0.000051"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:24.649015" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:24.649276" 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-04-17T03:31:24.649977" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:24.649680" elapsed="0.000381"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:24.649653" elapsed="0.000448"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:24.650288" 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-04-17T03:31:24.650469" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:24.650642" elapsed="0.000025"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:31:24.649596" elapsed="0.001111"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:31:24.649399" elapsed="0.001344"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:24.650917" elapsed="0.000056"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:24.651037" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:31:24.651211" 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-04-17T03:31:24.564885" elapsed="0.086356"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:24.652879" 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-04-17T03:31:24.652525" elapsed="0.000485">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-04-17T03:31:24.653117" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:24.652089" elapsed="0.001054"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:24.653526" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:24.653218" elapsed="0.000369"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:31:24.654221" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:24.653863" elapsed="0.000388"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:24.653613" elapsed="0.000680"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:24.653198" elapsed="0.001120"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:24.657367" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:31:24.654496" elapsed="0.002908"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:31:24.657473" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:31:24.657679" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:31:24.651690" elapsed="0.006021"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:24.659395" 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-04-17T03:31:24.659072" elapsed="0.000410">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-04-17T03:31:24.659583" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:24.658604" elapsed="0.001004"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:31:24.659831" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-17T03:31:24.659683" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:24.659663" elapsed="0.000310"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:24.660190" 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-04-17T03:31:24.660438" elapsed="0.000029"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:31:24.660529" elapsed="0.000022"/>
</return>
<msg time="2026-04-17T03:31:24.662805" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:31:24.658160" elapsed="0.004673"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:24.664372" 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-04-17T03:31:24.664090" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:24.664843" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:24.664586" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:31:24.670375" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-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>
<msg time="2026-04-17T03:31:24.872106" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-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>
<msg time="2026-04-17T03:31:25.275376" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-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>
<msg time="2026-04-17T03:31:25.279055" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:31:24.667234" elapsed="0.618467">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:31:24.664972" elapsed="0.621173">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:25.286793" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:25.286262" elapsed="0.000638"/>
</branch>
<status status="FAIL" start="2026-04-17T03:31:24.664952" elapsed="0.622005">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:25.287666" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:25.287885" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:25.287826" elapsed="0.000152"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:25.287794" elapsed="0.000216"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:25.288244" elapsed="0.000035"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:31:25.288366" elapsed="0.000036"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:31:24.663194" elapsed="0.625375">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:25.288706" elapsed="0.000029"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:31:24.539445" elapsed="0.749421">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:25.289376" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:25.289029" elapsed="0.000481"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:25.289003" elapsed="0.000564"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:25.289631" elapsed="0.000022"/>
</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-04-17T03:31:24.532235" elapsed="0.757577">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:27.381066" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:27.380626" elapsed="0.000476"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:27.382000" 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-04-17T03:31:27.381648" elapsed="0.000446">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-04-17T03:31:27.382198" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:27.381288" elapsed="0.000935"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:27.382893" 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-04-17T03:31:27.382409" elapsed="0.000546"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:31:27.383357" 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-04-17T03:31:27.383543" 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-04-17T03:31:27.383198" elapsed="0.000373"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:27.384023" 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-04-17T03:31:27.383741" 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-04-17T03:31:27.385136" 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-04-17T03:31:27.384847" elapsed="0.000337"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:31:27.385632" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:31:27.385353" elapsed="0.000307"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:27.386439" 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-04-17T03:31:27.386065" elapsed="0.000402"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:27.387599" 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-04-17T03:31:27.387160" elapsed="0.000467"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:27.387684" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:31:27.387854" 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-04-17T03:31:27.386701" elapsed="0.001179"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:31:27.388071" elapsed="0.000308"/>
</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-04-17T03:31:27.385904" elapsed="0.002517"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:27.389360" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:31:27.388693" elapsed="0.000695"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:27.390298" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:31:27.389958" elapsed="0.000367"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:27.390377" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:31:27.390553" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:31:27.389583" elapsed="0.000996"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:31:27.390742" elapsed="0.000341"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:31:27.388536" elapsed="0.002594"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:31:27.385715" elapsed="0.005452"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:31:27.391210" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:31:27.391375" 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-04-17T03:31:27.384503" elapsed="0.006955"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:27.384153" 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 variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:27.391765" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:27.391544" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:27.384128" elapsed="0.007745"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:31:27.392779" 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-04-17T03:31:27.392107" elapsed="0.000703"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:31:27.392860" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/ext_l3vpn_rt_arg/rib/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:31:27.379919" elapsed="0.013119"/>
</kw>
<msg time="2026-04-17T03:31:27.393116" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:27.365753" elapsed="0.027435"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-04-17T03:31:27.407515" elapsed="0.000066"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/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-04-17T03:31:27.422091" 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-04-17T03:31:27.434903" elapsed="0.000047"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:27.435168" 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-04-17T03:31:27.435363" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:27.435796" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:27.435634" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:27.435616" 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-04-17T03:31:27.436047" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:27.436220" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:27.436388" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:31:27.435575" elapsed="0.000866"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:31:27.435448" elapsed="0.001020"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:27.436620" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:27.436777" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:31:27.436963" 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-04-17T03:31:27.361027" elapsed="0.075967"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:27.438509" 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-04-17T03:31:27.438201" elapsed="0.000438">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-04-17T03:31:27.438762" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:27.437728" elapsed="0.001062"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:27.439156" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:27.438864" elapsed="0.000350"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:31:27.439755" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:27.439455" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:27.439238" elapsed="0.000579"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:27.438846" elapsed="0.000992"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:27.442648" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:31:27.440009" elapsed="0.002669"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:31:27.442741" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:31:27.442940" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:31:27.437355" elapsed="0.005617"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:27.444321" 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-04-17T03:31:27.444065" elapsed="0.000326">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-04-17T03:31:27.444486" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:27.443672" elapsed="0.000838"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:31:27.444722" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-17T03:31:27.444581" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:27.444563" elapsed="0.000241"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:27.444973" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:27.445150" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:31:27.445214" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:31:27.447291" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:31:27.443314" elapsed="0.004011"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:27.448758" 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-04-17T03:31:27.448498" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:27.449268" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:27.448979" elapsed="0.000335"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:31:27.454504" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-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>
<msg time="2026-04-17T03:31:27.656432" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-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>
<msg time="2026-04-17T03:31:28.058994" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-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>
<msg time="2026-04-17T03:31:28.062535" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:31:27.451574" elapsed="0.615202">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:31:27.449381" elapsed="0.617669">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:28.067507" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:28.067127" elapsed="0.000484"/>
</branch>
<status status="FAIL" start="2026-04-17T03:31:27.449363" elapsed="0.618283">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:28.068362" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:28.068581" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:28.068521" elapsed="0.000130"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:28.068492" elapsed="0.000189"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:28.068956" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:31:28.069057" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:31:27.447648" elapsed="0.621583">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:28.069342" 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-04-17T03:31:27.336888" elapsed="0.732594">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:28.070381" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:28.069616" elapsed="0.000947"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:28.069590" elapsed="0.001009"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:28.070648" elapsed="0.000021"/>
</return>
<arg>${RT_CONSTRAIN_DIR}/ext_l3vpn_rt_arg/rib</arg>
<arg>mapping=${ADJ_RIB_OUT}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<arg>verify=True</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="FAIL" start="2026-04-17T03:31:27.330093" elapsed="0.740726">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:31:28.071022" level="FAIL">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:21.776863" elapsed="6.294315">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Checks l3vpn route is present in node 2 effective-rib-in table.</doc>
<status status="FAIL" start="2026-04-17T03:31:21.699205" elapsed="6.372259">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:28.076649" elapsed="0.000318"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:31:28.076367" 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-04-17T03:31:28.078188" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:28.078058" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:28.078039" elapsed="0.000219"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:28.083473" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:28.083365" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:28.083346" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:28.084595" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:31:28.084192" elapsed="0.000431"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:31:28.085107" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:31:28.084792" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:31:28.085178" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:31:28.085389" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:31:28.083777" elapsed="0.001648"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:28.091257" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:28.091148" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:28.091129" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:28.092533" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:28.092427" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:28.092410" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:28.093094" level="INFO">${karaf_connection_index} = 20</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:31:28.092755" elapsed="0.000366"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:28.093513" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:31:28.093290" elapsed="0.000291"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:31:28.094410" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:31:28.094125" elapsed="0.001003">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:31:28.095323" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:31:28.095370" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:28.093752" elapsed="0.001641"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:31:28.096237" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:31:28.095982" elapsed="0.000909">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:31:28.097092" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:31:28.097138" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:28.095567" elapsed="0.001594"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:31:28.098132" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Check_l3vpn_Route_Advertisement_On_Each_Node"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:31:28.097462" elapsed="0.000733">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Check_l3vpn_Route_Advertisement_On_Each_Node"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:31:28.097235" elapsed="0.001029">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Check_l3vpn_Route_Advertisement_On_Each_Node"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:31:28.097217" elapsed="0.001079">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Check_l3vpn_Route_Advertisement_On_Each_Node"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:28.098465" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:28.098715" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:28.098550" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:28.098534" elapsed="0.000259"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:31:28.098825" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:31:28.101681" elapsed="0.000201"/>
</kw>
<msg time="2026-04-17T03:31:28.102015" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:28.100399" elapsed="0.001757"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:28.102441" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:28.102819" 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-04-17T03:31:28.099696" elapsed="0.003386"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:31:28.099144" elapsed="0.004004"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:31:28.092122" elapsed="0.011111">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Check_l3vpn_Route_Advertisement_On_Each_Node"</status>
</kw>
<msg time="2026-04-17T03:31:28.103339" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:31:28.103383" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Check_l3vpn_Route_Advertisement_On_Each_Node"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:28.091484" elapsed="0.011922"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:31:28.103592" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:28.103482" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:28.103464" elapsed="0.000194"/>
</if>
<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-04-17T03:31:28.104724" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:28.104615" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:28.104597" elapsed="0.000194"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:28.105128" level="INFO">index=15
host=10.30.170.120
alias=None
port=22
timeout=6 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-04-17T03:31:28.105278" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
alias=None
port=22
timeout=6 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-04-17T03:31:28.104994" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:28.105736" level="INFO">{1: 20}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:28.105469" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:28.106219" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:28.105969" elapsed="0.000295"/>
</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-04-17T03:31:28.106842" elapsed="0.000316"/>
</kw>
<msg time="2026-04-17T03:31:28.107260" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:31:28.107306" level="INFO">${old_connection_index} = 20</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:28.106429" elapsed="0.000900"/>
</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-04-17T03:31:28.108343" elapsed="0.000200"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:31:28.109639" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:31:28.109223" elapsed="0.001301">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:28.108718" elapsed="0.001906"/>
</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-04-17T03:31:28.111401" elapsed="0.000282"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:28.110878" elapsed="0.000889"/>
</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-04-17T03:31:28.107636" elapsed="0.004176"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:28.107404" elapsed="0.004456"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:28.107386" elapsed="0.004499"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:28.112864" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:31:28.112461" elapsed="0.000440"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:31:28.112984" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:31:28.113146" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:31:28.112126" elapsed="0.001044"/>
</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-04-17T03:31:28.113334" elapsed="0.000497"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:28.114141" level="INFO">index=21
host=10.30.170.120
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-04-17T03:31:28.114243" level="INFO">${karaf_connection_object} = index=21
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:31:28.114030" elapsed="0.000239"/>
</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-04-17T03:31:28.114428" elapsed="0.002538"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:31:28.117409" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:31:28.118915" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:31:28.117142" elapsed="0.002197">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:31:28.134423" elapsed="0.000418"/>
</kw>
<msg time="2026-04-17T03:31:28.134949" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:28.132804" elapsed="0.002300"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:28.135274" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:28.135444" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:31:28.120329" elapsed="0.015198"/>
</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-04-17T03:31:28.119651" elapsed="0.015993"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:31:28.104317" elapsed="0.031418">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:28.136163" elapsed="0.000033"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:31:28.136251" 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="FAIL" start="2026-04-17T03:31:28.090787" elapsed="0.045581">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:31:28.136485" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:31:28.136529" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:28.085902" elapsed="0.050651"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:28.136908" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:28.136638" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:28.136617" elapsed="0.000389"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:31:28.085744" elapsed="0.051288"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:31:28.085496" elapsed="0.051572"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:31:28.082994" elapsed="0.054138"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:31:28.077719" elapsed="0.059474"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:28.077194" elapsed="0.060050"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:31:28.073004" elapsed="0.064297"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:31:28.137654" 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-04-17T03:31:28.137827" 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-04-17T03:31:28.137485" elapsed="0.000369"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-04-17T03:31:28.138436" 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-04-17T03:31:28.138212" elapsed="0.000250"/>
</kw>
<kw name="Check_For_L3VPN_Odl_Avertisement">
<for flavor="IN ZIP">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:31:28.139580" level="INFO">${keyword_name} = Get_Update_Message_And_Compare_With_Hex_BgpRpcClient2</msg>
<var>${keyword_name}</var>
<arg>Get_Update_Message_And_Compare_With_Hex_BgpRpcClient${i}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:28.139274" elapsed="0.000335"/>
</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-04-17T03:31:28.146924" level="INFO">${update} = </msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-04-17T03:31:28.140660" elapsed="0.006316"/>
</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-04-17T03:31:28.147304" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:28.147068" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:28.147029" elapsed="0.000356"/>
</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-04-17T03:31:28.147656" elapsed="0.000358"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:28.147438" elapsed="0.000615"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:28.147423" elapsed="0.000654"/>
</if>
<arg>${announce_hex}</arg>
<arg>${option}</arg>
<doc>Returns hex update message and compares it to hex.</doc>
<status status="PASS" start="2026-04-17T03:31:28.140242" elapsed="0.007880"/>
</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-04-17T03:31:28.139774" elapsed="0.008395"/>
</kw>
<var name="${i}">2</var>
<var name="${option}">false</var>
<status status="PASS" start="2026-04-17T03:31:28.139125" elapsed="0.009077"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:31:28.148966" level="INFO">${keyword_name} = Get_Update_Message_And_Compare_With_Hex_BgpRpcClient3</msg>
<var>${keyword_name}</var>
<arg>Get_Update_Message_And_Compare_With_Hex_BgpRpcClient${i}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:28.148540" elapsed="0.000513"/>
</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-04-17T03:31:28.164507" level="INFO">${update} = </msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-04-17T03:31:28.150392" elapsed="0.014185"/>
</kw>
<if>
<branch type="IF" condition="&quot;${option}&quot; == &quot;true&quot;">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-17T03:31:28.166228" level="FAIL"> != 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-04-17T03:31:28.165204" elapsed="0.001221"> != ffffffffffffffffffffffffffffffff0052020000003b4001010040020602010000fbf0800e200001800c00000000000000000a00fffe007005dc510001010203040001010101c010080002fbf000000065</status>
</kw>
<status status="FAIL" start="2026-04-17T03:31:28.164684" elapsed="0.001902"> != ffffffffffffffffffffffffffffffff0052020000003b4001010040020602010000fbf0800e200001800c00000000000000000a00fffe007005dc510001010203040001010101c010080002fbf000000065</status>
</branch>
<status status="FAIL" start="2026-04-17T03:31:28.164657" elapsed="0.002004"> != 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-04-17T03:31:28.167264" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:28.166887" elapsed="0.000504"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:28.166848" elapsed="0.000594"/>
</if>
<arg>${announce_hex}</arg>
<arg>${option}</arg>
<doc>Returns hex update message and compares it to hex.</doc>
<status status="FAIL" start="2026-04-17T03:31:28.149889" elapsed="0.017738"> != 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-04-17T03:31:28.149288" elapsed="0.018451"> != ffffffffffffffffffffffffffffffff0052020000003b4001010040020602010000fbf0800e200001800c00000000000000000a00fffe007005dc510001010203040001010101c010080002fbf000000065</status>
</kw>
<var name="${i}">3</var>
<var name="${option}">true</var>
<status status="FAIL" start="2026-04-17T03:31:28.148335" elapsed="0.019533"> != 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-04-17T03:31:28.138897" elapsed="0.029137"> != 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-04-17T03:31:28.138641" elapsed="0.029603"> != 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-04-17T03:31:28.072055" elapsed="0.096497"> != 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-04-17T03:31:28.175275" elapsed="0.000294"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:31:28.174859" elapsed="0.000786"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:28.177097" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:28.176916" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:28.176891" elapsed="0.000307"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:28.184286" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:28.184130" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:28.184104" elapsed="0.000276"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:28.185818" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:31:28.185264" elapsed="0.000593"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:31:28.186528" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:31:28.186113" elapsed="0.000451"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:31:28.186626" elapsed="0.000046"/>
</return>
<msg time="2026-04-17T03:31:28.186894" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:31:28.184704" elapsed="0.002245"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:28.193041" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:28.192910" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:28.192887" elapsed="0.000222"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:28.194423" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:28.194315" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:28.194297" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:28.195037" level="INFO">${karaf_connection_index} = 21</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:31:28.194644" elapsed="0.000421"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:28.195454" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:31:28.195233" elapsed="0.000246"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:31:28.196275" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:31:28.196002" elapsed="0.000996">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:31:28.197189" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:31:28.197235" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:28.195645" elapsed="0.001613"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:31:28.198046" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:31:28.197778" elapsed="0.001022">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:31:28.199012" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:31:28.199058" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:28.197432" elapsed="0.001648"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:31:28.200012" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Play_To_Odl_rt_constrain_type_1"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:31:28.199385" elapsed="0.000691">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Play_To_Odl_rt_constrain_type_1"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:31:28.199156" elapsed="0.000989">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Play_To_Odl_rt_constrain_type_1"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:31:28.199137" elapsed="0.001041">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Play_To_Odl_rt_constrain_type_1"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:28.200346" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:28.200577" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:28.200432" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:28.200415" elapsed="0.000235"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:31:28.200682" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:31:28.203350" elapsed="0.000145"/>
</kw>
<msg time="2026-04-17T03:31:28.203561" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:28.202182" 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-04-17T03:31:28.203991" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:28.204335" 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-04-17T03:31:28.201539" 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-04-17T03:31:28.200998" elapsed="0.003585"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:31:28.193991" elapsed="0.010678">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Play_To_Odl_rt_constrain_type_1"</status>
</kw>
<msg time="2026-04-17T03:31:28.204772" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:31:28.204815" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Play_To_Odl_rt_constrain_type_1"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:28.193269" elapsed="0.011570"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:31:28.205040" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:28.204915" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:28.204897" elapsed="0.000247"/>
</if>
<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-04-17T03:31:28.206247" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:28.206118" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:28.206088" elapsed="0.000227"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:28.206651" level="INFO">index=15
host=10.30.170.120
alias=None
port=22
timeout=6 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-04-17T03:31:28.206801" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
alias=None
port=22
timeout=6 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-04-17T03:31:28.206483" elapsed="0.000346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:28.207424" level="INFO">{1: 21}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:28.207087" elapsed="0.000387"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:28.207884" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:28.207637" elapsed="0.000355"/>
</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-04-17T03:31:28.208565" elapsed="0.000264"/>
</kw>
<msg time="2026-04-17T03:31:28.208953" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:31:28.209002" level="INFO">${old_connection_index} = 21</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:28.208180" elapsed="0.000845"/>
</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-04-17T03:31:28.209895" elapsed="0.000243"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:31:28.211375" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:31:28.210908" elapsed="0.001475">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:28.210358" elapsed="0.002149"/>
</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-04-17T03:31:28.213381" elapsed="0.000348"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:28.212745" elapsed="0.001072"/>
</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-04-17T03:31:28.209375" elapsed="0.004488"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:28.209109" elapsed="0.004802"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:28.209086" elapsed="0.004875"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:28.215164" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:31:28.214680" elapsed="0.000517"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:31:28.215252" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:31:28.215413" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:31:28.214238" elapsed="0.001200"/>
</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-04-17T03:31:28.215608" elapsed="0.000506"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:28.216448" level="INFO">index=22
host=10.30.170.120
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-04-17T03:31:28.216563" level="INFO">${karaf_connection_object} = index=22
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:31:28.216322" elapsed="0.000272"/>
</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-04-17T03:31:28.216777" elapsed="0.004636"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:31:28.221861" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:31:28.224339" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:31:28.221592" elapsed="0.003227">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:31:28.239544" elapsed="0.000433"/>
</kw>
<msg time="2026-04-17T03:31:28.240075" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:28.237964" elapsed="0.002339"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:28.240494" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:28.240682" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:31:28.225842" elapsed="0.014928"/>
</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-04-17T03:31:28.225214" elapsed="0.015606"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:31:28.205723" elapsed="0.035195">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:28.241354" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:31:28.241439" 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="FAIL" start="2026-04-17T03:31:28.192508" elapsed="0.049060">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:31:28.241689" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:31:28.241735" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:28.187484" elapsed="0.054275"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:28.242888" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:28.241854" elapsed="0.001122"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:28.241832" elapsed="0.001177"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:31:28.187276" elapsed="0.055760"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:31:28.187034" elapsed="0.056039"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:31:28.183608" elapsed="0.059530"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:31:28.176506" elapsed="0.066689"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:28.175865" elapsed="0.067375"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:31:28.171382" elapsed="0.071910"/>
</kw>
<kw name="Play_To_Odl_Non_Removal_BgpRpcClient4">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:31:28.255194" 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-04-17T03:31:28.255495" 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-04-17T03:31:28.254957" elapsed="0.000566"/>
</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-04-17T03:31:28.255686" elapsed="0.003159"/>
</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-04-17T03:31:28.254457" elapsed="0.004507"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:31:28.259713" 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-04-17T03:31:28.259162" elapsed="0.000579"/>
</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-04-17T03:31:28.316983" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:28.316383" elapsed="0.000654"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:28.318282" 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-04-17T03:31:28.317773" elapsed="0.000732">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-04-17T03:31:28.318657" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:28.317292" elapsed="0.001425"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:28.319710" 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-04-17T03:31:28.319085" elapsed="0.000664"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:31:28.320226" 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-04-17T03:31:28.320443" 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-04-17T03:31:28.320020" elapsed="0.000460"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:28.321090" 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-04-17T03:31:28.320712" elapsed="0.000445"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:28.322612" 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-04-17T03:31:28.322247" elapsed="0.000428"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:31:28.323489" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:31:28.323020" elapsed="0.000507"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:28.324433" 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-04-17T03:31:28.324058" elapsed="0.000401"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:28.325400" 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-04-17T03:31:28.325042" elapsed="0.000384"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:28.325481" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:31:28.325658" 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-04-17T03:31:28.324656" elapsed="0.001028"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:31:28.325848" elapsed="0.000321"/>
</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-04-17T03:31:28.323848" elapsed="0.002362"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:28.326825" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:31:28.326472" elapsed="0.000379"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:28.327750" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:31:28.327412" elapsed="0.000365"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:28.327842" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:31:28.328023" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:31:28.327059" elapsed="0.000989"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:31:28.328208" elapsed="0.000275"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:31:28.326330" elapsed="0.002194"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:31:28.323609" elapsed="0.004950"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:31:28.328603" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:31:28.328813" 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-04-17T03:31:28.321748" elapsed="0.007105"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:28.321272" elapsed="0.007624"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:28.329107" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:28.328943" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:28.321235" elapsed="0.007949"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:31:28.330235" 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-04-17T03:31:28.329339" elapsed="0.000970"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:31:28.330362" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:31:28.315497" elapsed="0.014995"/>
</kw>
<msg time="2026-04-17T03:31:28.330550" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:28.301823" elapsed="0.028778"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:31:28.344251" elapsed="0.000084"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:31:28.358389" elapsed="0.000081"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:31:28.371872" elapsed="0.000094"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:28.372268" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:28.372468" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:28.372960" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:28.372780" elapsed="0.000238"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:28.372760" 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-04-17T03:31:28.373201" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:28.373374" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:28.373544" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:31:28.372715" elapsed="0.000883"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:31:28.372555" elapsed="0.001071"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:28.373780" elapsed="0.000024"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:28.373877" elapsed="0.000023"/>
</return>
<msg time="2026-04-17T03:31:28.374088" 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-04-17T03:31:28.297004" elapsed="0.077115"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:28.375786" 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-04-17T03:31:28.375474" elapsed="0.000393">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-04-17T03:31:28.375980" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:28.375046" elapsed="0.000960"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:28.376353" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:28.376076" elapsed="0.000333"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:31:28.376970" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:28.376642" elapsed="0.000357"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:28.376434" elapsed="0.000601"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:28.376058" elapsed="0.000998"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:28.379508" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:31:28.377215" elapsed="0.002320"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:31:28.379588" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:31:28.379753" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:31:28.374601" elapsed="0.005177"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:28.381129" 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-04-17T03:31:28.380866" elapsed="0.000327">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-04-17T03:31:28.381288" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:28.380489" elapsed="0.000824"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:31:28.381521" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-17T03:31:28.381383" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:28.381365" elapsed="0.000239"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:28.381758" 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-04-17T03:31:28.381952" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:31:28.382021" elapsed="0.000014"/>
</return>
<msg time="2026-04-17T03:31:28.384238" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:31:28.380149" elapsed="0.004120"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:28.385812" 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-04-17T03:31:28.385550" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:28.386322" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:28.386065" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:31:28.392965" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:28.594760" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:28.998060" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:29.000272" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:31:28.389268" elapsed="0.614006">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:31:28.386460" elapsed="0.616965">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:29.003790" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:29.003484" elapsed="0.000395"/>
</branch>
<status status="FAIL" start="2026-04-17T03:31:28.386432" elapsed="0.617478">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:29.004521" elapsed="0.000033"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:29.004703" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:29.004651" elapsed="0.000111"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:29.004625" elapsed="0.000166"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:29.005018" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:31:29.005112" 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-04-17T03:31:28.384652" elapsed="0.620607">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:29.005361" 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-04-17T03:31:28.271397" elapsed="0.734094">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:29.005861" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:29.005617" elapsed="0.000363"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:29.005593" elapsed="0.000421"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:29.006057" elapsed="0.000019"/>
</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-04-17T03:31:28.266473" elapsed="0.739713">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:31.074325" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:31.073675" elapsed="0.000699"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:31.075545" 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-04-17T03:31:31.075169" elapsed="0.000481">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-04-17T03:31:31.075765" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:31.074639" elapsed="0.001152"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:31.076515" 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-04-17T03:31:31.076019" elapsed="0.000533"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:31:31.077011" 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-04-17T03:31:31.077271" 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-04-17T03:31:31.076785" elapsed="0.000525"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:31.077804" 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-04-17T03:31:31.077535" 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-04-17T03:31:31.079020" 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-04-17T03:31:31.078736" elapsed="0.000329"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:31:31.079553" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:31:31.079235" elapsed="0.000344"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:31.080352" 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-04-17T03:31:31.079985" elapsed="0.000394"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:31.081332" 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-04-17T03:31:31.080970" elapsed="0.000389"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:31.081413" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:31:31.081588" 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-04-17T03:31:31.080583" elapsed="0.001030"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:31:31.081775" elapsed="0.000616"/>
</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-04-17T03:31:31.079823" elapsed="0.002612"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:31.083051" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:31:31.082700" elapsed="0.000377"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:31.084022" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:31:31.083659" elapsed="0.000389"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:31.084100" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:31:31.084256" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:31:31.083269" elapsed="0.001011"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:31:31.084439" elapsed="0.000275"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:31:31.082556" elapsed="0.002199"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:31:31.079638" elapsed="0.005152"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:31:31.084908" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:31:31.085091" 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-04-17T03:31:31.078364" elapsed="0.006752"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:31.077963" elapsed="0.007187"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:31.085341" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:31.085179" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:31.077916" elapsed="0.007501"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:31:31.086219" 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-04-17T03:31:31.085568" elapsed="0.000682"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:31:31.086299" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:31:31.072578" elapsed="0.013849"/>
</kw>
<msg time="2026-04-17T03:31:31.086485" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:31.055889" elapsed="0.030648"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:31:31.099420" elapsed="0.000101"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:31:31.117101" elapsed="0.000041"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_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-04-17T03:31:31.129954" elapsed="0.000045"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:31.130228" 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-04-17T03:31:31.130420" elapsed="0.000038"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:31.130873" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:31.130712" elapsed="0.000242"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:31.130694" elapsed="0.000297"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:31.131152" 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-04-17T03:31:31.131329" 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-04-17T03:31:31.131547" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:31:31.130653" elapsed="0.000958"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:31:31.130523" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:31.131878" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:31.131980" elapsed="0.000024"/>
</return>
<msg time="2026-04-17T03:31:31.132168" 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-04-17T03:31:31.050015" elapsed="0.082183"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:31.133797" 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-04-17T03:31:31.133487" elapsed="0.000393">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-04-17T03:31:31.133996" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:31.132994" elapsed="0.001030"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:31.134409" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:31.134125" elapsed="0.000341"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:31:31.135084" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:31.134698" elapsed="0.000420"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:31.134492" elapsed="0.000663"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:31.134105" elapsed="0.001072"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:31.137938" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:31:31.135337" elapsed="0.002631"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:31:31.138021" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:31:31.138213" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:31:31.132579" elapsed="0.005673"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:31.139600" 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-04-17T03:31:31.139333" elapsed="0.000331">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-04-17T03:31:31.139761" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:31.138943" elapsed="0.000842"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:31:31.140015" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-17T03:31:31.139858" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:31.139839" elapsed="0.000261"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:31.140292" 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-04-17T03:31:31.140494" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:31:31.140561" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:31:31.142581" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:31:31.138588" elapsed="0.004021"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:31.144179" 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-04-17T03:31:31.143895" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:31.144696" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:31.144435" elapsed="0.000357"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:31:31.150180" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:31.351917" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:31.755446" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:31.760452" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:31:31.147107" elapsed="0.616684">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:31:31.144863" elapsed="0.619106">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:31.764357" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:31.764035" elapsed="0.000420"/>
</branch>
<status status="FAIL" start="2026-04-17T03:31:31.144844" elapsed="0.619646">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:31.765137" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:31.765343" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:31.765284" elapsed="0.000122"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:31.765256" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:31.765652" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:31:31.765754" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:31:31.142951" elapsed="0.623028">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:31.766122" 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-04-17T03:31:31.023948" elapsed="0.742321">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:31.767252" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:31.766853" elapsed="0.000547"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:31.766447" elapsed="0.001003"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:31.767521" elapsed="0.000030"/>
</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-04-17T03:31:31.014572" elapsed="0.753179">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:33.823694" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/rt_constrain/rt_constrain_type_1/rib.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:33.823255" elapsed="0.000475"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:33.824786" 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-04-17T03:31:33.824446" elapsed="0.000444">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-04-17T03:31:33.825017" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:33.823919" elapsed="0.001124"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:33.825636" 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-04-17T03:31:33.825223" elapsed="0.000442"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:31:33.826024" 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-04-17T03:31:33.826202" 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-04-17T03:31:33.825840" elapsed="0.000390"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:33.826662" 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-04-17T03:31:33.826403" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:33.827793" 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-04-17T03:31:33.827517" elapsed="0.000324"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:31:33.828343" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:31:33.828029" elapsed="0.000343"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:33.829220" 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-04-17T03:31:33.828785" elapsed="0.000470"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:33.830502" 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-04-17T03:31:33.829876" elapsed="0.000655"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:33.830587" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:31:33.830760" 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-04-17T03:31:33.829500" 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-04-17T03:31:33.831007" elapsed="0.000331"/>
</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-04-17T03:31:33.828623" elapsed="0.002760"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:33.832084" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:31:33.831714" elapsed="0.000398"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:33.833120" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:31:33.832730" elapsed="0.000419"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:33.833205" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:31:33.833372" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:31:33.832358" 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-04-17T03:31:33.833561" elapsed="0.000285"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:31:33.831566" elapsed="0.002324"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:31:33.828433" elapsed="0.005509"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:31:33.833990" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:31:33.834162" 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-04-17T03:31:33.827170" elapsed="0.007019"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:33.826797" elapsed="0.007427"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:33.834413" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:33.834251" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:33.826771" elapsed="0.007724"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:31:33.835349" 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-04-17T03:31:33.834650" elapsed="0.000736"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:31:33.835450" 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/rib.vanadium/${file_name} exists. If yes read and 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-04-17T03:31:33.822452" elapsed="0.013160"/>
</kw>
<msg time="2026-04-17T03:31:33.835683" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:33.809021" elapsed="0.026716"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_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-04-17T03:31:33.849592" 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-04-17T03:31:33.863358" 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_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-04-17T03:31:33.878615" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:33.879015" 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-04-17T03:31:33.879238" 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-04-17T03:31:33.879670" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:33.879507" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:33.879488" 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-04-17T03:31:33.879911" elapsed="0.000038"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:33.880111" 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-04-17T03:31:33.880337" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:31:33.879449" elapsed="0.000947"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:31:33.879326" elapsed="0.001099"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:33.880584" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:33.880668" elapsed="0.000022"/>
</return>
<msg time="2026-04-17T03:31:33.880841" 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-04-17T03:31:33.804028" elapsed="0.076843"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:33.882511" 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-04-17T03:31:33.882200" elapsed="0.000392">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-04-17T03:31:33.882695" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:33.881722" elapsed="0.000999"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:33.883116" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:33.882800" elapsed="0.000379"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:31:33.883765" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:33.883443" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:33.883206" elapsed="0.000625"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:33.882779" elapsed="0.001074"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:33.886626" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:31:33.884051" elapsed="0.002604"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:31:33.886711" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:31:33.886883" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:31:33.881282" elapsed="0.005627"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:33.888400" 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-04-17T03:31:33.888111" elapsed="0.000362">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-04-17T03:31:33.888574" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:33.887730" elapsed="0.000869"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:31:33.888825" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-17T03:31:33.888677" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:33.888657" elapsed="0.000335"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:33.889178" elapsed="0.000024"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:33.889379" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:31:33.889449" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:31:33.891684" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:31:33.887361" elapsed="0.004351"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:33.893339" 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-04-17T03:31:33.893060" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:33.893836" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:33.893571" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:31:33.899627" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:34.101456" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:34.504253" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:34.506782" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:31:33.896453" elapsed="0.615092">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:31:33.893969" elapsed="0.617744">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:34.512214" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:34.511814" elapsed="0.000506"/>
</branch>
<status status="FAIL" start="2026-04-17T03:31:33.893948" elapsed="0.618410">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:34.513111" elapsed="0.000045"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:34.513375" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:34.513304" elapsed="0.000145"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:34.513261" elapsed="0.000220"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:34.513732" elapsed="0.000050"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:31:34.514014" elapsed="0.000043"/>
</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-04-17T03:31:33.892084" elapsed="0.622194">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:34.514441" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:31:33.777735" elapsed="0.736882">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:34.515462" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:34.515145" elapsed="0.000430"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:34.514737" elapsed="0.000878"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:34.515666" elapsed="0.000021"/>
</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-04-17T03:31:33.773090" elapsed="0.742734">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:31:34.516015" level="FAIL">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-17T03:31:28.260026" elapsed="6.256152">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Play Get" owner="BgpRpcClient4">
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:34.516567" elapsed="0.000041"/>
</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="FAIL" start="2026-04-17T03:31:28.169227" elapsed="6.347612">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying 3 times. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:31:34.520739" elapsed="0.000355"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:31:34.520346" elapsed="0.000824"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:34.522592" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:34.522417" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:34.522388" elapsed="0.000301"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:34.529345" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:34.529015" elapsed="0.000420"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:34.528970" elapsed="0.000500"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:34.531188" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:31:34.530511" elapsed="0.000721"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:31:34.532077" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:31:34.531537" elapsed="0.000583"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:31:34.532190" elapsed="0.000052"/>
</return>
<msg time="2026-04-17T03:31:34.532536" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:31:34.529860" elapsed="0.002718"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:34.539222" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:34.539088" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:34.539050" 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-04-17T03:31:34.540795" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:34.540680" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:34.540661" elapsed="0.000217"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:34.541435" level="INFO">${karaf_connection_index} = 22</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:31:34.541101" elapsed="0.000364"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:34.541976" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:31:34.541706" elapsed="0.000298"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:31:34.542821" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:31:34.542541" elapsed="0.001053">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:31:34.543792" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:31:34.543841" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:34.542178" elapsed="0.001687"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:31:34.544783" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:31:34.544525" elapsed="0.000973">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:31:34.545685" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:31:34.545732" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:34.544065" elapsed="0.001691"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:31:34.546730" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Play_To_Odl_remove_rt"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:31:34.546109" elapsed="0.000684">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Play_To_Odl_remove_rt"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:31:34.545838" elapsed="0.001027">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Play_To_Odl_remove_rt"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:31:34.545816" elapsed="0.001084">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Play_To_Odl_remove_rt"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:34.547146" elapsed="0.000034"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:34.547465" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:34.547265" elapsed="0.000271"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:34.547242" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:31:34.547617" elapsed="0.000022"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:31:34.550577" elapsed="0.000171"/>
</kw>
<msg time="2026-04-17T03:31:34.550821" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:34.549389" elapsed="0.001586"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:34.551329" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:34.551676" 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-04-17T03:31:34.548675" 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-04-17T03:31:34.548055" elapsed="0.003915"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:31:34.540256" elapsed="0.011834">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Play_To_Odl_remove_rt"</status>
</kw>
<msg time="2026-04-17T03:31:34.552227" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:31:34.552291" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Play_To_Odl_remove_rt"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:34.539500" elapsed="0.012830"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:31:34.552588" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:34.552462" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:34.552438" elapsed="0.000221"/>
</if>
<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-04-17T03:31:34.555657" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:34.555544" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:34.555524" elapsed="0.000204"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:34.556064" level="INFO">index=15
host=10.30.170.120
alias=None
port=22
timeout=6 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-04-17T03:31:34.556176" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
alias=None
port=22
timeout=6 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-04-17T03:31:34.555901" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:34.556719" level="INFO">{1: 22}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:34.556411" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:34.557234" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:34.556954" elapsed="0.000326"/>
</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-04-17T03:31:34.557902" elapsed="0.000393"/>
</kw>
<msg time="2026-04-17T03:31:34.558406" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:31:34.558455" level="INFO">${old_connection_index} = 22</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:34.557470" elapsed="0.001009"/>
</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-04-17T03:31:34.559336" elapsed="0.000213"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:31:34.560751" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:31:34.560259" elapsed="0.001576">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:34.559730" elapsed="0.002296"/>
</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-04-17T03:31:34.562734" elapsed="0.000302"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:34.562223" elapsed="0.000901"/>
</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-04-17T03:31:34.558794" elapsed="0.004380"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:34.558558" elapsed="0.004666"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:34.558539" elapsed="0.004712"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:34.564229" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:31:34.563843" elapsed="0.000419"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:31:34.564318" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:31:34.564531" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:31:34.563484" elapsed="0.001078"/>
</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-04-17T03:31:34.564732" elapsed="0.000491"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:34.565608" level="INFO">index=23
host=10.30.170.120
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-04-17T03:31:34.565735" level="INFO">${karaf_connection_object} = index=23
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:31:34.565471" elapsed="0.000296"/>
</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-04-17T03:31:34.565959" elapsed="0.002715"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:31:34.569153" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:31:34.570421" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:31:34.568854" elapsed="0.002033">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:31:34.585923" elapsed="0.000458"/>
</kw>
<msg time="2026-04-17T03:31:34.586494" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:34.584008" elapsed="0.002670"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:34.586907" elapsed="0.000046"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:34.587116" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:31:34.571890" elapsed="0.015316"/>
</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-04-17T03:31:34.571290" elapsed="0.015967"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:31:34.555193" elapsed="0.032158">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:34.587783" elapsed="0.000030"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:31:34.587868" 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="FAIL" start="2026-04-17T03:31:34.538587" elapsed="0.049453">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:31:34.588168" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:31:34.588216" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:34.533224" elapsed="0.055016"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:34.588693" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:34.588334" elapsed="0.000417"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:34.588310" elapsed="0.000466"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:31:34.533022" elapsed="0.055780"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:31:34.532677" elapsed="0.056163"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:31:34.528185" elapsed="0.060730"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:31:34.522005" elapsed="0.067166"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:34.521383" elapsed="0.067838"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:31:34.517910" elapsed="0.071368"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient3">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-04-17T03:31:34.589455" elapsed="0.003082"/>
</kw>
<kw name="Play_To_Odl_Routes_Removal_Template_BgpRpcClient3">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:31:34.607903" 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-04-17T03:31:34.608205" 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-04-17T03:31:34.607646" elapsed="0.000599"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient3">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-04-17T03:31:34.608456" elapsed="0.002201"/>
</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-04-17T03:31:34.610856" elapsed="0.002424"/>
</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-04-17T03:31:34.607075" elapsed="0.006376"/>
</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-04-17T03:31:34.517230" elapsed="0.096417"/>
</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-04-17T03:31:34.619493" elapsed="0.000366"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:31:34.619057" elapsed="0.000916"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:34.621652" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:34.621461" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:34.621427" elapsed="0.000334"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:34.629036" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:34.628838" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:34.628801" elapsed="0.000349"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:34.630390" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:31:34.629896" elapsed="0.000525"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:31:34.630942" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:31:34.630599" elapsed="0.000373"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:31:34.631019" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:31:34.631193" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:31:34.629465" elapsed="0.001754"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:34.637276" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:34.637142" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:34.637118" elapsed="0.000240"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:34.638670" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:34.638562" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:34.638544" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:34.639251" level="INFO">${karaf_connection_index} = 23</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:31:34.638893" elapsed="0.000386"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:34.639673" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:31:34.639450" elapsed="0.000249"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:31:34.640557" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:31:34.640231" elapsed="0.001286">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:31:34.641810" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:31:34.641885" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:34.639866" elapsed="0.002054"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:31:34.643244" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:31:34.642780" elapsed="0.001498">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:31:34.644594" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:31:34.644664" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:34.642254" elapsed="0.002445"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:31:34.646163" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Play_To_Odl_remove_routes"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:31:34.645209" elapsed="0.001149">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Play_To_Odl_remove_routes"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:31:34.644825" elapsed="0.001643">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Play_To_Odl_remove_routes"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:31:34.644792" elapsed="0.002030">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Play_To_Odl_remove_routes"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:34.647125" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:34.647496" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:34.647266" elapsed="0.000310"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:34.647239" elapsed="0.000373"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:31:34.647665" 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-04-17T03:31:34.651922" elapsed="0.000297"/>
</kw>
<msg time="2026-04-17T03:31:34.652321" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:34.650154" elapsed="0.002427"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:34.653018" elapsed="0.000081"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:34.653386" 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-04-17T03:31:34.649076" elapsed="0.004543"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:31:34.648184" elapsed="0.005506"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:31:34.638254" elapsed="0.015532">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Play_To_Odl_remove_routes"</status>
</kw>
<msg time="2026-04-17T03:31:34.653900" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:31:34.653964" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Play_To_Odl_remove_routes"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:34.637558" elapsed="0.016433"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:31:34.654202" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:34.654079" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:34.654056" elapsed="0.000217"/>
</if>
<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-04-17T03:31:34.655192" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:34.655082" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:34.655062" elapsed="0.000199"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:34.655572" level="INFO">index=15
host=10.30.170.120
alias=None
port=22
timeout=6 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-04-17T03:31:34.655683" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
alias=None
port=22
timeout=6 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-04-17T03:31:34.655429" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:34.656288" level="INFO">{1: 23}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:34.655901" elapsed="0.000436"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:34.656835" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:34.656570" elapsed="0.000313"/>
</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-04-17T03:31:34.657526" elapsed="0.000279"/>
</kw>
<msg time="2026-04-17T03:31:34.657908" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:31:34.657978" level="INFO">${old_connection_index} = 23</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:34.657073" elapsed="0.000929"/>
</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-04-17T03:31:34.658837" elapsed="0.000256"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:31:34.660479" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:31:34.659804" elapsed="0.001654">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:34.659275" elapsed="0.002354"/>
</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-04-17T03:31:34.662321" elapsed="0.000301"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:34.661814" elapsed="0.000895"/>
</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-04-17T03:31:34.658314" elapsed="0.004442"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:34.658081" elapsed="0.004727"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:34.658062" elapsed="0.004772"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:34.663776" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:31:34.663434" elapsed="0.000376"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:31:34.663862" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:31:34.664099" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:31:34.663077" elapsed="0.001056"/>
</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-04-17T03:31:34.664354" elapsed="0.000531"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:34.665260" level="INFO">index=24
host=10.30.170.120
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-04-17T03:31:34.665366" level="INFO">${karaf_connection_object} = index=24
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:31:34.665138" elapsed="0.000255"/>
</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-04-17T03:31:34.665550" elapsed="0.003157"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:31:34.669321" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:31:34.670683" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:31:34.668916" elapsed="0.002252">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:31:34.687314" elapsed="0.000461"/>
</kw>
<msg time="2026-04-17T03:31:34.687888" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:34.685644" elapsed="0.003035"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:34.688890" elapsed="0.000033"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:34.689132" elapsed="0.000024"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:31:34.672317" elapsed="0.016915"/>
</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-04-17T03:31:34.671548" elapsed="0.017738"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:31:34.654722" elapsed="0.034664">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:34.689813" elapsed="0.000030"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:31:34.689895" elapsed="0.000024"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:31:34.636704" elapsed="0.053392">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:31:34.690256" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:31:34.690307" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:34.631638" elapsed="0.058694"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:34.690712" elapsed="0.000102"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:34.690424" elapsed="0.000426"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:34.690401" elapsed="0.000477"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:31:34.631479" elapsed="0.059424"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:31:34.631286" elapsed="0.059718"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:31:34.628163" elapsed="0.062907"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:31:34.620986" elapsed="0.070148"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:34.620219" elapsed="0.070965"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:31:34.615161" elapsed="0.076083"/>
</kw>
<kw name="Play_To_Odl_Routes_Removal_Template_BgpRpcClient2">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:31:34.703530" 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-04-17T03:31:34.703721" 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-04-17T03:31:34.703305" elapsed="0.000444"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient2">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-04-17T03:31:34.703915" elapsed="0.002828"/>
</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-04-17T03:31:34.706969" elapsed="0.001815"/>
</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-04-17T03:31:34.702847" elapsed="0.006005"/>
</kw>
<kw name="Play_To_Odl_Routes_Removal_Template_BgpRpcClient4">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:31:34.723196" 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-04-17T03:31:34.723351" 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-04-17T03:31:34.722983" elapsed="0.000395"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient4">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-04-17T03:31:34.723539" elapsed="0.002530"/>
</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-04-17T03:31:34.726231" elapsed="0.002243"/>
</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-04-17T03:31:34.722542" elapsed="0.005996"/>
</kw>
<doc>Removes rt arguments from odl.</doc>
<status status="PASS" start="2026-04-17T03:31:34.614273" elapsed="0.114422"/>
</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-04-17T03:31:34.732386" elapsed="0.000261"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:31:34.732114" elapsed="0.000588"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:34.733788" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:34.733657" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:34.733634" elapsed="0.000225"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:34.739854" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:34.739678" elapsed="0.000244"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:34.739652" elapsed="0.000328"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:34.741532" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:31:34.740959" elapsed="0.000612"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:31:34.742272" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:31:34.741815" elapsed="0.000495"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:31:34.742374" elapsed="0.000049"/>
</return>
<msg time="2026-04-17T03:31:34.742606" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:31:34.740330" elapsed="0.002318"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:34.751186" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:34.751022" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:34.750989" elapsed="0.000298"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:34.753060" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:34.752889" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:34.752864" elapsed="0.000266"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:34.753605" level="INFO">${karaf_connection_index} = 24</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:31:34.753288" elapsed="0.000345"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:34.754055" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:31:34.753806" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:31:34.754960" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:31:34.754650" elapsed="0.001226">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:31:34.756115" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:31:34.756169" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:34.754252" elapsed="0.001943"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:31:34.757058" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:31:34.756787" elapsed="0.000952">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:31:34.757954" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:31:34.758005" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:34.756377" elapsed="0.001652"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:31:34.758997" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Kill_Talking_BGP_Speakers"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:31:34.758353" elapsed="0.000710">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Kill_Talking_BGP_Speakers"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:31:34.758115" elapsed="0.001032">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Kill_Talking_BGP_Speakers"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:31:34.758090" elapsed="0.001096">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Kill_Talking_BGP_Speakers"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:34.759363" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:34.759600" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:34.759452" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:34.759434" elapsed="0.000243"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:31:34.759711" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:31:34.762497" elapsed="0.000150"/>
</kw>
<msg time="2026-04-17T03:31:34.762715" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:34.761323" 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-04-17T03:31:34.763156" elapsed="0.000090"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:34.763517" 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-04-17T03:31:34.760646" 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-04-17T03:31:34.760035" elapsed="0.003739"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:31:34.752405" elapsed="0.011454">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Kill_Talking_BGP_Speakers"</status>
</kw>
<msg time="2026-04-17T03:31:34.763980" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:31:34.764025" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Kill_Talking_BGP_Speakers"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:34.751517" elapsed="0.012532"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:31:34.764296" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:34.764174" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:34.764156" elapsed="0.000208"/>
</if>
<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-04-17T03:31:34.765365" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:34.765221" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:34.765198" elapsed="0.000241"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:34.765732" level="INFO">index=15
host=10.30.170.120
alias=None
port=22
timeout=6 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-04-17T03:31:34.765839" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
alias=None
port=22
timeout=6 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-04-17T03:31:34.765601" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:34.766384" level="INFO">{1: 24}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:34.766116" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:34.766834" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:34.766590" elapsed="0.000287"/>
</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-04-17T03:31:34.767441" elapsed="0.000266"/>
</kw>
<msg time="2026-04-17T03:31:34.767807" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:31:34.767854" level="INFO">${old_connection_index} = 24</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:34.767059" elapsed="0.000817"/>
</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-04-17T03:31:34.768800" elapsed="0.000211"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:31:34.770337" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:31:34.769677" elapsed="0.001552">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:34.769185" elapsed="0.002145"/>
</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-04-17T03:31:34.772008" elapsed="0.000280"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:34.771511" elapsed="0.000863"/>
</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-04-17T03:31:34.768245" elapsed="0.004248"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:34.767969" elapsed="0.004577"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:34.767949" elapsed="0.004624"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:34.773558" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:31:34.773207" elapsed="0.000380"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:31:34.773636" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:31:34.773793" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:31:34.772795" elapsed="0.001023"/>
</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-04-17T03:31:34.774028" elapsed="0.000444"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:34.774761" level="INFO">index=25
host=10.30.170.120
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-04-17T03:31:34.774861" level="INFO">${karaf_connection_object} = index=25
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:31:34.774652" elapsed="0.000235"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:31:34.775062" elapsed="0.002372"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:31:34.777871" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:31:34.778882" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:31:34.777608" elapsed="0.001682">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:31:34.797687" elapsed="0.000703"/>
</kw>
<msg time="2026-04-17T03:31:34.798527" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:34.795668" elapsed="0.003074"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:34.799012" elapsed="0.000033"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:34.799258" elapsed="0.000027"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:31:34.780334" elapsed="0.019035"/>
</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-04-17T03:31:34.779676" elapsed="0.019761"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:31:34.764888" elapsed="0.034682">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:34.800162" elapsed="0.000037"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:31:34.800262" 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="FAIL" start="2026-04-17T03:31:34.750475" elapsed="0.049939">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:31:34.800589" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:31:34.800647" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:34.743256" elapsed="0.057421"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:34.801169" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:34.800793" elapsed="0.000450"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:34.800766" elapsed="0.000511"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:31:34.743043" elapsed="0.058266"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:31:34.742746" elapsed="0.058607"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:31:34.739142" elapsed="0.062287"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:31:34.733354" elapsed="0.068148"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:34.732863" elapsed="0.068699"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:31:34.729432" elapsed="0.072199"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:31:34.814733" level="INFO">Executing command 'cat play.py.090.2'.</msg>
<msg time="2026-04-17T03:31:34.828221" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:31:34.828413" level="INFO">${output_log} = 2026-04-17 03:31:09,056 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:31:09,057 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.2
2026-04-17 03:31:09,057 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-04-17T03:31:34.814527" elapsed="0.013959"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:34.829235" level="INFO">2026-04-17 03:31:09,056 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:31:09,057 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.2
2026-04-17 03:31:09,057 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-04-17 03:31:09,057 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.120
2026-04-17 03:31:09,057 DEBUG BGP-Thread-1 (job): Remote port: 1790
Exception in thread Thread-1 (job):
Traceback (most recent call last):
  File "/usr/lib/python3.10/threading.py", line 1016, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.10/threading.py", line 953, in run
    self._target(*self._args, **self._kwargs)
  File "/home/jenkins/play.py", line 2406, in job
    bgp_socket = establish_connection(arguments)
  File "/home/jenkins/play.py", line 284, in establish_connection
    talking_socket.connect((str(arguments.peerip), arguments.peerport))
ConnectionRefusedError: [Errno 111] Connection refused
10.30.171.144 - - [17/Apr/2026 03:31:09] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:31:28] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:31:34] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:31:34] "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-04-17T03:31:34.828775" elapsed="0.000528"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-04-17T03:31:34.830110" 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-04-17T03:31:34.829598" elapsed="0.000641"/>
</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-04-17T03:31:34.814006" elapsed="0.016325"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:31:34.843347" level="INFO">Executing command 'cat play.py.090.3'.</msg>
<msg time="2026-04-17T03:31:34.882217" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:31:34.882552" level="INFO">${output_log} = 2026-04-17 03:31:09,062 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:31:09,063 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.3
2026-04-17 03:31:09,063 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-04-17T03:31:34.843141" elapsed="0.039471"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:34.883802" level="INFO">2026-04-17 03:31:09,062 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:31:09,063 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.3
2026-04-17 03:31:09,063 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-04-17 03:31:09,063 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.120
2026-04-17 03:31:09,063 DEBUG BGP-Thread-1 (job): Remote port: 1790
Exception in thread Thread-1 (job):
Traceback (most recent call last):
  File "/usr/lib/python3.10/threading.py", line 1016, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.10/threading.py", line 953, in run
    self._target(*self._args, **self._kwargs)
  File "/home/jenkins/play.py", line 2406, in job
    bgp_socket = establish_connection(arguments)
  File "/home/jenkins/play.py", line 284, in establish_connection
    talking_socket.connect((str(arguments.peerip), arguments.peerport))
ConnectionRefusedError: [Errno 111] Connection refused
10.30.171.144 - - [17/Apr/2026 03:31:15] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:31:28] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:31:34] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:31:34] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:31:34] "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-04-17T03:31:34.883137" elapsed="0.000779"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-04-17T03:31:34.885022" 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-04-17T03:31:34.884380" elapsed="0.000703"/>
</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-04-17T03:31:34.842506" elapsed="0.042659"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:31:34.896226" level="INFO">Executing command 'cat play.py.090.4'.</msg>
<msg time="2026-04-17T03:31:34.929919" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:31:34.930314" level="INFO">${output_log} = 2026-04-17 03:31:09,059 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:31:09,059 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.4
2026-04-17 03:31:09,059 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-04-17T03:31:34.895909" elapsed="0.034478"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:34.931730" level="INFO">2026-04-17 03:31:09,059 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-04-17 03:31:09,059 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.4
2026-04-17 03:31:09,059 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-04-17 03:31:09,059 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.120
2026-04-17 03:31:09,059 DEBUG BGP-Thread-1 (job): Remote port: 1790
Exception in thread Thread-1 (job):
Traceback (most recent call last):
  File "/usr/lib/python3.10/threading.py", line 1016, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.10/threading.py", line 953, in run
    self._target(*self._args, **self._kwargs)
  File "/home/jenkins/play.py", line 2406, in job
    bgp_socket = establish_connection(arguments)
  File "/home/jenkins/play.py", line 284, in establish_connection
    talking_socket.connect((str(arguments.peerip), arguments.peerport))
ConnectionRefusedError: [Errno 111] Connection refused
10.30.171.144 - - [17/Apr/2026 03:31:28] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:31:34] "POST /RPC2 HTTP/1.1" 200 -
10.30.171.144 - - [17/Apr/2026 03:31:34] "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-04-17T03:31:34.930898" elapsed="0.000967"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-04-17T03:31:34.933354" 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-04-17T03:31:34.932559" elapsed="0.000887"/>
</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-04-17T03:31:34.895383" elapsed="0.038167"/>
</kw>
<kw name="Kill_All_BGP_Speakers" owner="BGPSpeaker">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:31:34.934884" level="INFO">${command} = ps axf | grep play.py | grep -v grep | awk '{print "kill -9 " $1}' | sh</msg>
<var>${command}</var>
<arg>ps axf | grep play.py | grep -v grep | awk '{print \"kill -9 \" $1}' | sh</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:34.934441" elapsed="0.000483"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:31:34.935840" level="INFO">[?2004l[2] 5140</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-17T03:31:34.935210" elapsed="0.000708"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:31:34.936985" level="INFO">[?2004h[jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:31:34.937115" level="INFO">${output} = [?2004h[jenkins@releng-26932-188-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-04-17T03:31:34.936202" elapsed="0.000950"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:34.937768" level="INFO">[?2004h[jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:34.937393" elapsed="0.000458"/>
</kw>
<doc>Kill all play.py processes.</doc>
<status status="PASS" start="2026-04-17T03:31:34.933918" elapsed="0.004062"/>
</kw>
<doc>Abort all Python speakers.</doc>
<status status="PASS" start="2026-04-17T03:31:34.728951" elapsed="0.209279"/>
</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-04-17T03:31:34.943438" elapsed="0.000406"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:31:34.942948" elapsed="0.001014"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:34.945603" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:34.945447" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:34.945417" 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-04-17T03:31:34.951259" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:34.951130" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:34.951112" elapsed="0.000217"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:34.952460" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:31:34.951994" elapsed="0.000534"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:31:34.953033" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:31:34.952705" elapsed="0.000355"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:31:34.953105" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:31:34.953270" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:31:34.951578" elapsed="0.001718"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:34.959300" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:34.959172" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:34.959149" 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-04-17T03:31:34.960707" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:34.960596" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:34.960578" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:34.961295" level="INFO">${karaf_connection_index} = 25</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:31:34.960957" elapsed="0.000366"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:34.961717" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:31:34.961493" elapsed="0.000250"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:31:34.962562" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:31:34.962281" elapsed="0.000976">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:31:34.963450" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:31:34.963496" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:34.961910" elapsed="0.001611"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:31:34.964317" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:31:34.964071" elapsed="0.001080">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:31:34.965411" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:31:34.965457" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:34.963696" elapsed="0.001785"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:31:34.966685" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Delete_Bgp_Peers_Configuration"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:31:34.965800" elapsed="0.000949">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Delete_Bgp_Peers_Configuration"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:31:34.965567" elapsed="0.001253">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Delete_Bgp_Peers_Configuration"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:31:34.965547" elapsed="0.001307">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Delete_Bgp_Peers_Configuration"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:34.967057" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:34.967372" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:34.967221" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:34.967203" elapsed="0.000245"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:31:34.967481" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:31:34.970408" elapsed="0.000153"/>
</kw>
<msg time="2026-04-17T03:31:34.970628" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:34.969112" 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-04-17T03:31:34.971051" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:34.971396" 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-04-17T03:31:34.968393" elapsed="0.003187"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:31:34.967793" elapsed="0.003850"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:31:34.960264" elapsed="0.011464">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Delete_Bgp_Peers_Configuration"</status>
</kw>
<msg time="2026-04-17T03:31:34.971833" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:31:34.971876" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation.Delete_Bgp_Peers_Configuration"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:34.959563" elapsed="0.012336"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:31:34.972249" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:34.972136" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:34.972116" elapsed="0.000201"/>
</if>
<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-04-17T03:31:34.973171" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:34.973065" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:34.973045" elapsed="0.000192"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:34.973526" level="INFO">index=15
host=10.30.170.120
alias=None
port=22
timeout=6 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-04-17T03:31:34.973633" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
alias=None
port=22
timeout=6 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-04-17T03:31:34.973395" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:34.974170" level="INFO">{1: 25}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:34.973817" elapsed="0.000397"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:34.974614" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:34.974371" elapsed="0.000286"/>
</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-04-17T03:31:34.975240" elapsed="0.000264"/>
</kw>
<msg time="2026-04-17T03:31:34.975602" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:31:34.975648" level="INFO">${old_connection_index} = 25</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:34.974821" elapsed="0.000849"/>
</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-04-17T03:31:34.976628" elapsed="0.000196"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:31:34.977906" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:31:34.977493" elapsed="0.001319">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:34.977013" elapsed="0.001898"/>
</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-04-17T03:31:34.979569" elapsed="0.000275"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:34.979106" elapsed="0.000861"/>
</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-04-17T03:31:34.976075" elapsed="0.003941"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:34.975744" elapsed="0.004373"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:34.975726" elapsed="0.004417"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:34.981066" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:31:34.980726" elapsed="0.000368"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:31:34.981144" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:31:34.981300" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:31:34.980364" elapsed="0.000965"/>
</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-04-17T03:31:34.981564" elapsed="0.000446"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:34.982297" level="INFO">index=26
host=10.30.170.120
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-04-17T03:31:34.982396" level="INFO">${karaf_connection_object} = index=26
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:31:34.982187" elapsed="0.000235"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:31:34.982577" elapsed="0.002516"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:31:34.985528" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:31:34.986830" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:31:34.985266" elapsed="0.001979">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:31:35.001441" elapsed="0.000406"/>
</kw>
<msg time="2026-04-17T03:31:35.002112" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:34.999922" elapsed="0.002358"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:35.002454" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:35.002625" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:31:34.988231" elapsed="0.014478"/>
</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-04-17T03:31:34.987568" elapsed="0.015188"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:31:34.972746" elapsed="0.030096">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:35.003296" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:31:35.003380" 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="FAIL" start="2026-04-17T03:31:34.958741" elapsed="0.044765">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:31:35.003625" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:31:35.003671" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:34.953690" elapsed="0.050006"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:35.004322" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:35.003786" elapsed="0.000600"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:35.003764" elapsed="0.000652"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:31:34.953537" elapsed="0.050908"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:31:34.953359" elapsed="0.051121"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:31:34.950731" elapsed="0.053850"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:31:34.945054" elapsed="0.059587"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:34.944290" elapsed="0.060454"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:31:34.939501" elapsed="0.065303"/>
</kw>
<for flavor="IN ZIP">
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:31:35.005967" 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-04-17T03:31:35.005258" elapsed="0.000739"/>
</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-04-17T03:31:35.052665" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/ebgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:35.052234" elapsed="0.000465"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:31:35.053513" 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-04-17T03:31:35.053243" elapsed="0.000343">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-04-17T03:31:35.053682" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:31:35.052879" elapsed="0.000828"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:35.054288" 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-04-17T03:31:35.053879" elapsed="0.000437"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:31:35.054626" 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-04-17T03:31:35.054789" 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-04-17T03:31:35.054485" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:35.055245" 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-04-17T03:31:35.054994" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:35.056308" 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-04-17T03:31:35.056046" elapsed="0.000307"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:31:35.056802" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:31:35.056531" elapsed="0.000297"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:35.057520" 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-04-17T03:31:35.057220" elapsed="0.000326"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:35.058308" 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-04-17T03:31:35.058084" elapsed="0.000250"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:35.058386" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:31:35.058546" 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-04-17T03:31:35.057737" elapsed="0.000833"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:31:35.058730" elapsed="0.000252"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.2</var>
<status status="PASS" start="2026-04-17T03:31:35.057079" elapsed="0.001944"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:35.059575" 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-04-17T03:31:35.059274" elapsed="0.000326"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:35.060345" 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-04-17T03:31:35.060130" elapsed="0.000241"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:35.060421" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:31:35.060662" 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-04-17T03:31:35.059790" 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-04-17T03:31:35.060846" elapsed="0.000245"/>
</kw>
<var name="${key}">TYPE</var>
<var name="${value}">external</var>
<status status="PASS" start="2026-04-17T03:31:35.059135" elapsed="0.001997"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:35.061679" 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-04-17T03:31:35.061380" elapsed="0.000325"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:35.062444" 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-04-17T03:31:35.062233" elapsed="0.000237"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:35.062520" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:31:35.062670" 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-04-17T03:31:35.061893" elapsed="0.000802"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:31:35.062852" elapsed="0.000243"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:31:35.061242" elapsed="0.001895"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:35.063873" 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-04-17T03:31:35.063388" elapsed="0.000511"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:35.064660" 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-04-17T03:31:35.064431" elapsed="0.000255"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:35.064736" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:31:35.064889" 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-04-17T03:31:35.064104" elapsed="0.000809"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:31:35.065087" elapsed="0.000223"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-04-17T03:31:35.063251" elapsed="0.002100"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:35.065896" 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-04-17T03:31:35.065599" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:35.066655" 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-04-17T03:31:35.066445" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:35.066729" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:31:35.066877" 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-04-17T03:31:35.066124" 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-04-17T03:31:35.067079" elapsed="0.000222"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-04-17T03:31:35.065462" elapsed="0.001879"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:35.067887" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:31:35.067589" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:35.068754" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:31:35.068505" elapsed="0.000274"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:35.068829" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:31:35.068996" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:31:35.068174" elapsed="0.000848"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:31:35.069181" elapsed="0.000220"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:31:35.067451" elapsed="0.001990"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:31:35.070001" 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-04-17T03:31:35.069688" elapsed="0.000338"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:31:35.070746" 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-04-17T03:31:35.070536" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:31:35.070819" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:31:35.070986" 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-04-17T03:31:35.070212" 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-04-17T03:31:35.071214" elapsed="0.000220"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:31:35.069552" elapsed="0.001923"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:31:35.056881" elapsed="0.014628"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:31:35.071551" elapsed="0.000027"/>
</return>
<msg time="2026-04-17T03:31:35.071710" 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-04-17T03:31:35.055700" elapsed="0.016035"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:35.055369" elapsed="0.016399"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:35.071963" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:35.071793" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:35.055346" elapsed="0.016694"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:31:35.072894" 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-04-17T03:31:35.072188" elapsed="0.000749"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:31:35.072990" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:31:35.051542" elapsed="0.021574"/>
</kw>
<msg time="2026-04-17T03:31:35.073172" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:35.036433" elapsed="0.036789"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:31:35.086250" 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/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-04-17T03:31:35.099075" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:31:35.111722" elapsed="0.000035"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:35.111984" 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-04-17T03:31:35.112177" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:35.112723" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:35.112515" elapsed="0.000283"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:35.112490" 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-04-17T03:31:35.113020" 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-04-17T03:31:35.113198" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:35.113448" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:31:35.112435" elapsed="0.001067"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:31:35.112261" elapsed="0.001268"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:35.113681" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:35.113760" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:31:35.113918" 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-04-17T03:31:35.031536" elapsed="0.082426"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:35.115187" 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-04-17T03:31:35.114868" elapsed="0.000370"/>
</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-04-17T03:31:35.120485" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:31:35.322146" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:31:35.724920" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:31:35.737457" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:35.117523" elapsed="0.624800">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:31:35.115316" elapsed="0.627204">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:31:35.743056" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:35.742599" elapsed="0.000570"/>
</branch>
<status status="FAIL" start="2026-04-17T03:31:35.115293" elapsed="0.627913">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:31:35.743871" elapsed="0.000038"/>
</kw>
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:35.744010" elapsed="0.000029"/>
</return>
<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-04-17T03:31:35.114245" elapsed="0.630029">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:31:35.744413" elapsed="0.000032"/>
</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="FAIL" start="2026-04-17T03:31:35.006244" elapsed="0.738337">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<var name="${i}">2</var>
<var name="${type}">external</var>
<status status="FAIL" start="2026-04-17T03:31:35.005104" elapsed="0.739579">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</iter>
<var>${i}</var>
<var>${type}</var>
<value>${ODL_IP_INDICES_ALL}</value>
<value>${BGP_PEER_TYPES}</value>
<status status="FAIL" start="2026-04-17T03:31:35.004873" elapsed="0.739945">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</for>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="FAIL" start="2026-04-17T03:31:34.938566" elapsed="0.806549">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:31:35.746469" elapsed="0.000658"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-17T03:31:35.747604" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-17T03:31:35.747451" elapsed="0.000310"/>
</kw>
<doc>Suite teardown keyword</doc>
<status status="PASS" start="2026-04-17T03:31:35.746074" elapsed="0.001792"/>
</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-04-17T03:31:03.385314" elapsed="32.362646"/>
</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-04-17T03:31:35.842702" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:31:35.838218" elapsed="0.004546"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-17T03:31:35.837976" elapsed="0.004865"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-17T03:31:35.847716" 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-04-17T03:31:35.844007" elapsed="0.003741"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-17T03:31:35.847985" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:35.847837" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:35.847813" elapsed="0.000249"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:31:35.848602" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:31:35.848226" elapsed="0.000421"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-17T03:31:35.849247" 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-04-17T03:31:35.848894" elapsed="0.000381"/>
</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-04-17T03:31:35.849791" elapsed="0.000307"/>
</kw>
<msg time="2026-04-17T03:31:35.850198" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:31:35.850244" level="INFO">${possibly_int_of_members} = 1</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:35.849447" elapsed="0.000819"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:35.850888" 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-04-17T03:31:35.850512" elapsed="0.000402"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:31:35.851946" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:31:35.851662" elapsed="0.000312"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:31:35.852383" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:31:35.852125" elapsed="0.000285"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:31:35.852911" 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-04-17T03:31:35.852569" elapsed="0.000386"/>
</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-04-17T03:31:35.857407" elapsed="0.000295"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:31:35.858462" level="INFO">${member_ip} = 10.30.170.120</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:35.857925" elapsed="0.000577"/>
</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-04-17T03:31:35.858721" elapsed="0.000351"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:31:35.860220" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:35.859774" elapsed="0.000483"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-17T03:31:35.860325" elapsed="0.000049"/>
</return>
<msg time="2026-04-17T03:31:35.860551" 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-04-17T03:31:35.859355" elapsed="0.001259"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:31:35.861740" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.120:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a4416115410&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-04-17T03:31:35.860918" elapsed="0.001036"/>
</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-04-17T03:31:35.862131" elapsed="0.000226"/>
</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-04-17T03:31:35.856566" elapsed="0.005859"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:31:35.856307" elapsed="0.006162"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-04-17T03:31:35.853026" elapsed="0.009477"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:31:35.863213" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:31:35.862670" elapsed="0.000591"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:31:35.863917" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.120'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:31:35.863493" elapsed="0.000489"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:31:35.864546" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:31:35.864150" elapsed="0.000440"/>
</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-04-17T03:31:35.851198" elapsed="0.013452"/>
</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-04-17T03:31:35.843635" elapsed="0.021073"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:35.864957" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:35.864815" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:35.864791" elapsed="0.000256"/>
</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-04-17T03:31:35.868640" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:31:35.868247" elapsed="0.000420"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:31:35.869168" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:31:35.868848" elapsed="0.000346"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:31:35.869295" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:31:35.869459" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:31:35.867864" elapsed="0.001622"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:35.870585" level="INFO">${member_ip} = 10.30.170.120</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-04-17T03:31:35.870306" elapsed="0.000306"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:35.871409" 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-04-17T03:31:35.871513" 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-04-17T03:31:35.871243" elapsed="0.000297"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:35.875147" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:35.874465" elapsed="0.000773"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:35.874444" elapsed="0.000834"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:35.875944" 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-04-17T03:31:35.876195" 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-04-17T03:31:35.875481" elapsed="0.000766"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:35.877242" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.120" 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-04-17T03:31:35.876514" elapsed="0.000836"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:35.878560" 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-04-17T03:31:35.877620" elapsed="0.000992"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-17T03:31:35.880660" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:31:35.880917" 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-04-17T03:31:35.880100" elapsed="0.000894"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:35.881513" elapsed="0.000811"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:31:35.884473" level="INFO">Logging into '10.30.170.120:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:31:36.205095" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 17 03:31:03 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:31:07 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:31:35.883691" elapsed="0.321621"/>
</kw>
<msg time="2026-04-17T03:31:36.205435" 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-04-17T03:31:35.882854" elapsed="0.322788"/>
</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-04-17T03:31:35.879120" elapsed="0.326710"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:31:36.207065" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-17T03:31:36.220182" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-17T03:31:36.220643" level="INFO">${stdout} = </msg>
<msg time="2026-04-17T03:31:36.220990" 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-04-17T03:31:36.206406" elapsed="0.014961"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:31:36.222239" elapsed="0.001325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:36.226880" 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-04-17T03:31:36.225225" elapsed="0.001964"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-17T03:31:36.228337" elapsed="0.000163"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:36.227661" elapsed="0.001126"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:36.227589" elapsed="0.001458"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:31:36.230073" elapsed="0.000088"/>
</return>
<status status="PASS" start="2026-04-17T03:31:36.229326" elapsed="0.000943"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:36.229268" elapsed="0.001062"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-17T03:31:36.230421" elapsed="0.000022"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:36.234110" 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-04-17T03:31:36.234892" elapsed="0.000326"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:31:36.235482" elapsed="0.000228"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:31:36.231105" elapsed="0.004677"/>
</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-04-17T03:31:35.873463" elapsed="0.362510"/>
</kw>
<msg time="2026-04-17T03:31:36.236034" 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-04-17T03:31:35.872774" elapsed="0.363322"/>
</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-04-17T03:31:35.872232" elapsed="0.363947"/>
</kw>
<msg time="2026-04-17T03:31:36.236221" 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-04-17T03:31:35.871698" elapsed="0.364570"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:36.238965" elapsed="0.000326"/>
</kw>
<kw name="Open 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-04-17T03:31:36.239454" elapsed="0.000146"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:31:36.239747" 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-04-17T03:31:36.236568" elapsed="0.003327"/>
</kw>
<msg time="2026-04-17T03:31:36.240008" 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-04-17T03:31:35.870834" elapsed="0.369200"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:36.240497" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:36.240242" elapsed="0.000297"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-17T03:31:36.240584" elapsed="0.000030"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-17T03:31:35.869892" elapsed="0.370820"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:31:35.869712" elapsed="0.371038"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:31:35.869554" elapsed="0.371233"/>
</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-04-17T03:31:35.865363" elapsed="0.375532"/>
</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-04-17T03:31:36.241069" elapsed="0.000216"/>
</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-04-17T03:31:36.255111" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:36.254987" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:36.254965" elapsed="0.000220"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:36.255503" 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-04-17T03:31:36.255685" 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-04-17T03:31:36.255351" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:36.256167" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:36.255869" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:36.256615" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:36.256368" elapsed="0.000292"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:36.257503" 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-04-17T03:31:36.257270" elapsed="0.000340">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-17T03:31:36.257719" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:31:36.257765" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:36.256821" elapsed="0.000967"/>
</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-04-17T03:31:36.258111" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:36.257864" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:36.257846" elapsed="0.000367"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:36.259009" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:31:36.258702" elapsed="0.000337"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:31:36.259088" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:31:36.259244" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:31:36.258423" elapsed="0.000846"/>
</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-04-17T03:31:36.259421" elapsed="0.000415"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:36.260130" level="INFO">index=4
host=10.30.170.120
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-04-17T03:31:36.260233" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.120
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-04-17T03:31:36.260020" elapsed="0.000240"/>
</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-04-17T03:31:36.260408" elapsed="0.002190"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:31:36.263043" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:31:36.264321" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:31:36.262762" elapsed="0.002109">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:36.268165" elapsed="0.000363"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-17T03:31:36.268692" elapsed="0.000205"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:31:36.269070" 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-04-17T03:31:36.265779" elapsed="0.003444"/>
</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-04-17T03:31:36.265231" elapsed="0.004036"/>
</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="FAIL" start="2026-04-17T03:31:36.254655" elapsed="0.014700">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:31:37.289073" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:37.288903" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:37.288875" elapsed="0.000318"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:37.289592" 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-04-17T03:31:37.289864" 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-04-17T03:31:37.289397" elapsed="0.000506"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:37.290527" 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-04-17T03:31:37.290135" elapsed="0.000455"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:37.291131" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:37.290770" elapsed="0.000411"/>
</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-04-17T03:31:37.291805" elapsed="0.000220"/>
</kw>
<msg time="2026-04-17T03:31:37.292139" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:31:37.292197" level="INFO">${old_connection_index} = 4</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:37.291355" elapsed="0.000868"/>
</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-04-17T03:31:37.293217" elapsed="0.000194"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:31:37.294388" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:31:37.294130" elapsed="0.000861">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:37.293614" elapsed="0.001445"/>
</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-04-17T03:31:37.295636" elapsed="0.000113"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:37.295233" elapsed="0.000566"/>
</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-04-17T03:31:37.292536" elapsed="0.003309"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:37.292305" elapsed="0.003590"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:37.292284" elapsed="0.003657"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:37.296762" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:31:37.296479" elapsed="0.000310"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:31:37.296841" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:31:37.297024" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:31:37.296178" elapsed="0.000873"/>
</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-04-17T03:31:37.297239" elapsed="0.000503"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:37.298089" level="INFO">index=6
host=10.30.170.120
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-04-17T03:31:37.298222" level="INFO">${karaf_connection_object} = index=6
host=10.30.170.120
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-04-17T03:31:37.297953" elapsed="0.000297"/>
</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-04-17T03:31:37.298405" elapsed="0.002620"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:31:37.301557" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:31:37.302970" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:31:37.301220" elapsed="0.002416">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:37.306847" elapsed="0.000462"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-17T03:31:37.307483" elapsed="0.000186"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:31:37.307829" elapsed="0.000137"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:31:37.304589" elapsed="0.003435"/>
</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-04-17T03:31:37.303997" elapsed="0.004082"/>
</kw>
<arg>member_index=${index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for ${member_index},
close the previous connection. In any case create a new connection
to karaf console for ${member_index}, set correct prompt set and login to karaf console.
Store connection index for ${member_index} and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:31:37.288465" elapsed="0.019970">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:31:38.325657" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:38.325509" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:38.325480" elapsed="0.000269"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:38.326170" 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-04-17T03:31:38.326311" 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-04-17T03:31:38.325976" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:38.326817" level="INFO">{1: 6}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:38.326499" elapsed="0.000373"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:38.327343" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:38.327081" elapsed="0.000309"/>
</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-04-17T03:31:38.328055" elapsed="0.000203"/>
</kw>
<msg time="2026-04-17T03:31:38.328361" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:31:38.328407" level="INFO">${old_connection_index} = 6</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:38.327556" elapsed="0.000873"/>
</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-04-17T03:31:38.329266" elapsed="0.000185"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:31:38.330175" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:31:38.329988" elapsed="0.000713">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:38.329637" elapsed="0.001128"/>
</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-04-17T03:31:38.331282" elapsed="0.000101"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:38.330948" elapsed="0.000482"/>
</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-04-17T03:31:38.328731" elapsed="0.002743"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:38.328504" elapsed="0.003019"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:38.328486" elapsed="0.003062"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:38.332362" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:31:38.332075" elapsed="0.000314"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:31:38.332439" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:31:38.332598" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:31:38.331770" elapsed="0.000852"/>
</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-04-17T03:31:38.332782" elapsed="0.000446"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:38.333601" level="INFO">index=8
host=10.30.170.120
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-04-17T03:31:38.333709" level="INFO">${karaf_connection_object} = index=8
host=10.30.170.120
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-04-17T03:31:38.333465" elapsed="0.000270"/>
</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-04-17T03:31:38.333883" elapsed="0.002441"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:31:38.336758" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:31:38.337911" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:31:38.336490" elapsed="0.001897">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:38.341569" elapsed="0.000375"/>
</kw>
<kw name="Open 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-04-17T03:31:38.342107" elapsed="0.000154"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:31:38.342407" elapsed="0.000100"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:31:38.339399" elapsed="0.003159"/>
</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-04-17T03:31:38.338709" elapsed="0.003895"/>
</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="FAIL" start="2026-04-17T03:31:38.325042" elapsed="0.017647">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:31:39.362826" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:39.362678" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:39.362649" elapsed="0.000293"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:39.363368" 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-04-17T03:31:39.363498" 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-04-17T03:31:39.363144" elapsed="0.000381"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:39.364069" level="INFO">{1: 8}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:39.363725" elapsed="0.000393"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:39.364568" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:39.364301" elapsed="0.000314"/>
</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-04-17T03:31:39.365236" elapsed="0.000226"/>
</kw>
<msg time="2026-04-17T03:31:39.365568" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:31:39.365616" level="INFO">${old_connection_index} = 8</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:39.364784" elapsed="0.000874"/>
</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-04-17T03:31:39.366593" elapsed="0.000148"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:31:39.367494" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:31:39.367289" elapsed="0.000787">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:39.366908" elapsed="0.001235"/>
</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-04-17T03:31:39.368690" elapsed="0.000106"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:39.368343" elapsed="0.000501"/>
</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-04-17T03:31:39.366016" elapsed="0.002873"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:39.365739" elapsed="0.003215"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:39.365720" elapsed="0.003261"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:39.369906" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:31:39.369528" elapsed="0.000425"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:31:39.370004" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:31:39.370173" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:31:39.369196" elapsed="0.001002"/>
</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-04-17T03:31:39.370369" elapsed="0.000418"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:39.371078" level="INFO">index=10
host=10.30.170.120
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-04-17T03:31:39.371179" level="INFO">${karaf_connection_object} = index=10
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:31:39.370969" elapsed="0.000295"/>
</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-04-17T03:31:39.371417" elapsed="0.003737"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:31:39.375593" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:31:39.377085" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:31:39.375325" elapsed="0.002383">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:39.381511" elapsed="0.000531"/>
</kw>
<kw name="Open 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-04-17T03:31:39.382272" elapsed="0.000207"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:31:39.382682" elapsed="0.000185"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:31:39.378588" elapsed="0.004395"/>
</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-04-17T03:31:39.378041" elapsed="0.005011"/>
</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="FAIL" start="2026-04-17T03:31:39.362220" elapsed="0.020951">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:31:39.383295" level="FAIL">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<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="FAIL" start="2026-04-17T03:31:36.242046" elapsed="3.141379">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:36.241635" elapsed="3.141880"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:31:36.241495" elapsed="3.142076"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-04-17T03:31:36.241344" elapsed="3.142274"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-17T03:31:35.843171" elapsed="3.540523"/>
</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-04-17T03:31:39.387248" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:39.387122" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:39.387095" elapsed="0.000228"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:39.392545" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:39.392414" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:39.392394" elapsed="0.000246"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:39.393772" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:31:39.393318" elapsed="0.000483"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:31:39.394287" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:31:39.393980" elapsed="0.000333"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:31:39.394359" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:31:39.394523" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:31:39.392968" elapsed="0.001580"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:39.400245" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:39.400130" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:39.400110" elapsed="0.000205"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:31:39.401608" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:39.401477" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:39.401459" elapsed="0.000260"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:39.402281" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:31:39.401879" elapsed="0.000495"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:39.402773" 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-04-17T03:31:39.402540" elapsed="0.000260"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:31:39.404119" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:31:39.403597" elapsed="0.001281">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:31:39.405040" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:31:39.405087" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:39.403028" elapsed="0.002083"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:31:39.406246" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:31:39.405819" elapsed="0.001223">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:31:39.407180" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:31:39.407226" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:39.405282" elapsed="0.001968"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:31:39.408238" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/bgp_policies_default.robot"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:31:39.407564" elapsed="0.000756">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/bgp_policies_default.robot"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:31:39.407324" elapsed="0.001136">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/bgp_policies_default.robot"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:31:39.407305" elapsed="0.001191">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/bgp_policies_default.robot"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:39.408661" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:39.408887" elapsed="0.000066"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:39.408748" elapsed="0.000337"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:31:39.408731" elapsed="0.000391"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:31:39.409164" elapsed="0.000021"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:39.411496" elapsed="0.000462"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-17T03:31:39.412302" elapsed="0.000298"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:31:39.412990" elapsed="0.000250"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:31:39.410671" elapsed="0.002661"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:31:39.409741" elapsed="0.003728"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:31:39.401183" elapsed="0.012380">Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/bgp_policies_default.robot"</status>
</kw>
<msg time="2026-04-17T03:31:39.413732" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:31:39.413790" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting suite /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/bgp_policies_default.robot"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:39.400470" elapsed="0.013346"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:31:39.414027" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:39.413897" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:39.413878" elapsed="0.000217"/>
</if>
<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-04-17T03:31:39.414860" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:39.414754" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:39.414736" elapsed="0.000294"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:39.415529" 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-04-17T03:31:39.415691" 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-04-17T03:31:39.415195" elapsed="0.000524"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:39.416172" level="INFO">{1: 10}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:39.415874" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:39.416671" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:39.416401" elapsed="0.000326"/>
</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-04-17T03:31:39.417480" elapsed="0.000473"/>
</kw>
<msg time="2026-04-17T03:31:39.418096" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:31:39.418151" level="INFO">${old_connection_index} = 10</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:39.416958" elapsed="0.001235"/>
</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-04-17T03:31:39.419628" elapsed="0.000291"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:31:39.421714" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:31:39.421331" elapsed="0.000938">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:39.420262" elapsed="0.002103"/>
</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-04-17T03:31:39.423532" elapsed="0.000203"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:39.422612" elapsed="0.001197"/>
</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-04-17T03:31:39.418582" elapsed="0.005312"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:39.418324" elapsed="0.005640"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:39.418292" elapsed="0.005704"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:31:39.425073" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:31:39.424577" elapsed="0.000533"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:31:39.425181" elapsed="0.000049"/>
</return>
<msg time="2026-04-17T03:31:39.425381" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:31:39.424263" elapsed="0.001145"/>
</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-04-17T03:31:39.425569" elapsed="0.000534"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:39.426502" level="INFO">index=13
host=10.30.170.120
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-04-17T03:31:39.426648" level="INFO">${karaf_connection_object} = index=13
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:31:39.426331" elapsed="0.000357"/>
</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-04-17T03:31:39.426895" elapsed="0.002642"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:31:39.430134" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:31:39.431510" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:31:39.429774" elapsed="0.002342">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:39.437167" elapsed="0.000936"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-17T03:31:39.438385" elapsed="0.000441"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:31:39.439063" elapsed="0.000190"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:31:39.433372" elapsed="0.005968"/>
</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-04-17T03:31:39.432572" elapsed="0.006818"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:31:39.414508" elapsed="0.025050">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:39.439972" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:31:39.440052" elapsed="0.000023"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:31:39.399798" elapsed="0.040373">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:31:39.440290" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:31:39.440336" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:39.394944" elapsed="0.045417"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:39.440710" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:31:39.440447" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:39.440427" elapsed="0.000364"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:31:39.394786" elapsed="0.046031"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:31:39.394607" elapsed="0.046244"/>
</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-04-17T03:31:39.392102" elapsed="0.048808"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-17T03:31:39.384592" elapsed="0.056396"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:39.383918" elapsed="0.057115"/>
</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-04-17T03:31:35.837629" elapsed="3.603458"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:31:39.441599" level="INFO">${conn_id} = 15</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-04-17T03:31:39.441238" elapsed="0.000387"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:31:39.442247" level="INFO">${conn_id} = 15</msg>
<arg>${conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:31:39.441883" elapsed="0.000408"/>
</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-04-17T03:31:39.444111" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:31:39.444209" 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-04-17T03:31:39.443780" elapsed="0.000459"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:39.444399" elapsed="0.000350"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:31:39.445965" level="INFO">Logging into '10.30.170.120:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:31:39.785953" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 17 03:31:03 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:31:36 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:31:39.445471" elapsed="0.340704"/>
</kw>
<msg time="2026-04-17T03:31:39.786297" 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-04-17T03:31:39.444996" elapsed="0.341414"/>
</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-04-17T03:31:39.443284" elapsed="0.343275"/>
</kw>
<msg time="2026-04-17T03:31:39.786630" 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-04-17T03:31:39.442846" elapsed="0.343848"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-17T03:31:39.442496" elapsed="0.344307"/>
</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-04-17T03:31:39.795795" level="INFO">${cd_and_command} = cd '.' &amp;&amp; virtualenv /tmp/defaultvenv</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:39.795299" elapsed="0.000543"/>
</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-04-17T03:31:39.797740" level="INFO">Executing command 'cd '.' &amp;&amp; virtualenv /tmp/defaultvenv'.</msg>
<msg time="2026-04-17T03:31:40.066758" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:31:40.067174" level="INFO">${stdout} = created virtual environment CPython3.10.12.final.0-64 in 117ms
  creator CPython3Posix(dest=/tmp/defaultvenv, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=b...</msg>
<msg time="2026-04-17T03:31:40.067265" level="INFO">${stderr} = </msg>
<msg time="2026-04-17T03:31:40.067345" 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-04-17T03:31:39.797506" elapsed="0.269887"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:31:40.069052" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-04-17T03:31:40.068571" elapsed="0.000550"/>
</kw>
<msg time="2026-04-17T03:31:40.069220" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-04-17T03:31:40.069265" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:31:40.067867" elapsed="0.001420"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:31:40.069976" 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-04-17T03:31:40.069461" elapsed="0.000543"/>
</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-04-17T03:31:40.071437" level="INFO">created virtual environment CPython3.10.12.final.0-64 in 117ms
  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-04-17T03:31:40.071178" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:40.071878" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:40.071636" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:31:40.072325" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:31:40.072086" elapsed="0.000284"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-04-17T03:31:40.070743" elapsed="0.001683"/>
</kw>
<status status="PASS" start="2026-04-17T03:31:40.070107" elapsed="0.002356"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:40.070072" elapsed="0.002420"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-04-17T03:31:40.072658" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:31:40.072550" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:40.072533" elapsed="0.000196"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:31:40.072870" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-17T03:31:40.072779" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-17T03:31:40.072764" elapsed="0.000216"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:31:40.073133" elapsed="0.000021"/>
</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-04-17T03:31:39.796849" elapsed="0.276407"/>
</kw>
<msg time="2026-04-17T03:31:40.073316" 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-04-17T03:31:39.796111" elapsed="0.277259"/>
</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-04-17T03:31:39.794425" elapsed="0.279065"/>
</kw>
<msg time="2026-04-17T03:31:40.073547" 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-04-17T03:31:39.788423" elapsed="0.285169"/>
</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-04-17T03:31:39.787888" elapsed="0.285812"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${upgrade_pip}</arg>
<arg>Virtual_Env_Run_Cmd_At_Cwd</arg>
<arg>pip install --upgrade pip</arg>
<arg>stderr_must_be_empty=False</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:40.073952" elapsed="0.000404"/>
</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-04-17T03:31:39.787332" elapsed="0.287097"/>
</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-04-17T03:31:40.081916" level="INFO">${cd_and_command} = cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install exabgp==4.0.5; deactivate</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:31:40.081541" elapsed="0.000421"/>
</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-04-17T03:31:40.083774" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install exabgp==4.0.5; deactivate'.</msg>
<msg time="2026-04-17T03:32:04.331998" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:32:04.332802" level="INFO">${stdout} = Collecting exabgp==4.0.5
  Downloading exabgp-4.0.5-py3-none-any.whl (551 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 551.8/551.8 KB 9.8 MB/s eta 0:00:00
Installing collected packages: exabgp
Suc...</msg>
<msg time="2026-04-17T03:32:04.332970" level="INFO">${stderr} = </msg>
<msg time="2026-04-17T03:32:04.333079" 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-04-17T03:31:40.083413" elapsed="24.249724"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:32:04.337955" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-04-17T03:32:04.337073" elapsed="0.001074"/>
</kw>
<msg time="2026-04-17T03:32:04.338419" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-04-17T03:32:04.338499" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:32:04.334023" elapsed="0.004516"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:32:04.340569" 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-04-17T03:32:04.338965" elapsed="0.001648"/>
</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-04-17T03:32:04.342981" level="INFO">Collecting exabgp==4.0.5
  Downloading exabgp-4.0.5-py3-none-any.whl (551 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 551.8/551.8 KB 9.8 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-04-17T03:32:04.342597" elapsed="0.000462"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:04.343681" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:32:04.343359" elapsed="0.000387"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:04.344402" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:32:04.344058" elapsed="0.000413"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-04-17T03:32:04.341653" elapsed="0.002890"/>
</kw>
<status status="PASS" start="2026-04-17T03:32:04.340825" elapsed="0.003812"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:04.340791" elapsed="0.003875"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-04-17T03:32:04.344881" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:32:04.344725" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:04.344708" elapsed="0.000316"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:32:04.345214" elapsed="0.000045"/>
</return>
<status status="PASS" start="2026-04-17T03:32:04.345077" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:04.345062" elapsed="0.000306"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:04.345517" elapsed="0.000023"/>
</kw>
<arg>${cd_and_command}</arg>
<arg>return_success_only=False</arg>
<arg>log_on_success=${log_on_success}</arg>
<arg>log_on_failure=${log_on_failure}</arg>
<arg>stderr_must_be_empty=${stderr_must_be_empty}</arg>
<doc>Execute command via the active SSH connection. For success, rc has to be zero and optionally stderr has to be empty.
Log everything, depending on arguments and success. Return either success string or stdout.
TODO: Do we want to support customizing return values the same way as SSHLibrary.Execute_Command does?</doc>
<status status="PASS" start="2026-04-17T03:31:40.082778" elapsed="24.262882"/>
</kw>
<msg time="2026-04-17T03:32:04.345719" 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-04-17T03:31:40.082125" elapsed="24.263652"/>
</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-04-17T03:31:40.080906" elapsed="24.264967"/>
</kw>
<msg time="2026-04-17T03:32:04.346116" 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-04-17T03:31:40.076808" elapsed="24.269361"/>
</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-04-17T03:31:40.076259" elapsed="24.270004"/>
</kw>
<msg time="2026-04-17T03:32:04.346313" 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-04-17T03:31:40.075854" elapsed="24.270504"/>
</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-04-17T03:31:40.075297" elapsed="24.271149"/>
</kw>
<msg time="2026-04-17T03:32:04.346490" 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-04-17T03:31:40.074901" elapsed="24.271632"/>
</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-04-17T03:31:40.074640" elapsed="24.271974"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:32:04.347134" level="INFO">Creating Session using : alias=config-session, url=http://10.30.170.120:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a4416509590&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-04-17T03:32:04.346799" elapsed="0.000515"/>
</kw>
<kw name="Upload_Config_Files">
<for flavor="IN">
<iter>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-04-17T03:32:04.376472" level="INFO">[chan 3] Opened sftp connection (server version 3)</msg>
<msg time="2026-04-17T03:32:04.386427" 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-04-17T03:32:04.347955" elapsed="0.038613"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:32:04.347799" elapsed="0.038879"/>
</iter>
<iter>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-04-17T03:32:04.396286" 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-04-17T03:32:04.387542" elapsed="0.008874"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-17T03:32:04.387167" elapsed="0.009329"/>
</iter>
<iter>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-04-17T03:32:04.404503" 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-04-17T03:32:04.397056" elapsed="0.007539"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-17T03:32:04.396688" elapsed="0.007976"/>
</iter>
<iter>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-04-17T03:32:04.412379" 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-04-17T03:32:04.405217" elapsed="0.007251"/>
</kw>
<var name="${index}">4</var>
<status status="PASS" start="2026-04-17T03:32:04.404794" elapsed="0.007732"/>
</iter>
<iter>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-04-17T03:32:04.419290" 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-04-17T03:32:04.412868" elapsed="0.006510"/>
</kw>
<var name="${index}">5</var>
<status status="PASS" start="2026-04-17T03:32:04.412654" elapsed="0.006779"/>
</iter>
<iter>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-04-17T03:32:04.427870" 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-04-17T03:32:04.419756" elapsed="0.008228"/>
</kw>
<var name="${index}">6</var>
<status status="PASS" start="2026-04-17T03:32:04.419557" elapsed="0.008487"/>
</iter>
<var>${index}</var>
<value>@{NUMBERS}</value>
<status status="PASS" start="2026-04-17T03:32:04.347659" elapsed="0.080428"/>
</for>
<kw name="List Files In Directory" owner="SSHLibrary">
<msg time="2026-04-17T03:32:04.437442" 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-04-17T03:32:04.437622" 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-04-17T03:32:04.428352" elapsed="0.009310"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:32:04.438464" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.120/g' exa4.cfg'.</msg>
<msg time="2026-04-17T03:32:04.451670" 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-04-17T03:32:04.438219" elapsed="0.013626"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:32:04.452890" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exa4.cfg'.</msg>
<msg time="2026-04-17T03:32:04.502958" 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-04-17T03:32:04.452520" elapsed="0.050607"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:32:04.503771" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exa4.cfg'.</msg>
<msg time="2026-04-17T03:32:04.554540" 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-04-17T03:32:04.503490" elapsed="0.051221"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:32:04.555344" level="INFO">Executing command 'cat exa4.cfg'.</msg>
<msg time="2026-04-17T03:32:04.606612" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:32:04.606954" 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-04-17T03:32:04.555075" elapsed="0.051930"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:04.607914" 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-04-17T03:32:04.607404" elapsed="0.000607"/>
</kw>
<var name="${cfgfile}">exa4.cfg</var>
<status status="PASS" start="2026-04-17T03:32:04.438018" elapsed="0.170046"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:32:04.608749" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.120/g' exabgp1.cfg'.</msg>
<msg time="2026-04-17T03:32:04.662172" 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-04-17T03:32:04.608495" elapsed="0.053931"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:32:04.663565" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exabgp1.cfg'.</msg>
<msg time="2026-04-17T03:32:04.714729" 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-04-17T03:32:04.663030" elapsed="0.051840"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:32:04.715552" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exabgp1.cfg'.</msg>
<msg time="2026-04-17T03:32:04.766662" 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-04-17T03:32:04.715245" elapsed="0.051653"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:32:04.768030" level="INFO">Executing command 'cat exabgp1.cfg'.</msg>
<msg time="2026-04-17T03:32:04.818887" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:32:04.819235" level="INFO">${stdout} = neighbor 10.30.170.120 {
    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-04-17T03:32:04.767494" elapsed="0.051806"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:04.820602" level="INFO">neighbor 10.30.170.120 {
    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-04-17T03:32:04.819799" elapsed="0.000918"/>
</kw>
<var name="${cfgfile}">exabgp1.cfg</var>
<status status="PASS" start="2026-04-17T03:32:04.608246" elapsed="0.212553"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:32:04.821858" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.120/g' exabgp2.cfg'.</msg>
<msg time="2026-04-17T03:32:04.867245" 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-04-17T03:32:04.821471" elapsed="0.046091"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:32:04.870498" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exabgp2.cfg'.</msg>
<msg time="2026-04-17T03:32:04.918506" 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-04-17T03:32:04.868292" elapsed="0.050514"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:32:04.919890" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exabgp2.cfg'.</msg>
<msg time="2026-04-17T03:32:04.974994" 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-04-17T03:32:04.919382" elapsed="0.055801"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:32:04.975915" level="INFO">Executing command 'cat exabgp2.cfg'.</msg>
<msg time="2026-04-17T03:32:05.031141" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:32:05.031589" level="INFO">${stdout} = neighbor 10.30.170.120 {
    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-04-17T03:32:04.975562" elapsed="0.056100"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:05.033203" level="INFO">neighbor 10.30.170.120 {
    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-04-17T03:32:05.032273" elapsed="0.001214"/>
</kw>
<var name="${cfgfile}">exabgp2.cfg</var>
<status status="PASS" start="2026-04-17T03:32:04.821131" elapsed="0.212478"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:32:05.034992" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.120/g' exabgp3.cfg'.</msg>
<msg time="2026-04-17T03:32:05.079896" 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-04-17T03:32:05.034437" elapsed="0.045833"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:32:05.081511" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exabgp3.cfg'.</msg>
<msg time="2026-04-17T03:32:05.131096" 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-04-17T03:32:05.080989" elapsed="0.050418"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:32:05.132618" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exabgp3.cfg'.</msg>
<msg time="2026-04-17T03:32:05.183269" 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-04-17T03:32:05.132078" elapsed="0.051436"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:32:05.184809" level="INFO">Executing command 'cat exabgp3.cfg'.</msg>
<msg time="2026-04-17T03:32:05.235289" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:32:05.235682" level="INFO">${stdout} = neighbor 10.30.170.120 {
    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-04-17T03:32:05.184202" elapsed="0.051573"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:05.237581" level="INFO">neighbor 10.30.170.120 {
    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-04-17T03:32:05.236506" elapsed="0.001266"/>
</kw>
<var name="${cfgfile}">exabgp3.cfg</var>
<status status="PASS" start="2026-04-17T03:32:05.033978" elapsed="0.204018"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:32:05.239333" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.120/g' exabgp4.cfg'.</msg>
<msg time="2026-04-17T03:32:05.284918" 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-04-17T03:32:05.238830" elapsed="0.046377"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:32:05.286089" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exabgp4.cfg'.</msg>
<msg time="2026-04-17T03:32:05.335113" 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-04-17T03:32:05.285669" elapsed="0.049642"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:32:05.336065" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exabgp4.cfg'.</msg>
<msg time="2026-04-17T03:32:05.386376" 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-04-17T03:32:05.335733" elapsed="0.050861"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:32:05.387541" level="INFO">Executing command 'cat exabgp4.cfg'.</msg>
<msg time="2026-04-17T03:32:05.440862" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:32:05.441144" level="INFO">${stdout} = neighbor 10.30.170.120 {
    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-04-17T03:32:05.387133" elapsed="0.054052"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:05.442045" level="INFO">neighbor 10.30.170.120 {
    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-04-17T03:32:05.441533" elapsed="0.000584"/>
</kw>
<var name="${cfgfile}">exabgp4.cfg</var>
<status status="PASS" start="2026-04-17T03:32:05.238372" elapsed="0.203797"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:32:05.442796" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.120/g' exabgp5.cfg'.</msg>
<msg time="2026-04-17T03:32:05.490894" 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-04-17T03:32:05.442557" elapsed="0.048547"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:32:05.491805" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exabgp5.cfg'.</msg>
<msg time="2026-04-17T03:32:05.542596" 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-04-17T03:32:05.491486" elapsed="0.051295"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:32:05.543664" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exabgp5.cfg'.</msg>
<msg time="2026-04-17T03:32:05.594487" 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-04-17T03:32:05.543281" elapsed="0.051406"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:32:05.595752" level="INFO">Executing command 'cat exabgp5.cfg'.</msg>
<msg time="2026-04-17T03:32:05.651044" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:32:05.651369" level="INFO">${stdout} = neighbor 10.30.170.120 {
    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-04-17T03:32:05.595305" elapsed="0.056259"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:05.653003" level="INFO">neighbor 10.30.170.120 {
    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-04-17T03:32:05.652149" elapsed="0.000970"/>
</kw>
<var name="${cfgfile}">exabgp5.cfg</var>
<status status="PASS" start="2026-04-17T03:32:05.442344" elapsed="0.210854"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:32:05.654222" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.120/g' exabgp6.cfg'.</msg>
<msg time="2026-04-17T03:32:05.698529" 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-04-17T03:32:05.653810" elapsed="0.044927"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:32:05.699580" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exabgp6.cfg'.</msg>
<msg time="2026-04-17T03:32:05.754249" 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-04-17T03:32:05.699214" elapsed="0.055225"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:32:05.755206" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exabgp6.cfg'.</msg>
<msg time="2026-04-17T03:32:05.802439" 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-04-17T03:32:05.754833" elapsed="0.047795"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:32:05.803399" level="INFO">Executing command 'cat exabgp6.cfg'.</msg>
<msg time="2026-04-17T03:32:05.850452" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:32:05.850809" level="INFO">${stdout} = neighbor 10.30.170.120 {
    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-04-17T03:32:05.803102" elapsed="0.047774"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:05.852443" level="INFO">neighbor 10.30.170.120 {
    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-04-17T03:32:05.851468" elapsed="0.001100"/>
</kw>
<var name="${cfgfile}">exabgp6.cfg</var>
<status status="PASS" start="2026-04-17T03:32:05.653463" elapsed="0.199245"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:32:05.853810" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.120/g' exabgp_graceful_restart.cfg'.</msg>
<msg time="2026-04-17T03:32:05.898603" 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-04-17T03:32:05.853408" elapsed="0.045453"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:32:05.899825" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exabgp_graceful_restart.cfg'.</msg>
<msg time="2026-04-17T03:32:05.946475" 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-04-17T03:32:05.899411" elapsed="0.047280"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:32:05.947800" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exabgp_graceful_restart.cfg'.</msg>
<msg time="2026-04-17T03:32:05.998116" 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-04-17T03:32:05.947269" elapsed="0.051083"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:32:05.999413" level="INFO">Executing command 'cat exabgp_graceful_restart.cfg'.</msg>
<msg time="2026-04-17T03:32:06.054012" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:32:06.054290" 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-04-17T03:32:05.998912" elapsed="0.055423"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:06.055592" 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-04-17T03:32:06.054755" elapsed="0.000919"/>
</kw>
<var name="${cfgfile}">exabgp_graceful_restart.cfg</var>
<status status="PASS" start="2026-04-17T03:32:05.853056" elapsed="0.202673"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:32:06.056618" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.120/g' exaipv4.cfg'.</msg>
<msg time="2026-04-17T03:32:06.102175" 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-04-17T03:32:06.056362" elapsed="0.046010"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:32:06.103332" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exaipv4.cfg'.</msg>
<msg time="2026-04-17T03:32:06.158861" 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-04-17T03:32:06.102826" elapsed="0.056349"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:32:06.160224" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exaipv4.cfg'.</msg>
<msg time="2026-04-17T03:32:06.212190" 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-04-17T03:32:06.159745" elapsed="0.052745"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:32:06.213472" level="INFO">Executing command 'cat exaipv4.cfg'.</msg>
<msg time="2026-04-17T03:32:06.262869" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:32:06.263272" level="INFO">${stdout} = neighbor 10.30.170.120 {
                  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-04-17T03:32:06.213116" elapsed="0.050224"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:06.264656" level="INFO">neighbor 10.30.170.120 {
                  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-04-17T03:32:06.263894" elapsed="0.000946"/>
</kw>
<var name="${cfgfile}">exaipv4.cfg</var>
<status status="PASS" start="2026-04-17T03:32:06.055919" elapsed="0.209039"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:32:06.266051" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.120/g' exaipv6.cfg'.</msg>
<msg time="2026-04-17T03:32:06.314972" 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-04-17T03:32:06.265611" elapsed="0.049616"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:32:06.316208" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exaipv6.cfg'.</msg>
<msg time="2026-04-17T03:32:06.370657" 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-04-17T03:32:06.315740" elapsed="0.055119"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:32:06.371576" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exaipv6.cfg'.</msg>
<msg time="2026-04-17T03:32:06.422469" 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-04-17T03:32:06.371272" elapsed="0.051377"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:32:06.423239" level="INFO">Executing command 'cat exaipv6.cfg'.</msg>
<msg time="2026-04-17T03:32:06.474586" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:32:06.474886" 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-04-17T03:32:06.422981" elapsed="0.052001"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:06.476041" 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-04-17T03:32:06.475454" elapsed="0.000714"/>
</kw>
<var name="${cfgfile}">exaipv6.cfg</var>
<status status="PASS" start="2026-04-17T03:32:06.265251" elapsed="0.211010"/>
</iter>
<var>${cfgfile}</var>
<value>@{cfgfiles}</value>
<status status="PASS" start="2026-04-17T03:32:04.437752" elapsed="2.038595"/>
</for>
<doc>Uploads exabgp config files and replaces variables within those
config files with desired values.</doc>
<status status="PASS" start="2026-04-17T03:32:04.347535" elapsed="2.128972"/>
</kw>
<doc>Suite setup keyword.</doc>
<status status="PASS" start="2026-04-17T03:31:35.837262" elapsed="30.639465"/>
</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-04-17T03:32:06.486248" elapsed="0.000355"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:32:06.485762" elapsed="0.000933"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:32:06.488123" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:32:06.487949" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:06.487898" elapsed="0.000327"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:32:06.493283" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:32:06.493170" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:06.493150" elapsed="0.000203"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:32:06.494475" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:32:06.494040" elapsed="0.000466"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:32:06.495007" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:32:06.494671" elapsed="0.000363"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:32:06.495081" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:32:06.495253" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:32:06.493596" elapsed="0.001682"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:32:06.501168" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:32:06.501047" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:06.501026" elapsed="0.000216"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:32:06.502608" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:32:06.502494" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:06.502476" elapsed="0.000203"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:32:06.503173" level="INFO">${karaf_connection_index} = 13</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:32:06.502829" elapsed="0.000372"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:32:06.503594" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:32:06.503366" elapsed="0.000256"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:32:06.504592" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:32:06.504155" elapsed="0.001196">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:32:06.505548" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:32:06.505600" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:32:06.503783" elapsed="0.001849"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:32:06.506663" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:32:06.506408" elapsed="0.001173">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:32:06.507778" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:32:06.507826" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:32:06.505860" elapsed="0.002003"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:32:06.508903" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Verify_Rib_Empty"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:32:06.508217" elapsed="0.000778">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Verify_Rib_Empty"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:32:06.507984" elapsed="0.001103">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Verify_Rib_Empty"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:32:06.507962" elapsed="0.001173">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Verify_Rib_Empty"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:06.509308" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:06.509539" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:06.509398" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:06.509380" elapsed="0.000239"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:32:06.509652" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:32:06.512387" elapsed="0.000159"/>
</kw>
<msg time="2026-04-17T03:32:06.512616" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:32:06.511224" 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-04-17T03:32:06.513092" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:06.513437" 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-04-17T03:32:06.510563" 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-04-17T03:32:06.509983" 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="FAIL" start="2026-04-17T03:32:06.502171" elapsed="0.011621">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Verify_Rib_Empty"</status>
</kw>
<msg time="2026-04-17T03:32:06.513907" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:32:06.514013" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Verify_Rib_Empty"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:32:06.501404" elapsed="0.012647"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:32:06.514321" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:32:06.514205" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:06.514182" elapsed="0.000213"/>
</if>
<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-04-17T03:32:06.515333" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:32:06.515210" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:06.515192" elapsed="0.000233"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:32:06.515743" level="INFO">index=15
host=10.30.170.120
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-04-17T03:32:06.515855" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
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-04-17T03:32:06.515606" elapsed="0.000278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:06.516387" level="INFO">{1: 13}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:32:06.516055" elapsed="0.000379"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:06.516997" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:32:06.516644" elapsed="0.000400"/>
</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-04-17T03:32:06.517667" elapsed="0.000308"/>
</kw>
<msg time="2026-04-17T03:32:06.518098" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:32:06.518149" level="INFO">${old_connection_index} = 13</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:32:06.517213" elapsed="0.000960"/>
</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-04-17T03:32:06.519178" elapsed="0.000205"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:32:06.520655" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:32:06.520060" elapsed="0.001650">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:32:06.519554" elapsed="0.002264"/>
</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-04-17T03:32:06.522588" elapsed="0.000432"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:32:06.522067" elapsed="0.001074"/>
</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-04-17T03:32:06.518478" elapsed="0.004731"/>
</kw>
<status status="PASS" start="2026-04-17T03:32:06.518252" elapsed="0.005015"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:06.518233" elapsed="0.005062"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:32:06.524249" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:32:06.523905" elapsed="0.000372"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:32:06.524328" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:32:06.524496" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:32:06.523546" elapsed="0.000977"/>
</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-04-17T03:32:06.524682" elapsed="0.000506"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:32:06.525475" level="INFO">index=16
host=10.30.170.120
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-04-17T03:32:06.525595" level="INFO">${karaf_connection_object} = index=16
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:32:06.525359" elapsed="0.000271"/>
</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-04-17T03:32:06.525832" elapsed="0.002367"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:32:06.528641" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:32:06.529855" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:32:06.528372" elapsed="0.001972">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:32:06.545372" elapsed="0.000436"/>
</kw>
<msg time="2026-04-17T03:32:06.546037" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:32:06.543706" elapsed="0.002505"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:06.546385" elapsed="0.000030"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:06.546574" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:32:06.531356" elapsed="0.015309"/>
</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-04-17T03:32:06.530671" elapsed="0.016045"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:32:06.514819" elapsed="0.031994">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:06.547256" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:32:06.547337" elapsed="0.000024"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:32:06.500508" elapsed="0.046953">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:32:06.547582" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:32:06.547630" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:32:06.495734" elapsed="0.051921"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:06.548247" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:06.547742" elapsed="0.000563"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:06.547721" elapsed="0.000610"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:32:06.495564" elapsed="0.052792"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:32:06.495340" elapsed="0.053052"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:32:06.492701" elapsed="0.055754"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:32:06.487514" elapsed="0.061002"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:32:06.486907" elapsed="0.061658"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:32:06.478578" elapsed="0.070046"/>
</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-04-17T03:32:06.607845" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:32:06.607394" elapsed="0.000486"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:06.608982" 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-04-17T03:32:06.608489" elapsed="0.000736">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-04-17T03:32:06.609328" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:06.608074" elapsed="0.001278"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:32:06.610044" 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-04-17T03:32:06.609518" elapsed="0.000554"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:32:06.610401" 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-04-17T03:32:06.610644" 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-04-17T03:32:06.610250" elapsed="0.000420"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:06.611167" 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-04-17T03:32:06.610870" elapsed="0.000359"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:06.612822" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:32:06.612423" elapsed="0.000488"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:32:06.613597" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:32:06.613286" elapsed="0.000352"/>
</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-04-17T03:32:06.614100" elapsed="0.000033"/>
</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-04-17T03:32:06.614389" 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-04-17T03:32:06.614643" elapsed="0.000024"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:32:06.613884" elapsed="0.000821"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:32:06.613711" elapsed="0.001027"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:32:06.614788" elapsed="0.000051"/>
</return>
<msg time="2026-04-17T03:32:06.615001" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:32:06.611810" elapsed="0.003218"/>
</kw>
<status status="PASS" start="2026-04-17T03:32:06.611317" elapsed="0.003744"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:06.615236" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:06.615088" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:06.611290" elapsed="0.004023"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:32:06.615979" 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-04-17T03:32:06.615475" elapsed="0.000533"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:32:06.616067" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:32:06.606365" elapsed="0.009874"/>
</kw>
<msg time="2026-04-17T03:32:06.616303" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:32:06.592260" elapsed="0.024113"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:32:06.632604" elapsed="0.000054"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/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-04-17T03:32:06.669271" 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/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-04-17T03:32:06.682261" elapsed="0.000053"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:06.682738" 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-04-17T03:32:06.682953" 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-04-17T03:32:06.683427" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:06.683254" elapsed="0.000238"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:06.683235" 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-04-17T03:32:06.683668" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:06.683890" 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-04-17T03:32:06.684139" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:32:06.683194" elapsed="0.001003"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:32:06.683056" elapsed="0.001170"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:06.684377" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:06.684492" elapsed="0.000028"/>
</return>
<msg time="2026-04-17T03:32:06.684710" 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-04-17T03:32:06.587664" elapsed="0.097077"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:06.686727" 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-04-17T03:32:06.686343" elapsed="0.000483">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-04-17T03:32:06.686988" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:06.685755" elapsed="0.001270"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:06.687496" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:06.687130" elapsed="0.000446"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:32:06.688347" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:32:06.687872" elapsed="0.000512"/>
</kw>
<status status="PASS" start="2026-04-17T03:32:06.687611" elapsed="0.000822"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:06.687101" elapsed="0.001376"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:32:06.691160" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:32:06.688682" elapsed="0.002507"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:32:06.691245" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:32:06.691417" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:32:06.685214" elapsed="0.006236"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:06.693052" 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-04-17T03:32:06.692660" elapsed="0.000474">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-04-17T03:32:06.693238" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:06.692273" elapsed="0.000991"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:32:06.693490" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-17T03:32:06.693342" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:06.693321" elapsed="0.000259"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:06.693806" 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-04-17T03:32:06.694004" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:32:06.694073" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:32:06.696121" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:32:06.691871" elapsed="0.004277"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:06.697613" 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-04-17T03:32:06.697348" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:06.698074" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:32:06.697810" 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-04-17T03:32:06.703393" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:06.905674" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:07.308057" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:07.310455" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:32:06.700207" elapsed="0.616088">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:32:06.698183" elapsed="0.618416">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:07.317393" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:07.316719" elapsed="0.000847"/>
</branch>
<status status="FAIL" start="2026-04-17T03:32:06.698165" elapsed="0.619508">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:07.318819" elapsed="0.000069"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:07.319451" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:32:07.319322" elapsed="0.000241"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:07.319248" elapsed="0.000364"/>
</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-04-17T03:32:07.320018" elapsed="0.000058"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:32:07.320195" elapsed="0.000035"/>
</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-04-17T03:32:06.696479" elapsed="0.623976">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:07.320629" elapsed="0.000037"/>
</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-04-17T03:32:06.560544" elapsed="0.760419">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:07.321862" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:07.321410" elapsed="0.000567"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:07.321368" elapsed="0.000635"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:07.322038" elapsed="0.000014"/>
</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="FAIL" start="2026-04-17T03:32:06.554010" elapsed="0.768132">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:10.377033" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:32:10.376593" elapsed="0.000474"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:10.377969" 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-04-17T03:32:10.377587" elapsed="0.000478">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-04-17T03:32:10.378167" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:10.377243" elapsed="0.000949"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:32:10.378797" 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-04-17T03:32:10.378368" elapsed="0.000467"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:32:10.379221" 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-04-17T03:32:10.379411" 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-04-17T03:32:10.379059" elapsed="0.000382"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:10.379982" 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-04-17T03:32:10.379641" elapsed="0.000397"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:10.381258" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:32:10.380873" elapsed="0.000435"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:32:10.381816" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:32:10.381487" elapsed="0.000358"/>
</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-04-17T03:32:10.382264" elapsed="0.000030"/>
</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-04-17T03:32:10.382500" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:10.382678" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:32:10.382109" elapsed="0.000627"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:32:10.381903" elapsed="0.000865"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:32:10.382820" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:32:10.383039" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:32:10.380524" elapsed="0.002542"/>
</kw>
<status status="PASS" start="2026-04-17T03:32:10.380123" elapsed="0.002987"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:10.383315" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:10.383146" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:10.380097" elapsed="0.003358"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:32:10.384095" 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-04-17T03:32:10.383609" elapsed="0.000515"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:32:10.384179" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/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-04-17T03:32:10.375947" elapsed="0.008366"/>
</kw>
<msg time="2026-04-17T03:32:10.384369" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:32:10.363074" elapsed="0.021349"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:32:10.399934" 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/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-04-17T03:32:10.411951" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/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-04-17T03:32:10.423854" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:10.424073" 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-04-17T03:32:10.424252" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:10.424634" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:10.424486" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:10.424470" 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-04-17T03:32:10.424854" 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-04-17T03:32:10.425035" 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-04-17T03:32:10.425201" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:32:10.424438" elapsed="0.000816"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:32:10.424332" elapsed="0.000949"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:10.425424" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:10.425499" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:32:10.425630" 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-04-17T03:32:10.358740" elapsed="0.066917"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:10.427086" 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-04-17T03:32:10.426798" elapsed="0.000362">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-04-17T03:32:10.427255" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:10.426433" elapsed="0.000847"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:10.427607" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:10.427351" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:32:10.428190" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:32:10.427868" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-04-17T03:32:10.427689" elapsed="0.000562"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:10.427333" elapsed="0.000939"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:32:10.430789" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:32:10.428422" elapsed="0.002393"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:32:10.430869" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:32:10.431050" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:32:10.426091" elapsed="0.004984"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:10.432325" 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-04-17T03:32:10.432087" elapsed="0.000301">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-04-17T03:32:10.432523" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:10.431709" elapsed="0.000849"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:32:10.432815" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-17T03:32:10.432645" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:10.432620" elapsed="0.000331"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:10.433156" 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-04-17T03:32:10.433346" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:32:10.433415" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:32:10.435520" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:32:10.431382" elapsed="0.004165"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:10.437114" 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-04-17T03:32:10.436828" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:10.437563" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:32:10.437315" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:32:10.443241" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:10.644918" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:11.047509" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:11.049530" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:32:10.439896" elapsed="0.614000">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:32:10.437675" elapsed="0.616621">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:11.054841" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:11.054393" elapsed="0.000657"/>
</branch>
<status status="FAIL" start="2026-04-17T03:32:10.437656" elapsed="0.617454">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:11.056111" elapsed="0.000063"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:11.056439" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:32:11.056348" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:11.056305" elapsed="0.000289"/>
</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-04-17T03:32:11.056967" elapsed="0.000054"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:32:11.057139" elapsed="0.000036"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:32:10.435871" elapsed="0.621530">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:11.057584" elapsed="0.000038"/>
</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-04-17T03:32:10.335523" elapsed="0.722334">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:11.058745" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:11.058263" elapsed="0.000662"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:11.058207" elapsed="0.000793"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:11.059035" elapsed="0.000015"/>
</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="FAIL" start="2026-04-17T03:32:10.327270" elapsed="0.731869">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:14.122392" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:32:14.121870" elapsed="0.000559"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:14.123337" 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-04-17T03:32:14.123046" elapsed="0.000372">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-04-17T03:32:14.123517" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:14.122615" elapsed="0.001026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:32:14.124274" 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-04-17T03:32:14.123838" elapsed="0.000464"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:32:14.124616" 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-04-17T03:32:14.124787" 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-04-17T03:32:14.124469" elapsed="0.000345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:14.125304" 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-04-17T03:32:14.124991" elapsed="0.000362"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:14.126538" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:32:14.126227" elapsed="0.000358"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:32:14.127204" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:32:14.126747" elapsed="0.000484"/>
</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-04-17T03:32:14.127570" 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-04-17T03:32:14.127785" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:14.127975" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:32:14.127433" elapsed="0.000601"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:32:14.127287" elapsed="0.000777"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:32:14.128111" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:32:14.128282" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:32:14.125869" elapsed="0.002443"/>
</kw>
<status status="PASS" start="2026-04-17T03:32:14.125436" elapsed="0.002908"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:14.128514" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:14.128369" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:14.125412" elapsed="0.003183"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:32:14.129209" 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-04-17T03:32:14.128736" elapsed="0.000501"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:32:14.129286" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:32:14.121008" elapsed="0.008405"/>
</kw>
<msg time="2026-04-17T03:32:14.129468" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:32:14.105616" elapsed="0.023902"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:32:14.145278" 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/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-04-17T03:32:14.160137" elapsed="0.000058"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:32:14.174585" elapsed="0.000067"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:14.174955" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:14.175167" 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-04-17T03:32:14.175610" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:14.175458" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:14.175440" elapsed="0.000282"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:14.175891" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:14.176107" 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-04-17T03:32:14.176290" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:32:14.175399" elapsed="0.000945"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:32:14.175263" elapsed="0.001111"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:14.176520" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:14.176600" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:32:14.176793" 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-04-17T03:32:14.100376" elapsed="0.076448"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:14.178503" 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-04-17T03:32:14.178166" elapsed="0.000420">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-04-17T03:32:14.178684" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:14.177633" elapsed="0.001075"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:14.179197" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:14.178835" elapsed="0.000469"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:32:14.180157" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:32:14.179588" elapsed="0.000613"/>
</kw>
<status status="PASS" start="2026-04-17T03:32:14.179340" elapsed="0.000915"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:14.178813" elapsed="0.001473"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:32:14.183591" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:32:14.180502" elapsed="0.003116"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:32:14.183675" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:32:14.183851" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:32:14.177234" elapsed="0.006654"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:14.185275" 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-04-17T03:32:14.184985" elapsed="0.000364">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-04-17T03:32:14.185517" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:14.184611" elapsed="0.000931"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:32:14.185757" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-17T03:32:14.185615" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:14.185596" 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-04-17T03:32:14.186027" elapsed="0.000026"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:14.186207" elapsed="0.000042"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:32:14.186304" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:32:14.188427" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:32:14.184267" elapsed="0.004187"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:14.190032" 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-04-17T03:32:14.189725" elapsed="0.000359"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:14.190529" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:32:14.190240" elapsed="0.000335"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:32:14.196216" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:14.397550" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:14.800273" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:14.802821" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:32:14.192835" elapsed="0.615564">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:32:14.190644" elapsed="0.617913">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:14.808948" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:14.808620" elapsed="0.000436"/>
</branch>
<status status="FAIL" start="2026-04-17T03:32:14.190625" elapsed="0.618468">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:14.809778" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:14.810015" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:32:14.809953" elapsed="0.000130"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:14.809905" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:14.810335" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:32:14.810441" elapsed="0.000024"/>
</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-04-17T03:32:14.188819" elapsed="0.621791">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:14.810809" 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-04-17T03:32:14.077703" elapsed="0.733319">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:14.811468" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:14.811191" elapsed="0.000390"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:14.811164" elapsed="0.000452"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:14.811666" elapsed="0.000022"/>
</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="FAIL" start="2026-04-17T03:32:14.069971" elapsed="0.741848">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:17.877151" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:32:17.876602" elapsed="0.000592"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:17.878108" 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-04-17T03:32:17.877789" elapsed="0.000402">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-04-17T03:32:17.878291" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:17.877425" elapsed="0.000892"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:32:17.878986" 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-04-17T03:32:17.878526" elapsed="0.000491"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:32:17.879363" 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-04-17T03:32:17.879550" 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-04-17T03:32:17.879183" elapsed="0.000393"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:17.880036" 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-04-17T03:32:17.879760" elapsed="0.000326"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:17.881368" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:32:17.881045" elapsed="0.000370"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:32:17.881854" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:32:17.881577" elapsed="0.000303"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:17.882253" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:17.882467" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:17.882640" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:32:17.882117" elapsed="0.000579"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:32:17.881965" elapsed="0.000857"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:32:17.882893" elapsed="0.000069"/>
</return>
<msg time="2026-04-17T03:32:17.883136" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:32:17.880622" elapsed="0.002547"/>
</kw>
<status status="PASS" start="2026-04-17T03:32:17.880172" elapsed="0.003030"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:17.883381" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:17.883229" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:17.880144" elapsed="0.003313"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:32:17.884246" 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-04-17T03:32:17.883603" elapsed="0.000677"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:32:17.884339" elapsed="0.000036"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:32:17.875785" elapsed="0.008705"/>
</kw>
<msg time="2026-04-17T03:32:17.884559" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:32:17.862189" elapsed="0.022434"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:32:17.897083" 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/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-04-17T03:32:17.909281" elapsed="0.000044"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:32:17.921577" elapsed="0.000044"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:17.921849" elapsed="0.000035"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:17.922087" 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-04-17T03:32:17.922518" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:17.922364" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:17.922347" 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-04-17T03:32:17.922744" 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-04-17T03:32:17.922906" elapsed="0.000061"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:17.923114" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:32:17.922307" elapsed="0.000861"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:32:17.922177" elapsed="0.001018"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:17.923338" elapsed="0.000091"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:17.923494" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:32:17.923661" 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-04-17T03:32:17.856154" elapsed="0.067535"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:17.925372" 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-04-17T03:32:17.924917" elapsed="0.000559">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-04-17T03:32:17.925604" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:17.924457" elapsed="0.001177"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:17.926085" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:17.925730" elapsed="0.000425"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:32:17.926784" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:32:17.926404" elapsed="0.000415"/>
</kw>
<status status="PASS" start="2026-04-17T03:32:17.926184" elapsed="0.000677"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:17.925701" elapsed="0.001187"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:32:17.929529" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:32:17.927130" elapsed="0.002433"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:32:17.929624" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:32:17.929806" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:32:17.924091" elapsed="0.005742"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:17.931316" 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-04-17T03:32:17.931051" elapsed="0.000336">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-04-17T03:32:17.931487" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:17.930661" elapsed="0.000851"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:32:17.931781" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-17T03:32:17.931589" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:17.931567" elapsed="0.000308"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:17.932043" elapsed="0.000026"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:17.932237" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:32:17.932305" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:32:17.934378" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:32:17.930241" elapsed="0.004165"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:17.936223" 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-04-17T03:32:17.935570" elapsed="0.000729"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:17.936742" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:32:17.936474" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:32:17.942153" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:18.143703" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:18.546152" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:18.548349" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:32:17.939053" elapsed="0.612342">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:32:17.936853" elapsed="0.614695">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:18.552012" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:18.551614" elapsed="0.000501"/>
</branch>
<status status="FAIL" start="2026-04-17T03:32:17.936834" elapsed="0.615316">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:18.552757" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:18.552966" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:32:18.552890" elapsed="0.000139"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:18.552865" elapsed="0.000194"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:18.553251" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:32:18.553340" 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-04-17T03:32:17.934727" elapsed="0.618768">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:18.553593" 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-04-17T03:32:17.831054" elapsed="0.722662">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:18.554085" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:18.553832" elapsed="0.000342"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:18.553811" elapsed="0.000392"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:18.554243" elapsed="0.000017"/>
</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="FAIL" start="2026-04-17T03:32:17.821426" elapsed="0.732941">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:21.615281" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:32:21.614705" elapsed="0.000612"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:21.616148" 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-04-17T03:32:21.615852" elapsed="0.000373">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-04-17T03:32:21.616325" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:21.615499" elapsed="0.000851"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:32:21.616997" 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-04-17T03:32:21.616518" elapsed="0.000508"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:32:21.617338" 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-04-17T03:32:21.617501" 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-04-17T03:32:21.617190" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:21.617986" 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-04-17T03:32:21.617685" 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-04-17T03:32:21.619407" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:32:21.619059" elapsed="0.000395"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:32:21.619924" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:32:21.619616" elapsed="0.000378"/>
</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-04-17T03:32:21.620386" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:21.620609" 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-04-17T03:32:21.620862" elapsed="0.000024"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:32:21.620248" elapsed="0.000677"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:32:21.620069" elapsed="0.000906"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:32:21.621028" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:32:21.621206" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:32:21.618640" elapsed="0.002591"/>
</kw>
<status status="PASS" start="2026-04-17T03:32:21.618161" elapsed="0.003103"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:21.621437" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:21.621289" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:21.618127" elapsed="0.003387"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:32:21.622163" 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-04-17T03:32:21.621657" elapsed="0.000534"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:32:21.622240" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:32:21.613884" elapsed="0.008484"/>
</kw>
<msg time="2026-04-17T03:32:21.622423" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:32:21.597988" elapsed="0.024487"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:32:21.636690" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:32:21.649074" 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/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-04-17T03:32:21.661190" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:21.661442" 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-04-17T03:32:21.661625" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:21.662128" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:21.661973" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:21.661938" elapsed="0.000276"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:21.662406" 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-04-17T03:32:21.662584" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:21.662752" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:32:21.661898" elapsed="0.000909"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:32:21.661764" elapsed="0.001071"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:21.663000" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:21.663081" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:32:21.663238" 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-04-17T03:32:21.593531" elapsed="0.069736"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:21.664703" 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-04-17T03:32:21.664406" elapsed="0.000373">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-04-17T03:32:21.664876" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:21.664000" elapsed="0.000902"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:21.665265" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:21.664993" elapsed="0.000331"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:32:21.665864" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:32:21.665534" elapsed="0.000360"/>
</kw>
<status status="PASS" start="2026-04-17T03:32:21.665349" elapsed="0.000662"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:21.664973" elapsed="0.001066"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:32:21.668472" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:32:21.666196" elapsed="0.002303"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:32:21.668553" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:32:21.668749" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:32:21.663618" elapsed="0.005157"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:21.670261" 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-04-17T03:32:21.669893" elapsed="0.000440">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-04-17T03:32:21.670447" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:21.669512" elapsed="0.000961"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:32:21.670714" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-17T03:32:21.670553" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:21.670534" elapsed="0.000282"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:21.670982" 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-04-17T03:32:21.671173" elapsed="0.000030"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:32:21.671249" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:32:21.673421" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:32:21.669145" elapsed="0.004304"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:21.675020" 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-04-17T03:32:21.674737" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:21.675500" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:32:21.675234" elapsed="0.000324"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:32:21.680722" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:21.884131" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:22.286750" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:22.289024" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:32:21.677731" elapsed="0.616831">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:32:21.675638" elapsed="0.619149">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:22.295363" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:22.294881" elapsed="0.000642"/>
</branch>
<status status="FAIL" start="2026-04-17T03:32:21.675608" elapsed="0.619973">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:22.296640" elapsed="0.000064"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:22.297110" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:32:22.297014" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:22.296942" elapsed="0.000324"/>
</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-04-17T03:32:22.297428" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:32:22.297499" 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-04-17T03:32:21.673833" elapsed="0.623780">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:22.297690" 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-04-17T03:32:21.570671" elapsed="0.727116">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:22.298083" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:22.297881" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:22.297864" elapsed="0.000315"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:22.298212" elapsed="0.000014"/>
</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="FAIL" start="2026-04-17T03:32:21.564478" elapsed="0.733831">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:25.355820" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:32:25.355388" elapsed="0.000467"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:25.356666" 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-04-17T03:32:25.356402" elapsed="0.000347">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-04-17T03:32:25.356868" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:25.356051" elapsed="0.000843"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:32:25.357486" 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-04-17T03:32:25.357081" elapsed="0.000433"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:32:25.357858" 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-04-17T03:32:25.358056" 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-04-17T03:32:25.357677" elapsed="0.000405"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:25.358553" 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-04-17T03:32:25.358285" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:25.359766" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:32:25.359446" elapsed="0.000369"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:32:25.360299" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:32:25.360011" elapsed="0.000315"/>
</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-04-17T03:32:25.360668" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:25.360996" 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-04-17T03:32:25.361185" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:32:25.360533" elapsed="0.000710"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:32:25.360385" elapsed="0.000890"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:32:25.361322" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:32:25.361503" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:32:25.359108" elapsed="0.002421"/>
</kw>
<status status="PASS" start="2026-04-17T03:32:25.358751" elapsed="0.002812"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:25.361735" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:25.361588" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:25.358725" elapsed="0.003089"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:32:25.362439" 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-04-17T03:32:25.361979" elapsed="0.000488"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:32:25.362516" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:32:25.354694" elapsed="0.007949"/>
</kw>
<msg time="2026-04-17T03:32:25.362700" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:32:25.341702" elapsed="0.021049"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:32:25.374989" 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/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-04-17T03:32:25.387729" elapsed="0.000043"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:32:25.400635" elapsed="0.000037"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:25.400888" 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-04-17T03:32:25.401103" 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-04-17T03:32:25.401672" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:25.401515" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:25.401494" 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-04-17T03:32:25.401905" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:25.402102" 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-04-17T03:32:25.402275" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:32:25.401406" elapsed="0.000924"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:32:25.401275" elapsed="0.001084"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:25.402506" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:25.402587" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:32:25.402750" 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-04-17T03:32:25.337484" elapsed="0.065295"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:25.404234" 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-04-17T03:32:25.403916" elapsed="0.000395">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-04-17T03:32:25.404415" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:25.403512" elapsed="0.000929"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:25.404780" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:25.404514" elapsed="0.000326"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:32:25.405388" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:32:25.405069" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-04-17T03:32:25.404866" elapsed="0.000586"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:25.404495" elapsed="0.000980"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:32:25.407866" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:32:25.405657" elapsed="0.002236"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:32:25.407971" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:32:25.408145" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:32:25.403151" elapsed="0.005020"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:25.409458" 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-04-17T03:32:25.409216" elapsed="0.000308">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-04-17T03:32:25.409655" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:25.408817" elapsed="0.000864"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:32:25.409889" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:32:25.409752" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:25.409734" elapsed="0.000258"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:25.410138" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:25.410307" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:32:25.410413" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:32:25.412420" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:32:25.408485" elapsed="0.003961"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:25.413899" 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-04-17T03:32:25.413609" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:25.414366" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:32:25.414119" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:32:25.419157" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:25.621759" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:26.024678" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:26.027148" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:32:25.416482" elapsed="0.615742">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:32:25.414477" elapsed="0.617913">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:26.032863" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:26.032471" elapsed="0.000560"/>
</branch>
<status status="FAIL" start="2026-04-17T03:32:25.414459" elapsed="0.618622">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:26.033929" elapsed="0.000075"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:26.034227" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:32:26.034150" elapsed="0.000152"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:26.034111" elapsed="0.000224"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:26.034604" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:32:26.034713" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:32:25.412763" elapsed="0.622120">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:26.035021" elapsed="0.000026"/>
</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-04-17T03:32:25.315710" elapsed="0.719461">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:26.035602" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:26.035314" elapsed="0.000462"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:26.035287" elapsed="0.000524"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:26.035868" elapsed="0.000029"/>
</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="FAIL" start="2026-04-17T03:32:25.307795" elapsed="0.728261">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:29.098994" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:32:29.098502" elapsed="0.000538"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:29.099968" 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-04-17T03:32:29.099598" elapsed="0.000469">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-04-17T03:32:29.100169" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:29.099234" elapsed="0.000961"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:32:29.100802" 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-04-17T03:32:29.100393" elapsed="0.000438"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:32:29.101204" 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-04-17T03:32:29.101493" 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-04-17T03:32:29.101014" elapsed="0.000506"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:29.101965" 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-04-17T03:32:29.101682" elapsed="0.000336"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:29.103247" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:32:29.102874" elapsed="0.000439"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:32:29.103773" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:32:29.103483" elapsed="0.000316"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:29.104201" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:29.104414" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:29.104593" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:32:29.104059" elapsed="0.000592"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:32:29.103862" elapsed="0.000823"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:32:29.104741" elapsed="0.000043"/>
</return>
<msg time="2026-04-17T03:32:29.104923" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:32:29.102514" elapsed="0.002454"/>
</kw>
<status status="PASS" start="2026-04-17T03:32:29.102115" elapsed="0.002886"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:29.105173" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:29.105026" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:29.102082" elapsed="0.003167"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:32:29.106052" 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-04-17T03:32:29.105442" elapsed="0.000641"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:32:29.106248" elapsed="0.000033"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/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-04-17T03:32:29.097509" elapsed="0.008875"/>
</kw>
<msg time="2026-04-17T03:32:29.106444" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:32:29.082482" elapsed="0.024028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:32:29.119490" elapsed="0.000053"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:32:29.133232" elapsed="0.000082"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/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-04-17T03:32:29.150077" elapsed="0.000165"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:29.150758" elapsed="0.000040"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:29.151079" 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-04-17T03:32:29.151875" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:29.151591" elapsed="0.000393"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:29.151558" elapsed="0.000476"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:29.152255" 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-04-17T03:32:29.152524" 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-04-17T03:32:29.152786" elapsed="0.000033"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:32:29.151482" elapsed="0.001386"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:32:29.151228" elapsed="0.001686"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:29.153175" elapsed="0.000034"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:29.153304" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:32:29.153625" 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-04-17T03:32:29.076268" elapsed="0.077400"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:29.156285" 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-04-17T03:32:29.155759" elapsed="0.000663">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-04-17T03:32:29.156571" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:29.155118" elapsed="0.001490"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:29.157178" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:29.156724" elapsed="0.000538"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:32:29.158077" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:32:29.157592" elapsed="0.000526"/>
</kw>
<status status="PASS" start="2026-04-17T03:32:29.157300" elapsed="0.000872"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:29.156693" elapsed="0.001513"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:32:29.161771" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:32:29.158451" elapsed="0.003366"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:32:29.161980" elapsed="0.000070"/>
</return>
<msg time="2026-04-17T03:32:29.162269" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:32:29.154516" elapsed="0.007794"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:29.164420" 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-04-17T03:32:29.164024" elapsed="0.000486">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-04-17T03:32:29.164612" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:29.163471" elapsed="0.001167"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:32:29.164904" elapsed="0.000062"/>
</return>
<status status="PASS" start="2026-04-17T03:32:29.164722" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:29.164699" elapsed="0.000337"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:29.165193" elapsed="0.000025"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:29.165392" elapsed="0.000023"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:32:29.165479" elapsed="0.000027"/>
</return>
<msg time="2026-04-17T03:32:29.167864" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:32:29.162887" elapsed="0.005005"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:29.169513" 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-04-17T03:32:29.169214" elapsed="0.000350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:29.170065" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:32:29.169723" 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="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:32:29.175849" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:29.379118" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:29.782007" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:29.784422" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:32:29.172348" elapsed="0.616316">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:32:29.170188" elapsed="0.618834">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:29.789532" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:29.789106" elapsed="0.000538"/>
</branch>
<status status="FAIL" start="2026-04-17T03:32:29.170167" elapsed="0.619516">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:29.790489" elapsed="0.000046"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:29.790729" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:32:29.790660" elapsed="0.000155"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:29.790627" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:29.791117" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:32:29.791229" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:32:29.168299" elapsed="0.623119">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:29.791605" 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-04-17T03:32:29.053218" elapsed="0.738552">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:29.792257" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:29.791958" elapsed="0.000410"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:29.791909" elapsed="0.000496"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:29.792458" elapsed="0.000026"/>
</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="FAIL" start="2026-04-17T03:32:29.046533" elapsed="0.746075">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:32.857259" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:32:32.856745" elapsed="0.000558"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:32.858396" 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-04-17T03:32:32.858028" elapsed="0.000451">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-04-17T03:32:32.858590" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:32.857530" elapsed="0.001091"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:32:32.859380" 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-04-17T03:32:32.858900" elapsed="0.000510"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:32:32.859723" 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-04-17T03:32:32.859881" 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-04-17T03:32:32.859574" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:32.860346" 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-04-17T03:32:32.860088" 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-04-17T03:32:32.861634" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:32:32.861290" elapsed="0.000390"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:32:32.862157" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:32:32.861844" elapsed="0.000339"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:32.862527" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:32.862739" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:32.862912" elapsed="0.000051"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:32:32.862391" elapsed="0.000611"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:32:32.862241" elapsed="0.000795"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:32:32.863086" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:32:32.863264" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:32:32.860839" elapsed="0.002450"/>
</kw>
<status status="PASS" start="2026-04-17T03:32:32.860476" elapsed="0.002845"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:32.863491" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:32.863345" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:32.860451" elapsed="0.003117"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:32:32.864184" 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-04-17T03:32:32.863710" elapsed="0.000502"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:32:32.864261" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:32:32.856092" elapsed="0.008294"/>
</kw>
<msg time="2026-04-17T03:32:32.864441" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:32:32.842806" elapsed="0.021685"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:32:32.877004" elapsed="0.000043"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:32:32.891813" 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/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-04-17T03:32:32.903853" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:32.904092" 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-04-17T03:32:32.904276" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:32.904685" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:32.904534" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:32.904517" 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-04-17T03:32:32.904908" 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-04-17T03:32:32.905122" 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-04-17T03:32:32.905345" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:32:32.904478" elapsed="0.000925"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:32:32.904362" elapsed="0.001069"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:32.905622" elapsed="0.000029"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:32.905726" elapsed="0.000020"/>
</return>
<msg time="2026-04-17T03:32:32.905883" 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-04-17T03:32:32.838381" elapsed="0.067529"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:32.907383" 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-04-17T03:32:32.907091" elapsed="0.000366">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-04-17T03:32:32.907553" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:32.906614" elapsed="0.000964"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:32.907911" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:32.907648" elapsed="0.000338"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:32:32.908500" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:32:32.908202" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-17T03:32:32.908010" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:32.907630" elapsed="0.000951"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:32:32.911010" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:32:32.908732" elapsed="0.002305"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:32:32.911089" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:32:32.911247" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:32:32.906260" elapsed="0.005019"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:32.912502" 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-04-17T03:32:32.912270" elapsed="0.000295">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-04-17T03:32:32.912703" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:32.911920" elapsed="0.000807"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:32:32.912948" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-17T03:32:32.912796" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:32.912779" elapsed="0.000267"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:32.913192" 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-04-17T03:32:32.913410" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:32:32.913478" elapsed="0.000014"/>
</return>
<msg time="2026-04-17T03:32:32.915504" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:32:32.911594" elapsed="0.003936"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:32.917062" 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-04-17T03:32:32.916782" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:32.917537" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:32:32.917260" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:32:32.922674" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:33.124284" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:33.527163" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:33.529320" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:32:32.919744" elapsed="0.613269">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:32:32.917645" elapsed="0.615516">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:33.533534" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:33.533231" elapsed="0.000399"/>
</branch>
<status status="FAIL" start="2026-04-17T03:32:32.917628" elapsed="0.616036">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:33.534302" elapsed="0.000040"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:33.534502" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:32:33.534446" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:33.534420" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:33.534795" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:32:33.534893" 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-04-17T03:32:32.915876" elapsed="0.619204">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:33.535272" 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-04-17T03:32:32.809648" elapsed="0.725770">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:33.535804" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:33.535549" elapsed="0.000356"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:33.535526" elapsed="0.000436"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:33.536011" elapsed="0.000020"/>
</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="FAIL" start="2026-04-17T03:32:32.802495" elapsed="0.733656">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:36.592124" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:32:36.591675" elapsed="0.000483"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:36.592947" 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-04-17T03:32:36.592674" elapsed="0.000359">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-04-17T03:32:36.593129" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:36.592332" elapsed="0.000821"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:32:36.593704" 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-04-17T03:32:36.593316" elapsed="0.000415"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:32:36.594052" 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-04-17T03:32:36.594262" 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-04-17T03:32:36.593891" elapsed="0.000396"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:36.594697" 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-04-17T03:32:36.594448" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:36.595815" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:32:36.595511" elapsed="0.000348"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:32:36.596342" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:32:36.596062" 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-04-17T03:32:36.596697" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:36.596906" 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-04-17T03:32:36.597106" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:32:36.596563" elapsed="0.000600"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:32:36.596421" elapsed="0.000839"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:32:36.597309" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:32:36.597482" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:32:36.595181" elapsed="0.002326"/>
</kw>
<status status="PASS" start="2026-04-17T03:32:36.594822" elapsed="0.002717"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:36.597710" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:36.597565" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:36.594798" elapsed="0.002988"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:32:36.598457" 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-04-17T03:32:36.597930" elapsed="0.000556"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:32:36.598535" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:32:36.590903" elapsed="0.007761"/>
</kw>
<msg time="2026-04-17T03:32:36.598720" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:32:36.578496" elapsed="0.020280"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:32:36.612430" 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/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-04-17T03:32:36.626296" elapsed="0.000043"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:32:36.639164" elapsed="0.000055"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:36.639464" 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-04-17T03:32:36.639652" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:36.640120" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:36.639963" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:36.639930" 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-04-17T03:32:36.640350" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:36.640515" 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-04-17T03:32:36.640681" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:32:36.639887" elapsed="0.000847"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:32:36.639741" elapsed="0.001021"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:36.641076" elapsed="0.000102"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:36.641245" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:32:36.641406" 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-04-17T03:32:36.574223" elapsed="0.067211"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:36.643175" 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-04-17T03:32:36.642781" elapsed="0.000479">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-04-17T03:32:36.643373" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:36.642211" elapsed="0.001196"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:36.643773" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:36.643484" elapsed="0.000359"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:32:36.644383" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:32:36.644076" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-17T03:32:36.643872" elapsed="0.000573"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:36.643464" elapsed="0.001003"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:32:36.647269" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:32:36.644620" elapsed="0.002680"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:32:36.647367" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:32:36.647546" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:32:36.641826" elapsed="0.005746"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:36.648943" 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-04-17T03:32:36.648674" elapsed="0.000339">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-04-17T03:32:36.649109" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:36.648318" elapsed="0.000816"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:32:36.649342" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:32:36.649204" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:36.649186" elapsed="0.000241"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:36.649572" 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-04-17T03:32:36.649761" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:32:36.649828" elapsed="0.000014"/>
</return>
<msg time="2026-04-17T03:32:36.652073" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:32:36.647971" elapsed="0.004146"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:36.655070" 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-04-17T03:32:36.654287" elapsed="0.000867"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:36.655704" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:32:36.655373" 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="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:32:36.661355" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:36.863387" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:37.266443" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:37.269219" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:32:36.658442" elapsed="0.615789">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:32:36.655851" elapsed="0.618526">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:37.274784" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:37.274439" elapsed="0.000461"/>
</branch>
<status status="FAIL" start="2026-04-17T03:32:36.655826" elapsed="0.619134">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:37.275612" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:37.275818" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:32:37.275758" elapsed="0.000148"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:37.275731" elapsed="0.000247"/>
</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-04-17T03:32:37.276274" elapsed="0.000046"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:32:37.276416" elapsed="0.000054"/>
</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-04-17T03:32:36.652684" elapsed="0.623975">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:37.276812" elapsed="0.000034"/>
</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-04-17T03:32:36.552571" elapsed="0.724456">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:37.277425" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:37.277167" elapsed="0.000363"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:37.277142" elapsed="0.000421"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:37.277609" elapsed="0.000021"/>
</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="FAIL" start="2026-04-17T03:32:36.546252" elapsed="0.731498">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:40.339539" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:32:40.338943" elapsed="0.000641"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:40.340499" 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-04-17T03:32:40.340152" elapsed="0.000433">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-04-17T03:32:40.340685" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:40.339772" elapsed="0.000938"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:32:40.341340" 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-04-17T03:32:40.340921" elapsed="0.000447"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:32:40.341679" 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-04-17T03:32:40.341839" 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-04-17T03:32:40.341533" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:40.342299" 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-04-17T03:32:40.342046" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:40.343463" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:32:40.343160" elapsed="0.000348"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:32:40.344008" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:32:40.343669" elapsed="0.000374"/>
</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-04-17T03:32:40.344505" elapsed="0.000039"/>
</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-04-17T03:32:40.344814" elapsed="0.000035"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:32:40.345129" elapsed="0.000031"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:32:40.344305" elapsed="0.000911"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:32:40.344112" elapsed="0.001149"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:32:40.345332" elapsed="0.000050"/>
</return>
<msg time="2026-04-17T03:32:40.345572" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:32:40.342803" elapsed="0.002806"/>
</kw>
<status status="PASS" start="2026-04-17T03:32:40.342433" elapsed="0.003223"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:40.345902" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:40.345693" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:40.342406" elapsed="0.003621"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:32:40.346826" 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-04-17T03:32:40.346220" elapsed="0.000645"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:32:40.346954" 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/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-04-17T03:32:40.338071" elapsed="0.009055"/>
</kw>
<msg time="2026-04-17T03:32:40.347197" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:32:40.322678" elapsed="0.024584"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:32:40.360704" elapsed="0.000059"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:32:40.373271" 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/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-04-17T03:32:40.386875" elapsed="0.000049"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:40.387171" 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-04-17T03:32:40.387356" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:40.387791" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:40.387638" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:40.387620" 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-04-17T03:32:40.388045" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:40.388212" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:40.388374" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:32:40.387579" elapsed="0.000846"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:32:40.387443" elapsed="0.001011"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:40.388598" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:40.388678" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:32:40.388845" 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-04-17T03:32:40.317791" elapsed="0.071083"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:40.390497" 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-04-17T03:32:40.390153" elapsed="0.000433">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-04-17T03:32:40.390683" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:40.389681" elapsed="0.001027"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:40.391071" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:40.390777" elapsed="0.000352"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:32:40.391635" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:32:40.391339" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-17T03:32:40.391154" elapsed="0.000606"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:40.390759" elapsed="0.001025"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:32:40.394131" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:32:40.391953" elapsed="0.002205"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:32:40.394210" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:32:40.394371" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:32:40.389307" elapsed="0.005089"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:40.395649" 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-04-17T03:32:40.395389" elapsed="0.000326">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-04-17T03:32:40.395809" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:40.395051" elapsed="0.000783"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:32:40.396058" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:32:40.395903" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:40.395885" elapsed="0.000258"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:40.396289" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:40.396459" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:32:40.396523" elapsed="0.000014"/>
</return>
<msg time="2026-04-17T03:32:40.398603" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:32:40.394707" elapsed="0.003923"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:40.400075" 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-04-17T03:32:40.399798" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:40.400517" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:32:40.400273" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:32:40.405600" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:40.607342" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:41.009973" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:41.011848" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:32:40.402813" elapsed="0.612714">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:32:40.400625" elapsed="0.615089">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:41.016202" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:41.015813" elapsed="0.000498"/>
</branch>
<status status="FAIL" start="2026-04-17T03:32:40.400608" elapsed="0.615749">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:41.017059" elapsed="0.000042"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:41.017365" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:32:41.017305" elapsed="0.000136"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:41.017275" elapsed="0.000213"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:41.017757" elapsed="0.000036"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:32:41.017869" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:32:40.398963" elapsed="0.619111">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:41.018192" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:32:40.293985" elapsed="0.724355">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:41.018801" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:41.018516" elapsed="0.000396"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:41.018490" elapsed="0.000482"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:41.019024" elapsed="0.000021"/>
</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="FAIL" start="2026-04-17T03:32:40.287169" elapsed="0.732006">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:44.078036" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:32:44.077550" elapsed="0.000522"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:44.078906" 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-04-17T03:32:44.078630" elapsed="0.000416">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-04-17T03:32:44.079264" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:44.078257" elapsed="0.001059"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:32:44.080315" 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-04-17T03:32:44.079624" elapsed="0.000743"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:32:44.080896" 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-04-17T03:32:44.081162" 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-04-17T03:32:44.080644" elapsed="0.000558"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:44.081864" 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-04-17T03:32:44.081458" elapsed="0.000499"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:44.083838" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:32:44.083361" elapsed="0.000642"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:32:44.084652" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:32:44.084248" 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-04-17T03:32:44.085120" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:44.085338" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:44.085536" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:32:44.084984" elapsed="0.000610"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:32:44.084770" elapsed="0.000856"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:32:44.085677" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:32:44.085857" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:32:44.082772" elapsed="0.003111"/>
</kw>
<status status="PASS" start="2026-04-17T03:32:44.082215" elapsed="0.003702"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:44.086112" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:44.085961" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:44.082168" elapsed="0.004022"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:32:44.086813" 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-04-17T03:32:44.086334" elapsed="0.000507"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:32:44.086890" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:32:44.076678" elapsed="0.010361"/>
</kw>
<msg time="2026-04-17T03:32:44.087096" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:32:44.063236" elapsed="0.023916"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:32:44.099964" elapsed="0.000069"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:32:44.112739" 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/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-04-17T03:32:44.125406" elapsed="0.000063"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:44.125739" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:44.125957" 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-04-17T03:32:44.126534" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:44.126377" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:44.126358" 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-04-17T03:32:44.126761" 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-04-17T03:32:44.126945" 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-04-17T03:32:44.127114" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:32:44.126318" elapsed="0.000850"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:32:44.126170" elapsed="0.001029"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:44.127356" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:44.127439" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:32:44.127602" 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-04-17T03:32:44.058875" elapsed="0.068755"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:44.129160" 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-04-17T03:32:44.128833" elapsed="0.000407">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-04-17T03:32:44.129359" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:44.128423" 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-04-17T03:32:44.129758" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:44.129489" elapsed="0.000326"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:32:44.130347" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:32:44.130046" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-04-17T03:32:44.129840" elapsed="0.000569"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:44.129470" elapsed="0.000961"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:32:44.133412" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:32:44.130617" elapsed="0.002828"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:32:44.133511" elapsed="0.000041"/>
</return>
<msg time="2026-04-17T03:32:44.133711" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:32:44.128042" elapsed="0.005701"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:44.135372" 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-04-17T03:32:44.135042" elapsed="0.000424">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-04-17T03:32:44.135590" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:44.134588" elapsed="0.001035"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:32:44.135909" elapsed="0.000072"/>
</return>
<status status="PASS" start="2026-04-17T03:32:44.135720" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:44.135695" elapsed="0.000363"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:44.136215" 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-04-17T03:32:44.136387" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:32:44.136521" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:32:44.138642" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:32:44.134163" elapsed="0.004507"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:44.140302" 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-04-17T03:32:44.139898" elapsed="0.000464"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:44.140840" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:32:44.140566" elapsed="0.000319"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:32:44.146098" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:44.348002" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:44.750837" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:44.753050" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:32:44.143047" elapsed="0.612539">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:32:44.140970" elapsed="0.614726">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:44.756029" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:44.755744" elapsed="0.000372"/>
</branch>
<status status="FAIL" start="2026-04-17T03:32:44.140951" elapsed="0.615191">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:44.756608" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:44.756765" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:32:44.756722" elapsed="0.000090"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:44.756702" elapsed="0.000155"/>
</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-04-17T03:32:44.757023" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:32:44.757097" elapsed="0.000017"/>
</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-04-17T03:32:44.139054" elapsed="0.618164">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:44.757308" 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-04-17T03:32:44.035277" elapsed="0.722132">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:44.757692" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:44.757505" elapsed="0.000317"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:44.757487" elapsed="0.000361"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:44.757882" elapsed="0.000015"/>
</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="FAIL" start="2026-04-17T03:32:44.026530" elapsed="0.731475">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:47.812510" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:32:47.812010" elapsed="0.000538"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:47.813350" 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-04-17T03:32:47.813091" elapsed="0.000335">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-04-17T03:32:47.813523" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:47.812728" elapsed="0.000820"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:32:47.814124" 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-04-17T03:32:47.813713" elapsed="0.000439"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:32:47.814486" 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-04-17T03:32:47.814658" 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-04-17T03:32:47.814325" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:47.815244" 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-04-17T03:32:47.814851" elapsed="0.000446"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:47.816431" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:32:47.816100" elapsed="0.000415"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:32:47.817046" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:32:47.816680" elapsed="0.000403"/>
</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-04-17T03:32:47.817520" elapsed="0.000033"/>
</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-04-17T03:32:47.817781" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:47.818022" elapsed="0.000031"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:32:47.817348" elapsed="0.000757"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:32:47.817141" elapsed="0.001006"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:32:47.818212" elapsed="0.000051"/>
</return>
<msg time="2026-04-17T03:32:47.818450" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:32:47.815736" elapsed="0.002748"/>
</kw>
<status status="PASS" start="2026-04-17T03:32:47.815380" elapsed="0.003138"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:47.818699" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:47.818545" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:47.815355" elapsed="0.003422"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:32:47.819574" 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-04-17T03:32:47.818920" elapsed="0.000683"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:32:47.819720" 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/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-04-17T03:32:47.811314" elapsed="0.008579"/>
</kw>
<msg time="2026-04-17T03:32:47.819971" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:32:47.798608" elapsed="0.021421"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:32:47.834074" elapsed="0.000043"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:32:47.846707" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:32:47.859534" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:47.859761" 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-04-17T03:32:47.859957" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:47.860577" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:47.860396" elapsed="0.000239"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:47.860379" elapsed="0.000281"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:47.860807" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:47.860992" 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-04-17T03:32:47.861188" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:32:47.860157" elapsed="0.001084"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:32:47.860043" elapsed="0.001224"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:47.861409" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:47.861487" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:32:47.861637" 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-04-17T03:32:47.794298" elapsed="0.067367"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:47.863128" 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-04-17T03:32:47.862823" elapsed="0.000379">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-04-17T03:32:47.863299" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:47.862432" elapsed="0.000891"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:47.863657" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:47.863394" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:32:47.864284" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:32:47.863959" elapsed="0.000352"/>
</kw>
<status status="PASS" start="2026-04-17T03:32:47.863739" elapsed="0.000608"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:47.863376" elapsed="0.000992"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:32:47.866684" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:32:47.864533" elapsed="0.002177"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:32:47.866761" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:32:47.866918" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:32:47.862078" elapsed="0.004880"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:47.868176" 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-04-17T03:32:47.867940" elapsed="0.000299">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-04-17T03:32:47.868333" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:47.867590" elapsed="0.000767"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:32:47.868594" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:32:47.868426" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:47.868409" 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-04-17T03:32:47.868823" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:47.869008" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:32:47.869074" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:32:47.871076" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:32:47.867261" elapsed="0.003844"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:47.872537" 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-04-17T03:32:47.872259" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:47.872996" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:32:47.872735" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:32:47.878108" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:48.079829" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:48.482493" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:48.485053" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:32:47.875142" elapsed="0.615783">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:32:47.873129" elapsed="0.618051">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:48.491548" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:48.491240" elapsed="0.000407"/>
</branch>
<status status="FAIL" start="2026-04-17T03:32:47.873107" elapsed="0.618574">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:48.492309" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:48.492504" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:32:48.492448" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:48.492423" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:48.492799" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:32:48.492895" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:32:47.871417" elapsed="0.621737">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:48.493295" elapsed="0.000030"/>
</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-04-17T03:32:47.772213" elapsed="0.721238">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:48.493908" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:48.493593" elapsed="0.000451"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:48.493560" elapsed="0.000510"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:48.494103" elapsed="0.000014"/>
</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="FAIL" start="2026-04-17T03:32:47.764719" elapsed="0.729487">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:51.552464" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:32:51.552049" elapsed="0.000450"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:51.553317" 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-04-17T03:32:51.553027" elapsed="0.000364">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-04-17T03:32:51.553489" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:51.552671" elapsed="0.000843"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:32:51.554175" 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-04-17T03:32:51.553758" elapsed="0.000445"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:32:51.554509" 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-04-17T03:32:51.554661" 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-04-17T03:32:51.554366" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:51.555110" 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-04-17T03:32:51.554843" 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-04-17T03:32:51.556218" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:32:51.555902" elapsed="0.000361"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:32:51.556690" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:32:51.556420" 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-04-17T03:32:51.557066" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:51.557274" 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-04-17T03:32:51.557445" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:32:51.556909" elapsed="0.000591"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:32:51.556768" elapsed="0.000762"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:32:51.557577" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:32:51.557745" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:32:51.555576" elapsed="0.002194"/>
</kw>
<status status="PASS" start="2026-04-17T03:32:51.555236" elapsed="0.002566"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:51.557989" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:51.557826" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:51.555213" elapsed="0.002853"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:32:51.558650" 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-04-17T03:32:51.558206" elapsed="0.000472"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:32:51.558725" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:32:51.551291" elapsed="0.007558"/>
</kw>
<msg time="2026-04-17T03:32:51.558902" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:32:51.538510" elapsed="0.020458"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:32:51.574712" 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/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-04-17T03:32:51.586585" 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/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-04-17T03:32:51.599006" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:51.599238" 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-04-17T03:32:51.599433" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:51.599873" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:51.599708" elapsed="0.000238"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:51.599689" 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-04-17T03:32:51.600135" 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-04-17T03:32:51.600317" 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-04-17T03:32:51.600497" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:32:51.599651" elapsed="0.000901"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:32:51.599532" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:51.600741" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:51.600823" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:32:51.600984" 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-04-17T03:32:51.534013" elapsed="0.067001"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:51.602478" 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-04-17T03:32:51.602184" elapsed="0.000372">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-04-17T03:32:51.602657" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:51.601754" elapsed="0.000930"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:51.603058" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:51.602759" elapsed="0.000361"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:32:51.603705" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:32:51.603349" elapsed="0.000385"/>
</kw>
<status status="PASS" start="2026-04-17T03:32:51.603147" elapsed="0.000626"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:51.602740" elapsed="0.001056"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:32:51.606366" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:32:51.603981" elapsed="0.002413"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:32:51.606449" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:32:51.606617" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:32:51.601376" elapsed="0.005267"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:51.608016" 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-04-17T03:32:51.607746" elapsed="0.000339">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-04-17T03:32:51.608236" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:51.607356" elapsed="0.000907"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:32:51.608484" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-17T03:32:51.608338" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:51.608319" elapsed="0.000256"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:51.608737" 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-04-17T03:32:51.608941" elapsed="0.000023"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:32:51.609014" elapsed="0.000016"/>
</return>
<msg time="2026-04-17T03:32:51.611262" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:32:51.606993" elapsed="0.004296"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:51.612763" 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-04-17T03:32:51.612505" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:51.613222" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:32:51.612976" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:32:51.618139" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:51.819785" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:52.222503" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:52.224866" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:32:51.615330" elapsed="0.614724">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:32:51.613331" elapsed="0.616944">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:52.230876" elapsed="0.000091"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:52.230363" elapsed="0.000709"/>
</branch>
<status status="FAIL" start="2026-04-17T03:32:51.613313" elapsed="0.617813">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:52.232268" elapsed="0.000070"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:52.232670" elapsed="0.000048"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:32:52.232520" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:52.232477" elapsed="0.000423"/>
</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-04-17T03:32:52.233354" elapsed="0.000056"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:32:52.233532" elapsed="0.000052"/>
</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-04-17T03:32:51.611652" elapsed="0.622206">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:52.234187" elapsed="0.000043"/>
</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-04-17T03:32:51.510821" elapsed="0.723617">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:52.235184" elapsed="0.000093"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:52.234680" elapsed="0.000732"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:52.234638" elapsed="0.000835"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:52.235569" elapsed="0.000067"/>
</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="FAIL" start="2026-04-17T03:32:51.504350" elapsed="0.731635">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:55.300023" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:32:55.299545" elapsed="0.000514"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:55.300879" 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-04-17T03:32:55.300614" elapsed="0.000360">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-04-17T03:32:55.301073" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:55.300242" elapsed="0.000855"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:32:55.301686" 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-04-17T03:32:55.301276" elapsed="0.000442"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:32:55.302093" 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-04-17T03:32:55.302264" 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-04-17T03:32:55.301921" elapsed="0.000369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:55.302768" 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-04-17T03:32:55.302465" elapsed="0.000354"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:55.303979" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:32:55.303643" elapsed="0.000382"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:32:55.304562" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:32:55.304209" elapsed="0.000382"/>
</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-04-17T03:32:55.304943" elapsed="0.000025"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:55.305155" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:55.305327" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:32:55.304791" elapsed="0.000593"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:32:55.304647" elapsed="0.000833"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:32:55.305538" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:32:55.305724" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:32:55.303298" elapsed="0.002452"/>
</kw>
<status status="PASS" start="2026-04-17T03:32:55.302904" elapsed="0.002882"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:55.305982" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:55.305812" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:55.302879" elapsed="0.003189"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:32:55.306724" 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-04-17T03:32:55.306213" elapsed="0.000541"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:32:55.306803" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:32:55.298695" elapsed="0.008253"/>
</kw>
<msg time="2026-04-17T03:32:55.307006" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:32:55.281597" elapsed="0.025461"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:32:55.319431" elapsed="0.000042"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:32:55.331751" 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/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-04-17T03:32:55.347903" elapsed="0.000057"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:55.348181" 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-04-17T03:32:55.348376" 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-04-17T03:32:55.348898" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:55.348742" elapsed="0.000233"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:55.348720" elapsed="0.000282"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:55.349148" 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-04-17T03:32:55.349316" 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-04-17T03:32:55.349481" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:32:55.348669" elapsed="0.000864"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:32:55.348487" elapsed="0.001074"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:55.349734" elapsed="0.000106"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:55.349905" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:32:55.350085" 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-04-17T03:32:55.277112" elapsed="0.073002"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:55.351739" 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-04-17T03:32:55.351403" elapsed="0.000422">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-04-17T03:32:55.351923" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:55.350988" elapsed="0.000978"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:55.352307" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:55.352039" elapsed="0.000326"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:32:55.352986" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:32:55.352645" elapsed="0.000379"/>
</kw>
<status status="PASS" start="2026-04-17T03:32:55.352394" elapsed="0.000673"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:55.352021" elapsed="0.001068"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:32:55.355946" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:32:55.353242" elapsed="0.002744"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:32:55.356051" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:32:55.356218" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:32:55.350488" elapsed="0.005762"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:55.357629" 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-04-17T03:32:55.357386" elapsed="0.000309">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-04-17T03:32:55.357791" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:55.357016" elapsed="0.000799"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:32:55.358040" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:32:55.357885" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:55.357867" elapsed="0.000259"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:55.358302" elapsed="0.000025"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:55.358477" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:32:55.358543" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:32:55.360898" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:32:55.356665" elapsed="0.004277"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:55.362481" 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-04-17T03:32:55.362215" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:55.362960" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:32:55.362691" elapsed="0.000315"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:32:55.369457" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:55.571141" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:55.973099" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:55.974972" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:32:55.365361" elapsed="0.612762">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:32:55.363073" elapsed="0.615208">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:55.978661" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:55.978348" elapsed="0.000415"/>
</branch>
<status status="FAIL" start="2026-04-17T03:32:55.363055" elapsed="0.615743">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:55.979449" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:55.979649" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:32:55.979593" elapsed="0.000120"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:55.979566" 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-04-17T03:32:55.979984" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:32:55.980082" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:32:55.361264" elapsed="0.618984">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:55.980359" 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-04-17T03:32:55.253215" elapsed="0.727285">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:55.980968" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:55.980629" elapsed="0.000441"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:55.980604" elapsed="0.000499"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:55.981147" elapsed="0.000019"/>
</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="FAIL" start="2026-04-17T03:32:55.243578" elapsed="0.737710">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:59.044675" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:32:59.044089" elapsed="0.000625"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:59.045659" 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-04-17T03:32:59.045346" elapsed="0.000400">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-04-17T03:32:59.045865" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:59.044938" elapsed="0.000955"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:32:59.046550" 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-04-17T03:32:59.046105" elapsed="0.000477"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:32:59.046960" 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-04-17T03:32:59.047149" 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-04-17T03:32:59.046773" elapsed="0.000406"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:59.047662" 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-04-17T03:32:59.047373" elapsed="0.000343"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:59.049000" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:32:59.048631" elapsed="0.000422"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:32:59.049596" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:32:59.049242" 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-04-17T03:32:59.050057" elapsed="0.000027"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:59.050306" elapsed="0.000028"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:59.050514" elapsed="0.000024"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:32:59.049863" elapsed="0.000716"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:32:59.049692" elapsed="0.000924"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:32:59.050675" elapsed="0.000042"/>
</return>
<msg time="2026-04-17T03:32:59.050872" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:32:59.048248" elapsed="0.002653"/>
</kw>
<status status="PASS" start="2026-04-17T03:32:59.047812" elapsed="0.003144"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:59.051165" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:59.050988" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:59.047782" elapsed="0.003470"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:32:59.051966" 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-04-17T03:32:59.051426" elapsed="0.000574"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:32:59.052056" 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/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-04-17T03:32:59.043230" elapsed="0.008972"/>
</kw>
<msg time="2026-04-17T03:32:59.052265" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:32:59.028513" elapsed="0.023809"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:32:59.065212" elapsed="0.000042"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:32:59.077688" elapsed="0.000040"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/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-04-17T03:32:59.090012" elapsed="0.000039"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:59.090267" 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-04-17T03:32:59.090453" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:59.090875" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:59.090724" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:59.090706" 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-04-17T03:32:59.091119" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:59.091285" elapsed="0.000050"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:59.091482" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:32:59.090666" elapsed="0.000869"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:32:59.090538" elapsed="0.001025"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:59.091708" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:59.091787" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:32:59.091957" 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-04-17T03:32:59.023708" elapsed="0.068278"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:59.093422" 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-04-17T03:32:59.093123" elapsed="0.000398">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-04-17T03:32:59.093617" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:59.092702" 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-04-17T03:32:59.093994" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:59.093714" elapsed="0.000337"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:32:59.094556" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:32:59.094255" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-17T03:32:59.094076" elapsed="0.000611"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:59.093695" elapsed="0.001017"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:32:59.097064" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:32:59.094865" elapsed="0.002226"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:32:59.097143" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:32:59.097302" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:32:59.092341" elapsed="0.004986"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:32:59.098652" 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-04-17T03:32:59.098416" elapsed="0.000300">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpfunctional/bgppolicies/topology_state/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-17T03:32:59.098810" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:32:59.098078" elapsed="0.000756"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:32:59.099059" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-17T03:32:59.098904" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-17T03:32:59.098886" elapsed="0.000258"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:32:59.099287" 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-04-17T03:32:59.099454" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:32:59.099518" elapsed="0.000014"/>
</return>
<msg time="2026-04-17T03:32:59.101584" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:32:59.097728" elapsed="0.003883"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:59.103044" 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-04-17T03:32:59.102769" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:32:59.103485" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:32:59.103240" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:32:59.108383" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:59.310197" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:59.712552" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:59.715085" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:32:59.105613" elapsed="0.615387">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:32:59.103592" elapsed="0.617633">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:59.721855" elapsed="0.000110"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:59.721314" elapsed="0.000793"/>
</branch>
<status status="FAIL" start="2026-04-17T03:32:59.103575" elapsed="0.618594">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:59.723269" elapsed="0.000083"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:59.723748" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:32:59.723659" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:59.723613" elapsed="0.000282"/>
</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-04-17T03:32:59.724345" elapsed="0.000057"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:32:59.724728" elapsed="0.000038"/>
</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-04-17T03:32:59.101943" elapsed="0.624012">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:59.726084" 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-04-17T03:32:58.998543" elapsed="0.727693">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:32:59.726620" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:32:59.726368" elapsed="0.000342"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:32:59.726349" elapsed="0.000391"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:32:59.726780" elapsed="0.000020"/>
</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="FAIL" start="2026-04-17T03:32:58.989612" elapsed="0.737302">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:33:02.793835" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:33:02.793069" elapsed="0.000817"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:33:02.795270" 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-04-17T03:33:02.794833" elapsed="0.000549">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-04-17T03:33:02.795530" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:33:02.794205" elapsed="0.001363"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:33:02.796446" 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-04-17T03:33:02.795813" elapsed="0.000676"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:33:02.796967" 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-04-17T03:33:02.797203" 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-04-17T03:33:02.796732" elapsed="0.000510"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:02.797848" 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-04-17T03:33:02.797475" elapsed="0.000439"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:02.799782" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:02.799270" elapsed="0.000577"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:33:02.800573" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:33:02.800169" elapsed="0.000441"/>
</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-04-17T03:33:02.801157" 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-04-17T03:33:02.801555" elapsed="0.000042"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:33:02.801889" elapsed="0.000065"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:33:02.800894" elapsed="0.001125"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:33:02.800685" elapsed="0.001386"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:33:02.802139" elapsed="0.000054"/>
</return>
<msg time="2026-04-17T03:33:02.802386" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:33:02.798678" elapsed="0.003749"/>
</kw>
<status status="PASS" start="2026-04-17T03:33:02.798137" elapsed="0.004414"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:02.802818" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:02.802595" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:02.798100" elapsed="0.004825"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:33:02.803718" 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-04-17T03:33:02.803160" elapsed="0.000585"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:33:02.803795" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state/${file_name}.</doc>
<status status="PASS" start="2026-04-17T03:33:02.791781" elapsed="0.012143"/>
</kw>
<msg time="2026-04-17T03:33:02.804020" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:33:02.777228" elapsed="0.026865"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:33:02.816688" elapsed="0.000054"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/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-04-17T03:33:02.829277" elapsed="0.000056"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-04-17T03:33:02.842080" elapsed="0.000064"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:02.842408" 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-04-17T03:33:02.842891" 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-04-17T03:33:02.843506" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:02.843331" elapsed="0.000236"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:33:02.843313" elapsed="0.000281"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:02.843739" 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-04-17T03:33:02.843915" elapsed="0.000038"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:02.844103" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:33:02.843270" elapsed="0.000888"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:33:02.843109" elapsed="0.001079"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:02.844336" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:33:02.844418" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:33:02.844590" 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-04-17T03:33:02.771904" elapsed="0.072714"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:33:02.846132" 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-04-17T03:33:02.845785" elapsed="0.000441">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-04-17T03:33:02.846342" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:33:02.845377" 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-04-17T03:33:02.846813" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:02.846442" elapsed="0.000445"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:33:02.847465" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:33:02.847138" elapsed="0.000361"/>
</kw>
<status status="PASS" start="2026-04-17T03:33:02.846921" elapsed="0.000621"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:02.846424" elapsed="0.001144"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:33:02.850013" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:33:02.847755" elapsed="0.002285"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:33:02.850093" elapsed="0.000034"/>
</return>
<msg time="2026-04-17T03:33:02.850253" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:33:02.845006" elapsed="0.005271"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:33:02.851588" 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-04-17T03:33:02.851346" elapsed="0.000308">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-04-17T03:33:02.851747" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:33:02.851010" elapsed="0.000761"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:33:02.851995" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:33:02.851842" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:02.851824" elapsed="0.000255"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:02.852238" 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-04-17T03:33:02.852444" elapsed="0.000024"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:33:02.852578" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:33:02.854809" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:33:02.850662" elapsed="0.004185"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:02.856457" 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-04-17T03:33:02.856167" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:02.856902" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:02.856659" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:33:02.862171" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:33:03.063635" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:33:03.466049" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:33:03.468331" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:33:02.859162" elapsed="0.612831">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:33:02.857049" elapsed="0.615092">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:33:03.472496" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:03.472200" elapsed="0.000417"/>
</branch>
<status status="FAIL" start="2026-04-17T03:33:02.857024" elapsed="0.615643">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:33:03.473417" elapsed="0.000057"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:33:03.473671" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:03.473613" elapsed="0.000121"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:33:03.473582" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:03.474074" elapsed="0.000047"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:33:03.474201" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:33:02.855267" elapsed="0.619097">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:33:03.474471" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:33:02.747899" elapsed="0.726711">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:33:03.475096" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:03.474772" elapsed="0.000524"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:33:03.474747" elapsed="0.000600"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:33:03.475415" elapsed="0.000030"/>
</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="FAIL" start="2026-04-17T03:33:02.737360" elapsed="0.738257">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:33:06.532785" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/topology_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:33:06.532366" elapsed="0.000455"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:33:06.533662" 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-04-17T03:33:06.533381" elapsed="0.000361">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-04-17T03:33:06.533838" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:33:06.533014" elapsed="0.000849"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:33:06.534449" 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-04-17T03:33:06.534045" elapsed="0.000432"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:33:06.534786" 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-04-17T03:33:06.534971" 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-04-17T03:33:06.534639" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:06.535478" 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-04-17T03:33:06.535173" elapsed="0.000367"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:06.536639" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:06.536330" elapsed="0.000354"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:33:06.537148" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:33:06.536843" elapsed="0.000338"/>
</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-04-17T03:33:06.537539" elapsed="0.000030"/>
</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-04-17T03:33:06.537772" elapsed="0.000029"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-04-17T03:33:06.537995" elapsed="0.000023"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:33:06.537387" elapsed="0.000668"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:33:06.537239" elapsed="0.000848"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:33:06.538133" elapsed="0.000047"/>
</return>
<msg time="2026-04-17T03:33:06.538334" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:33:06.535991" elapsed="0.002368"/>
</kw>
<status status="PASS" start="2026-04-17T03:33:06.535638" elapsed="0.002754"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:06.538571" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:06.538418" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:06.535609" elapsed="0.003040"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:33:06.539272" 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-04-17T03:33:06.538791" elapsed="0.000510"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:33:06.539423" 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/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-04-17T03:33:06.531674" elapsed="0.007897"/>
</kw>
<msg time="2026-04-17T03:33:06.539627" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:33:06.518964" elapsed="0.020713"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:33:06.553556" 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/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-04-17T03:33:06.566071" 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/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-04-17T03:33:06.579844" elapsed="0.000048"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:06.580154" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:06.580361" 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-04-17T03:33:06.580823" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:06.580651" elapsed="0.000232"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:33:06.580632" elapsed="0.000281"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:06.581092" 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-04-17T03:33:06.581278" 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-04-17T03:33:06.581460" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:33:06.580591" elapsed="0.000925"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:33:06.580450" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:06.581906" elapsed="0.000035"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:33:06.582008" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:33:06.582177" 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-04-17T03:33:06.514631" elapsed="0.067575"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:33:06.583871" 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-04-17T03:33:06.583533" elapsed="0.000439">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-04-17T03:33:06.584076" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:33:06.583077" elapsed="0.001026"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:06.584472" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:06.584180" elapsed="0.000360"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:33:06.585142" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:33:06.584800" elapsed="0.000370"/>
</kw>
<status status="PASS" start="2026-04-17T03:33:06.584572" elapsed="0.000636"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:06.584160" elapsed="0.001071"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:33:06.587686" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:33:06.585398" elapsed="0.002315"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:33:06.587766" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:33:06.587944" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:33:06.582664" elapsed="0.005307"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:33:06.589305" 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-04-17T03:33:06.589018" elapsed="0.000363">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-04-17T03:33:06.589495" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:33:06.588615" elapsed="0.000910"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:33:06.589774" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-04-17T03:33:06.589610" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:06.589589" elapsed="0.000288"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:06.590072" elapsed="0.000025"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:06.590270" elapsed="0.000023"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:33:06.590344" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:33:06.592689" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:33:06.588285" elapsed="0.004605"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:06.594382" 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-04-17T03:33:06.594122" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:06.594852" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:06.594599" 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="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:33:06.599807" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:33:06.801450" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:33:07.204500" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:33:07.207460" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:33:06.597052" elapsed="0.616086">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:33:06.594980" elapsed="0.618426">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:33:07.213821" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:07.213476" elapsed="0.000448"/>
</branch>
<status status="FAIL" start="2026-04-17T03:33:06.594961" elapsed="0.619022">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:33:07.214665" elapsed="0.000078"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:33:07.214997" elapsed="0.000047"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:07.214895" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:33:07.214855" elapsed="0.000290"/>
</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-04-17T03:33:07.215360" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:33:07.215462" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:33:06.593265" elapsed="0.622448">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:33:07.215870" elapsed="0.000031"/>
</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-04-17T03:33:06.492678" elapsed="0.723406">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:33:07.216492" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:07.216223" elapsed="0.000380"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:33:07.216198" elapsed="0.000438"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:33:07.216675" elapsed="0.000016"/>
</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="FAIL" start="2026-04-17T03:33:06.483311" elapsed="0.733486">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<msg time="2026-04-17T03:33:07.216968" level="FAIL">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying for 1 minute. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<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="FAIL" start="2026-04-17T03:32:06.549194" elapsed="60.667910">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying for 1 minute. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Checks that example-ipv4-topology is ready, and therefore full rib is ready to be configured.</doc>
<status status="FAIL" start="2026-04-17T03:32:06.548819" elapsed="60.668429">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying for 1 minute. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Checks empty example-ipv4-topology ready.</doc>
<status status="FAIL" start="2026-04-17T03:32:06.477024" elapsed="60.740497">Keyword 'TemplatedRequests.Get_As_Json_Templated' failed after retrying for 1 minute. The last error was: ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/network-topology:network-topology/topology=example-ipv4-topology (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:33:07.221472" elapsed="0.000276"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:33:07.221184" 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-04-17T03:33:07.222903" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:07.222772" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:07.222752" 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-04-17T03:33:07.228085" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:07.227969" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:07.227948" elapsed="0.000208"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:33:07.229235" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:33:07.228799" elapsed="0.000466"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:33:07.229751" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:33:07.229437" elapsed="0.000342"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:33:07.229825" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:33:07.230012" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:33:07.228403" 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-04-17T03:33:07.235641" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:07.235485" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:07.235456" elapsed="0.000258"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:33:07.237007" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:07.236864" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:07.236845" elapsed="0.000232"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:33:07.237561" level="INFO">${karaf_connection_index} = 16</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:33:07.237225" elapsed="0.000366"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:33:07.238017" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:33:07.237755" elapsed="0.000289"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:33:07.239081" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:33:07.238559" elapsed="0.001291">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:33:07.240066" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:33:07.240115" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:07.238204" elapsed="0.001935"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:33:07.240983" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:33:07.240711" elapsed="0.000943">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:33:07.241850" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:33:07.241898" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:07.240311" elapsed="0.001610"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:33:07.242909" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Configure_App_Peer"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:33:07.242256" elapsed="0.000762">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Configure_App_Peer"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:33:07.242026" elapsed="0.001085">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Configure_App_Peer"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:33:07.242005" elapsed="0.001222">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Configure_App_Peer"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:07.243434" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:07.243714" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:07.243529" elapsed="0.000249"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:33:07.243511" elapsed="0.000293"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:33:07.243838" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:33:07.246522" elapsed="0.000153"/>
</kw>
<msg time="2026-04-17T03:33:07.246747" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:33:07.245399" 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-04-17T03:33:07.247212" elapsed="0.000080"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:07.247555" 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-04-17T03:33:07.244734" elapsed="0.003043"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:33:07.244151" elapsed="0.003695"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:33:07.236540" elapsed="0.011414">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Configure_App_Peer"</status>
</kw>
<msg time="2026-04-17T03:33:07.248067" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:33:07.248112" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Configure_App_Peer"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:07.235875" elapsed="0.012261"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:33:07.248324" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:07.248214" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:07.248195" elapsed="0.000198"/>
</if>
<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-04-17T03:33:07.249357" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:07.249252" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:07.249234" elapsed="0.000190"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:33:07.249705" level="INFO">index=15
host=10.30.170.120
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-04-17T03:33:07.249810" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
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-04-17T03:33:07.249575" elapsed="0.000262"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:07.250295" level="INFO">{1: 16}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:07.250008" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:07.250737" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:07.250490" elapsed="0.000290"/>
</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-04-17T03:33:07.251321" elapsed="0.000265"/>
</kw>
<msg time="2026-04-17T03:33:07.251750" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:33:07.251797" level="INFO">${old_connection_index} = 16</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:07.250952" elapsed="0.000868"/>
</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-04-17T03:33:07.252649" elapsed="0.000194"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:33:07.254201" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:33:07.253585" elapsed="0.001529">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:07.253105" elapsed="0.002108"/>
</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-04-17T03:33:07.255891" elapsed="0.000298"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:07.255385" elapsed="0.000888"/>
</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-04-17T03:33:07.252138" elapsed="0.004181"/>
</kw>
<status status="PASS" start="2026-04-17T03:33:07.251896" elapsed="0.004551"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:07.251878" elapsed="0.004600"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:33:07.257390" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:33:07.257078" elapsed="0.000339"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:33:07.257467" elapsed="0.000032"/>
</return>
<msg time="2026-04-17T03:33:07.257622" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:33:07.256695" elapsed="0.000951"/>
</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-04-17T03:33:07.257798" elapsed="0.000459"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:33:07.258533" level="INFO">index=17
host=10.30.170.120
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-04-17T03:33:07.258655" level="INFO">${karaf_connection_object} = index=17
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:33:07.258425" elapsed="0.000261"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:33:07.258839" elapsed="0.002294"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:33:07.261607" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:33:07.262949" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:33:07.261302" elapsed="0.002039">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:33:07.276942" elapsed="0.000395"/>
</kw>
<msg time="2026-04-17T03:33:07.277433" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:33:07.275528" elapsed="0.002060"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:07.277748" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:07.277909" elapsed="0.000039"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:33:07.264211" elapsed="0.013801"/>
</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-04-17T03:33:07.263665" elapsed="0.014393"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:33:07.248850" elapsed="0.029295">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:07.278515" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:33:07.278590" 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="FAIL" start="2026-04-17T03:33:07.235100" elapsed="0.043606">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:33:07.278819" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:33:07.278862" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:07.230453" elapsed="0.048432"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:07.279534" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:07.279267" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:07.279243" elapsed="0.000371"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:33:07.230286" elapsed="0.049369"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:33:07.230101" elapsed="0.049592"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:33:07.227379" elapsed="0.052389"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:33:07.222462" elapsed="0.057431"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:07.221984" elapsed="0.057981"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:33:07.218611" elapsed="0.061414"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:33:07.280785" level="INFO">&amp;{mapping} = { RIB_INSTANCE_NAME=example-bgp-rib | APP_PEER_ID=10.30.170.120 | BGP_RIB_OPENCONFIG=example-bgp-rib | IP=10.30.170.120 }</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-04-17T03:33:07.280208" elapsed="0.000606"/>
</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-04-17T03:33:07.316538" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:33:07.315888" elapsed="0.000688"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:33:07.317468" 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-04-17T03:33:07.317145" elapsed="0.000406">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-04-17T03:33:07.317651" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:33:07.316760" elapsed="0.000916"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:33:07.318250" 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-04-17T03:33:07.317840" elapsed="0.000437"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:33:07.318596" 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-04-17T03:33:07.318783" 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-04-17T03:33:07.318437" elapsed="0.000372"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:07.319233" 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-04-17T03:33:07.318980" 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-04-17T03:33:07.320419" level="INFO">mapping: {'RIB_INSTANCE_NAME': 'example-bgp-rib', 'APP_PEER_ID': '10.30.170.120', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.170.120'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:07.320157" elapsed="0.000308"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:33:07.320890" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:33:07.320621" elapsed="0.000294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:33:07.321630" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:33:07.321317" elapsed="0.000339"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:33:07.322409" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:33:07.322181" elapsed="0.000254"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:33:07.322489" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:33:07.322654" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:33:07.321844" 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-04-17T03:33:07.322831" elapsed="0.000258"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:33:07.321179" elapsed="0.001950"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:33:07.323722" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:33:07.323385" elapsed="0.000363"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:33:07.324689" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:33:07.324477" elapsed="0.000296"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:33:07.324825" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:33:07.325004" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:33:07.323952" elapsed="0.001076"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:33:07.325196" elapsed="0.000223"/>
</kw>
<var name="${key}">APP_PEER_ID</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:33:07.323255" elapsed="0.002205"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:33:07.326144" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:33:07.325735" elapsed="0.000437"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:33:07.326887" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:33:07.326678" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:33:07.326978" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:33:07.327129" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:33:07.326360" elapsed="0.000793"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:33:07.327300" elapsed="0.000219"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:33:07.325571" elapsed="0.001988"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:33:07.328138" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:33:07.327824" elapsed="0.000340"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:33:07.328864" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:33:07.328657" elapsed="0.000231"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:33:07.328955" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:33:07.329113" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:33:07.328347" elapsed="0.000790"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:33:07.329282" elapsed="0.000220"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:33:07.327690" elapsed="0.001852"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:33:07.320992" elapsed="0.008586"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:33:07.329624" elapsed="0.000027"/>
</return>
<msg time="2026-04-17T03:33:07.329780" level="INFO">${mapping_to_use} = {'RIB_INSTANCE_NAME': 'example-bgp-rib', 'APP_PEER_ID': '10.30.170.120', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.170.120'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:33:07.319796" elapsed="0.010010"/>
</kw>
<status status="PASS" start="2026-04-17T03:33:07.319364" elapsed="0.010474"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:07.330025" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:07.329865" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:07.319335" elapsed="0.010767"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:33:07.330899" 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-04-17T03:33:07.330256" elapsed="0.000686"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:33:07.330992" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:33:07.315051" elapsed="0.016065"/>
</kw>
<msg time="2026-04-17T03:33:07.331172" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:33:07.302657" elapsed="0.028566"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:33:07.343442" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/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-04-17T03:33:07.355992" elapsed="0.000032"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:33:07.368458" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:07.368711" 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-04-17T03:33:07.368909" elapsed="0.000037"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:07.369313" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:07.369167" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:33:07.369151" 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-04-17T03:33:07.369532" 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-04-17T03:33:07.369697" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:07.369859" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:33:07.369118" elapsed="0.000793"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:33:07.369008" elapsed="0.000943"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:07.370096" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:33:07.370171" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:33:07.370305" 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-04-17T03:33:07.298530" elapsed="0.071802"/>
</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-04-17T03:33:07.394366" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer.vanadium/post_data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:33:07.393980" elapsed="0.000415"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:33:07.395156" 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-04-17T03:33:07.394889" elapsed="0.000347">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-04-17T03:33:07.395330" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:33:07.394556" elapsed="0.000804"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:33:07.395955" 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-04-17T03:33:07.395520" elapsed="0.000463"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:33:07.396281" 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-04-17T03:33:07.396483" 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-04-17T03:33:07.396143" elapsed="0.000369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:07.396922" 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-04-17T03:33:07.396673" elapsed="0.000315"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-17T03:33:07.397355" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:07.397058" elapsed="0.000355"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:33:07.397873" level="INFO">${mapping_to_use} = {'RIB_INSTANCE_NAME': 'example-bgp-rib', 'APP_PEER_ID': '10.30.170.120', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.170.120'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:33:07.397580" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-04-17T03:33:07.397438" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:07.397039" elapsed="0.000935"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:33:07.398738" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.120&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-04-17T03:33:07.398119" elapsed="0.000650"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:33:07.398819" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/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-04-17T03:33:07.393349" elapsed="0.005616"/>
</kw>
<msg time="2026-04-17T03:33:07.399020" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:33:07.381178" elapsed="0.017889"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:33:07.411156" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/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-04-17T03:33:07.423343" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:07.435223" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:07.435419" 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-04-17T03:33:07.435592" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:07.436008" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:07.435852" elapsed="0.000255"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:33:07.435837" elapsed="0.000297"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:07.436277" 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-04-17T03:33:07.436441" 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-04-17T03:33:07.436611" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:33:07.435803" elapsed="0.000861"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:33:07.435687" elapsed="0.001003"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:07.436833" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:33:07.436908" elapsed="0.000015"/>
</return>
<msg time="2026-04-17T03:33:07.437051" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.120&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-04-17T03:33:07.380267" elapsed="0.056813"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:33:07.438406" 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-04-17T03:33:07.438120" elapsed="0.000357">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-04-17T03:33:07.438569" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:33:07.437746" elapsed="0.000847"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:07.438910" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:07.438663" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:33:07.439476" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:33:07.439185" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-04-17T03:33:07.439006" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:07.438646" elapsed="0.000911"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:33:07.441851" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:33:07.439737" elapsed="0.002141"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:33:07.441941" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:33:07.442105" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:33:07.437413" elapsed="0.004717"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:07.443663" 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-04-17T03:33:07.443412" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:07.444130" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.120&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-04-17T03:33:07.443878" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:07.444566" 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-04-17T03:33:07.444324" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:07.445008" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:07.444756" elapsed="0.000295"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:33:07.445858" 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-04-17T03:33:07.445656" elapsed="0.000228"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:33:07.446323" 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-04-17T03:33:07.446092" elapsed="0.000257"/>
</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-04-17T03:33:07.446501" elapsed="0.000210"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:07.447129" 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-04-17T03:33:07.446863" elapsed="0.000310"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:33:07.447215" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:33:07.447371" 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-04-17T03:33:07.445250" elapsed="0.002145"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:33:07.452569" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-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>
<msg time="2026-04-17T03:33:07.654113" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-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>
<msg time="2026-04-17T03:33:08.056685" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-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>
<msg time="2026-04-17T03:33:08.059390" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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="FAIL" start="2026-04-17T03:33:07.449737" elapsed="0.612926">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:33:07.447465" elapsed="0.615351">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:33:08.063203" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:08.062879" elapsed="0.000422"/>
</branch>
<status status="FAIL" start="2026-04-17T03:33:07.447448" elapsed="0.615887">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:33:08.063976" elapsed="0.000040"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:33:08.064178" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:08.064123" elapsed="0.000115"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:33:08.064097" 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-04-17T03:33:08.064468" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:33:08.064561" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>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="FAIL" start="2026-04-17T03:33:07.442460" elapsed="0.622259">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:33:08.064901" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>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="FAIL" start="2026-04-17T03:33:07.285956" elapsed="0.779127">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:08.065495" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:08.065245" elapsed="0.000343"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:33:08.065222" elapsed="0.000399"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:33:08.065670" elapsed="0.000021"/>
</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="FAIL" start="2026-04-17T03:33:07.281117" elapsed="0.784691">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Post_As_Xml_Templated" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:33:08.066202" elapsed="0.000034"/>
</kw>
<doc>Configures bgp application peer, and configures it's routes.</doc>
<status status="FAIL" start="2026-04-17T03:33:07.218038" elapsed="0.848410">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:33:08.070463" elapsed="0.000261"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:33:08.070197" 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-04-17T03:33:08.071802" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:08.071682" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:08.071664" 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-04-17T03:33:08.076825" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:08.076718" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:08.076700" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:33:08.077896" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:33:08.077504" elapsed="0.000433"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:33:08.078398" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:33:08.078100" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:33:08.078469" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:33:08.078625" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:33:08.077129" elapsed="0.001520"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:33:08.084067" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:08.083955" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:08.083922" elapsed="0.000212"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:33:08.085313" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:08.085206" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:08.085189" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:33:08.085826" level="INFO">${karaf_connection_index} = 17</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:33:08.085523" elapsed="0.000362"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:33:08.086286" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:33:08.086063" elapsed="0.000249"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:33:08.087084" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:33:08.086809" elapsed="0.000875">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:33:08.087890" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:33:08.087951" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:08.086469" elapsed="0.001507"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:33:08.088756" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:33:08.088485" elapsed="0.000957">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:33:08.089625" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:33:08.089670" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:08.088143" elapsed="0.001551"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:33:08.090766" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Reconfigure_ODL_To_Accept_Connections"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:33:08.090010" elapsed="0.000819">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Reconfigure_ODL_To_Accept_Connections"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:33:08.089767" elapsed="0.001129">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Reconfigure_ODL_To_Accept_Connections"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:33:08.089749" elapsed="0.001197">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Reconfigure_ODL_To_Accept_Connections"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:08.091113" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:08.091340" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:08.091199" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:33:08.091182" elapsed="0.000233"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:33:08.091447" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:33:08.093986" elapsed="0.000142"/>
</kw>
<msg time="2026-04-17T03:33:08.094195" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:33:08.092906" 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-04-17T03:33:08.094593" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:08.094919" 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-04-17T03:33:08.092292" elapsed="0.002835"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:33:08.091717" 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="FAIL" start="2026-04-17T03:33:08.084875" elapsed="0.010397">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Reconfigure_ODL_To_Accept_Connections"</status>
</kw>
<msg time="2026-04-17T03:33:08.095372" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:33:08.095416" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Reconfigure_ODL_To_Accept_Connections"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:08.084282" elapsed="0.011157"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:33:08.095617" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:08.095513" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:08.095496" elapsed="0.000187"/>
</if>
<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-04-17T03:33:08.096500" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:08.096397" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:08.096380" elapsed="0.000185"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:33:08.096881" level="INFO">index=15
host=10.30.170.120
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-04-17T03:33:08.097023" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
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-04-17T03:33:08.096723" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:08.097463" level="INFO">{1: 17}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:08.097203" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:08.097902" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:08.097658" elapsed="0.000355"/>
</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-04-17T03:33:08.098535" elapsed="0.000259"/>
</kw>
<msg time="2026-04-17T03:33:08.098893" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:33:08.098956" level="INFO">${old_connection_index} = 17</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:08.098173" elapsed="0.000807"/>
</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-04-17T03:33:08.099783" elapsed="0.000260"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:33:08.101112" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:33:08.100686" elapsed="0.001345">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:08.100212" elapsed="0.001918"/>
</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-04-17T03:33:08.102752" elapsed="0.000290"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:08.102297" elapsed="0.000827"/>
</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-04-17T03:33:08.099274" elapsed="0.003895"/>
</kw>
<status status="PASS" start="2026-04-17T03:33:08.099055" elapsed="0.004162"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:08.099038" elapsed="0.004204"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:33:08.104102" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:33:08.103761" elapsed="0.000368"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:33:08.104177" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:33:08.104332" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:33:08.103443" elapsed="0.000913"/>
</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-04-17T03:33:08.104512" elapsed="0.000440"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:33:08.106808" level="INFO">index=18
host=10.30.170.120
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-04-17T03:33:08.106915" level="INFO">${karaf_connection_object} = index=18
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:33:08.105120" elapsed="0.001837"/>
</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-04-17T03:33:08.107112" elapsed="0.002164"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:33:08.109701" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:33:08.111077" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:33:08.109439" elapsed="0.002015">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:33:08.124904" elapsed="0.000627"/>
</kw>
<msg time="2026-04-17T03:33:08.125620" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:33:08.123572" elapsed="0.002198"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:08.125956" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:08.126122" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:33:08.112450" elapsed="0.013803"/>
</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-04-17T03:33:08.111733" elapsed="0.014568"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:33:08.096109" elapsed="0.030274">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:08.126718" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:33:08.126793" 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="FAIL" start="2026-04-17T03:33:08.083551" elapsed="0.043348">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:33:08.127026" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:33:08.127070" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:08.079033" elapsed="0.048061"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:08.127419" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:08.127171" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:08.127153" elapsed="0.000345"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:33:08.078877" elapsed="0.048644"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:33:08.078705" elapsed="0.048846"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:33:08.076350" elapsed="0.051259"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:33:08.071391" elapsed="0.056274"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:08.070945" elapsed="0.056764"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:33:08.067672" elapsed="0.060088"/>
</kw>
<for flavor="IN ZIP">
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:33:08.128801" 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-04-17T03:33:08.128228" 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-04-17T03:33:08.162578" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:33:08.162191" elapsed="0.000418"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:33:08.163403" 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-04-17T03:33:08.163125" elapsed="0.000351">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-04-17T03:33:08.163570" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:33:08.162775" elapsed="0.000820"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:33:08.164185" 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-04-17T03:33:08.163759" elapsed="0.000453"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:33:08.164510" 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-04-17T03:33:08.164704" 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-04-17T03:33:08.164372" elapsed="0.000401"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:08.165197" 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-04-17T03:33:08.164947" 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-04-17T03:33:08.166217" 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-04-17T03:33:08.165959" elapsed="0.000303"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:33:08.166688" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:33:08.166418" elapsed="0.000295"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:33:08.167388" 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-04-17T03:33:08.167093" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:33:08.168430" 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-04-17T03:33:08.167962" elapsed="0.000495"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:33:08.168510" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:33:08.168671" 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-04-17T03:33:08.167599" elapsed="0.001099"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:33:08.168848" elapsed="0.000272"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-04-17T03:33:08.166958" elapsed="0.002202"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:33:08.169701" 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-04-17T03:33:08.169406" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:33:08.170670" 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-04-17T03:33:08.170241" elapsed="0.000455"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:33:08.170746" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:33:08.170897" 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-04-17T03:33:08.169909" elapsed="0.001013"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:33:08.171087" elapsed="0.000222"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:33:08.169273" elapsed="0.002075"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:33:08.171906" 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-04-17T03:33:08.171588" elapsed="0.000358"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:33:08.173075" 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-04-17T03:33:08.172605" elapsed="0.000497"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:33:08.173152" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:33:08.173304" 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-04-17T03:33:08.172129" 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-04-17T03:33:08.173477" elapsed="0.000221"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:33:08.171458" elapsed="0.002280"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:33:08.174308" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:33:08.174012" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:33:08.175271" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:33:08.174829" elapsed="0.000468"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:33:08.175346" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:33:08.175496" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:33:08.174516" 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-04-17T03:33:08.175669" elapsed="0.000249"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:33:08.173849" elapsed="0.002126"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:33:08.176515" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:33:08.176220" elapsed="0.000356"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:33:08.177541" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:33:08.177109" elapsed="0.000458"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:33:08.177622" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:33:08.177773" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:33:08.176763" elapsed="0.001035"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:33:08.177999" elapsed="0.000227"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:33:08.176089" elapsed="0.002177"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:33:08.166766" elapsed="0.011535"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:33:08.178343" elapsed="0.000027"/>
</return>
<msg time="2026-04-17T03:33:08.178500" 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-04-17T03:33:08.165623" elapsed="0.012902"/>
</kw>
<status status="PASS" start="2026-04-17T03:33:08.165316" elapsed="0.013241"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:08.178727" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:08.178582" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:08.165295" elapsed="0.013508"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:33:08.179597" 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-04-17T03:33:08.178960" elapsed="0.000667"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:33:08.179675" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:33:08.161546" elapsed="0.018255"/>
</kw>
<msg time="2026-04-17T03:33:08.179857" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:33:08.148956" elapsed="0.031000"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:33:08.192026" 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/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-04-17T03:33:08.204266" 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/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-04-17T03:33:08.216304" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:08.216519" 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-04-17T03:33:08.216736" elapsed="0.000036"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:08.217376" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:08.217170" elapsed="0.000284"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:33:08.217148" 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-04-17T03:33:08.217686" 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-04-17T03:33:08.217918" elapsed="0.000048"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:08.218170" elapsed="0.000028"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:33:08.217102" elapsed="0.001141"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:33:08.216947" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:08.218478" elapsed="0.000027"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:33:08.218585" elapsed="0.000024"/>
</return>
<msg time="2026-04-17T03:33:08.218778" 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-04-17T03:33:08.144570" elapsed="0.074246"/>
</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-04-17T03:33:08.246582" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/data.xml</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:33:08.246189" elapsed="0.000422"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:33:08.247373" 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-04-17T03:33:08.247124" elapsed="0.000323">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-04-17T03:33:08.247542" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:33:08.246774" elapsed="0.000793"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:33:08.248169" 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-04-17T03:33:08.247729" elapsed="0.000480"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:33:08.248561" 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-04-17T03:33:08.248733" 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-04-17T03:33:08.248413" elapsed="0.000349"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:08.249180" 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-04-17T03:33:08.248919" elapsed="0.000377"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-04-17T03:33:08.249684" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:08.249370" elapsed="0.000373"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:33:08.250264" level="INFO">${mapping_to_use} = {'IP': '127.0.0.1', 'HOLDTIME': '180', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:33:08.249914" elapsed="0.000378"/>
</kw>
<status status="PASS" start="2026-04-17T03:33:08.249770" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:08.249349" elapsed="0.001004"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:33:08.251651" 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-04-17T03:33:08.250535" elapsed="0.001148"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:33:08.251739" 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/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-04-17T03:33:08.245548" elapsed="0.006377"/>
</kw>
<msg time="2026-04-17T03:33:08.252015" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:33:08.233086" elapsed="0.018984"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:33:08.264706" elapsed="0.000037"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/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-04-17T03:33:08.277001" elapsed="0.000033"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/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-04-17T03:33:08.289270" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:08.289527" 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-04-17T03:33:08.289715" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:08.290193" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:08.290034" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:33:08.290016" 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-04-17T03:33:08.290425" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:08.290608" 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-04-17T03:33:08.290778" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:33:08.289970" elapsed="0.000862"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:33:08.289801" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:08.291126" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:33:08.291210" elapsed="0.000018"/>
</return>
<msg time="2026-04-17T03:33:08.291425" 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-04-17T03:33:08.230409" elapsed="0.061049"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:33:08.293026" 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-04-17T03:33:08.292674" elapsed="0.000439">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-04-17T03:33:08.293210" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:33:08.292246" 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-04-17T03:33:08.293569" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:08.293307" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:33:08.294417" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:33:08.294105" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-04-17T03:33:08.293652" elapsed="0.000829"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:08.293288" elapsed="0.001216"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:33:08.296855" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:33:08.294659" elapsed="0.002233"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:33:08.296977" elapsed="0.000036"/>
</return>
<msg time="2026-04-17T03:33:08.297146" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:33:08.291825" elapsed="0.005347"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:08.298595" 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-04-17T03:33:08.298339" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:08.299063" 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-04-17T03:33:08.298797" elapsed="0.000398"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:08.299607" 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-04-17T03:33:08.299354" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:08.300100" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:08.299806" elapsed="0.000339"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-17T03:33:08.300997" 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-04-17T03:33:08.300775" elapsed="0.000249"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-17T03:33:08.301366" 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-04-17T03:33:08.301189" elapsed="0.000207"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:33:08.301560" elapsed="0.000218"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:08.302216" 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-04-17T03:33:08.301948" elapsed="0.000313"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-17T03:33:08.302304" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:33:08.302460" 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-04-17T03:33:08.300348" elapsed="0.002138"/>
</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-04-17T03:33:08.307630" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:33:08.509263" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:33:08.912177" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:33:08.915586" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-17T03:33:08.304622" elapsed="0.617216">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:33:08.302555" elapsed="0.619706">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:08.922970" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:08.922410" elapsed="0.000760"/>
</branch>
<status status="FAIL" start="2026-04-17T03:33:08.302538" elapsed="0.620711">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:08.924592" elapsed="0.000055"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:33:08.924822" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:08.924762" elapsed="0.000129"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:33:08.924731" 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-04-17T03:33:08.925258" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:33:08.925358" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>content_type=${content_type}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:33:08.297501" elapsed="0.628034">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:33:08.925648" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>extension=xml</arg>
<arg>accept=${ACCEPT_XML}</arg>
<arg>content_type=${HEADERS_XML}</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=False</arg>
<arg>endline=${\n}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve URI and data from folder, call Put_To_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:33:08.133845" elapsed="0.791944">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Xml_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=response</arg>
<arg>mapping=${mapping}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected XML data, should be equal to provided ${response}.
Endline set to empty, as this Resource does not support indented XML comparison.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:08.926243" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:08.925972" elapsed="0.000366"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:33:08.925923" elapsed="0.000449"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:33:08.926422" elapsed="0.000028"/>
</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="FAIL" start="2026-04-17T03:33:08.129351" elapsed="0.797254">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<var name="${index}">1</var>
<var name="${peer_type}">ibgp_peer</var>
<status status="FAIL" start="2026-04-17T03:33:08.128065" elapsed="0.798642">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</iter>
<var>${index}</var>
<var>${peer_type}</var>
<value>${NUMBERS}</value>
<value>${PEER_TYPES}</value>
<status status="FAIL" start="2026-04-17T03:33:08.127820" elapsed="0.798988">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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="FAIL" start="2026-04-17T03:33:08.066743" elapsed="0.860370">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:33:08.933279" elapsed="0.000557"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:33:08.932712" elapsed="0.001288"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:33:08.936289" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:08.935920" elapsed="0.000481"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:08.935868" elapsed="0.000582"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:33:08.942784" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:08.942642" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:08.942616" elapsed="0.000258"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:33:08.944433" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:33:08.943629" elapsed="0.000838"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:33:08.945126" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:33:08.944776" elapsed="0.000377"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:33:08.945200" elapsed="0.000048"/>
</return>
<msg time="2026-04-17T03:33:08.945382" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:33:08.943213" elapsed="0.002193"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:33:08.950885" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:08.950764" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:08.950744" elapsed="0.000227"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:33:08.952586" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:08.952434" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:08.952409" elapsed="0.000272"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:33:08.953337" level="INFO">${karaf_connection_index} = 18</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:33:08.952893" elapsed="0.000482"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:33:08.953911" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:33:08.953602" elapsed="0.000363"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:33:08.955341" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:33:08.954659" elapsed="0.001764">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:33:08.956680" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:33:08.956746" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:08.954190" elapsed="0.002588"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:33:08.957664" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:33:08.957400" elapsed="0.001036">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:33:08.958650" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:33:08.958702" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:08.957029" elapsed="0.001699"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:33:08.959739" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Start_Exabgps"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:33:08.959090" elapsed="0.000713">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Start_Exabgps"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:33:08.958830" elapsed="0.001051">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Start_Exabgps"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:33:08.958804" elapsed="0.001111">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Start_Exabgps"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:08.960132" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:08.960360" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:08.960221" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:33:08.960205" elapsed="0.000231"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:33:08.960470" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:33:08.963191" elapsed="0.000151"/>
</kw>
<msg time="2026-04-17T03:33:08.963425" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:33:08.962065" 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-04-17T03:33:08.963859" elapsed="0.000137"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:08.964389" 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-04-17T03:33:08.961390" elapsed="0.003221"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:33:08.960764" elapsed="0.003975"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:33:08.952027" elapsed="0.012805">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Start_Exabgps"</status>
</kw>
<msg time="2026-04-17T03:33:08.965010" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:33:08.965058" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Start_Exabgps"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:08.951163" elapsed="0.013919"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:33:08.965274" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:08.965163" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:08.965144" elapsed="0.000197"/>
</if>
<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-04-17T03:33:08.966248" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:08.966135" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:08.966116" elapsed="0.000198"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:33:08.966635" level="INFO">index=15
host=10.30.170.120
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-04-17T03:33:08.966745" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
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-04-17T03:33:08.966487" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:08.967216" level="INFO">{1: 18}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:08.966925" elapsed="0.000365"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:08.967728" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:08.967454" elapsed="0.000319"/>
</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-04-17T03:33:08.968360" elapsed="0.000281"/>
</kw>
<msg time="2026-04-17T03:33:08.968742" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:33:08.968787" level="INFO">${old_connection_index} = 18</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:08.967963" elapsed="0.000846"/>
</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-04-17T03:33:08.969747" elapsed="0.000216"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:33:08.971348" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:33:08.970912" elapsed="0.001484">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:08.970158" elapsed="0.002349"/>
</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-04-17T03:33:08.973236" elapsed="0.000279"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:08.972723" elapsed="0.000878"/>
</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-04-17T03:33:08.969220" elapsed="0.004428"/>
</kw>
<status status="PASS" start="2026-04-17T03:33:08.968889" elapsed="0.004809"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:08.968866" elapsed="0.004857"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:33:08.974588" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:33:08.974275" elapsed="0.000340"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:33:08.974665" elapsed="0.000205"/>
</return>
<msg time="2026-04-17T03:33:08.975010" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:33:08.973944" elapsed="0.001091"/>
</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-04-17T03:33:08.975194" elapsed="0.000449"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:33:08.975925" level="INFO">index=19
host=10.30.170.120
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-04-17T03:33:08.976056" level="INFO">${karaf_connection_object} = index=19
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:33:08.975818" elapsed="0.000325"/>
</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-04-17T03:33:08.976300" elapsed="0.002419"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:33:08.979235" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:33:08.980460" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:33:08.978919" elapsed="0.002098">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:33:08.997627" elapsed="0.000558"/>
</kw>
<msg time="2026-04-17T03:33:08.998314" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:33:08.995646" elapsed="0.002852"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:08.998667" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:08.998831" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:33:08.981874" elapsed="0.017075"/>
</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-04-17T03:33:08.981310" elapsed="0.017710"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:33:08.965800" elapsed="0.033339">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:08.999557" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:33:08.999647" 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="FAIL" start="2026-04-17T03:33:08.950380" elapsed="0.049395">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:33:08.999911" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:33:08.999990" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:08.945823" elapsed="0.054193"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:09.000420" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:09.000138" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:09.000111" elapsed="0.000392"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:33:08.945672" elapsed="0.054857"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:33:08.945476" elapsed="0.055091"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:33:08.942100" elapsed="0.058533"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:33:08.935264" elapsed="0.065431"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:08.934248" elapsed="0.066507"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:33:08.928813" elapsed="0.072028"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:33:09.004797" 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-04-17T03:33:09.001562" elapsed="0.003306"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-17T03:33:09.009060" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<msg time="2026-04-17T03:33:09.009173" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:33:09.005106" elapsed="0.004094"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:09.009913" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:09.009562" elapsed="0.000555"/>
</kw>
<status status="PASS" start="2026-04-17T03:33:09.009287" elapsed="0.000865"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:09.009260" elapsed="0.000920"/>
</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-04-17T03:33:09.001151" elapsed="0.009189"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:33:09.011147" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exabgp1.cfg &gt; exa1.log &amp;</msg>
<var>${start_cmd}</var>
<arg>${CMD} exabgp${index}.cfg &gt; exa${index}.log &amp;</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:33:09.010731" elapsed="0.000445"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:09.011617" 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-04-17T03:33:09.011335" elapsed="0.000328"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:33:09.013823" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exabgp1.cfg &gt; exa1.log &amp;</msg>
<msg time="2026-04-17T03:33:09.013987" 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-04-17T03:33:09.011815" elapsed="0.002204"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:09.014850" 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-04-17T03:33:09.014183" elapsed="0.000725"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:33:09.010588" elapsed="0.004422"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:33:09.015651" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exabgp2.cfg &gt; exa2.log &amp;</msg>
<var>${start_cmd}</var>
<arg>${CMD} exabgp${index}.cfg &gt; exa${index}.log &amp;</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:33:09.015273" elapsed="0.000406"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:09.016142" 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-04-17T03:33:09.015838" elapsed="0.000349"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:33:09.016951" level="INFO">[?2004l[1] 5349</msg>
<msg time="2026-04-17T03:33:09.017043" level="INFO">${output} = [?2004l[1] 5349
</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-04-17T03:33:09.016340" elapsed="0.000729"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:09.017474" level="INFO">[?2004l[1] 5349
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:09.017227" elapsed="0.000347"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-17T03:33:09.015133" elapsed="0.002487"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:33:09.018224" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exabgp3.cfg &gt; exa3.log &amp;</msg>
<var>${start_cmd}</var>
<arg>${CMD} exabgp${index}.cfg &gt; exa${index}.log &amp;</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:33:09.017861" elapsed="0.000391"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:09.018725" 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-04-17T03:33:09.018406" elapsed="0.000383"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:33:09.020868" level="INFO">[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt; env exabgp.tcp.port=1790 exabgp --debug exabgp2.cfg &gt; exa2.log &amp;</msg>
<msg time="2026-04-17T03:33:09.021025" level="INFO">${output} = [?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:33:09.019006" elapsed="0.002060"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:09.021617" level="INFO">[?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:33:09.021284" elapsed="0.000397"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-17T03:33:09.017725" elapsed="0.004002"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:33:09.022547" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exabgp4.cfg &gt; exa4.log &amp;</msg>
<var>${start_cmd}</var>
<arg>${CMD} exabgp${index}.cfg &gt; exa${index}.log &amp;</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:33:09.022079" elapsed="0.000505"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:09.023182" 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-04-17T03:33:09.022801" elapsed="0.000463"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:33:09.024301" level="INFO">[?2004l[2] 5350</msg>
<msg time="2026-04-17T03:33:09.024423" level="INFO">${output} = [?2004l[2] 5350
</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-04-17T03:33:09.023482" elapsed="0.000978"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:09.025163" level="INFO">[?2004l[2] 5350
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:09.024691" elapsed="0.000551"/>
</kw>
<var name="${index}">4</var>
<status status="PASS" start="2026-04-17T03:33:09.021861" elapsed="0.003428"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:33:09.026147" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exabgp5.cfg &gt; exa5.log &amp;</msg>
<var>${start_cmd}</var>
<arg>${CMD} exabgp${index}.cfg &gt; exa${index}.log &amp;</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:33:09.025657" elapsed="0.000531"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:09.026717" 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-04-17T03:33:09.026395" elapsed="0.000381"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:33:09.029080" level="INFO">[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt; env exabgp.tcp.port=1790 exabgp --debug exabgp3.cfg &gt; exa3.log &amp;</msg>
<msg time="2026-04-17T03:33:09.029219" level="INFO">${output} = [?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:33:09.027002" elapsed="0.002685"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:09.030354" level="INFO">[?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:33:09.029968" elapsed="0.000454"/>
</kw>
<var name="${index}">5</var>
<status status="PASS" start="2026-04-17T03:33:09.025438" elapsed="0.005022"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:33:09.031091" level="INFO">${start_cmd} = env exabgp.tcp.port=1790 exabgp --debug exabgp6.cfg &gt; exa6.log &amp;</msg>
<var>${start_cmd}</var>
<arg>${CMD} exabgp${index}.cfg &gt; exa${index}.log &amp;</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:33:09.030722" elapsed="0.000397"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:09.031576" 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-04-17T03:33:09.031319" elapsed="0.000317"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:33:09.032403" level="INFO">[?2004l[3] 5351</msg>
<msg time="2026-04-17T03:33:09.032506" level="INFO">${output} = [?2004l[3] 5351
</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-04-17T03:33:09.031844" elapsed="0.000693"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:09.033192" level="INFO">[?2004l[3] 5351
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:09.032791" elapsed="0.000467"/>
</kw>
<var name="${index}">6</var>
<status status="PASS" start="2026-04-17T03:33:09.030582" elapsed="0.002723"/>
</iter>
<var>${index}</var>
<value>@{NUMBERS}</value>
<status status="PASS" start="2026-04-17T03:33:09.010414" elapsed="0.022933"/>
</for>
<doc>Start 6 exabgps as processes in background, each with it's own configuration.</doc>
<status status="PASS" start="2026-04-17T03:33:08.927465" elapsed="0.106061"/>
</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-04-17T03:33:09.038439" elapsed="0.000221"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:33:09.038142" 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-04-17T03:33:09.040592" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:09.040444" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:09.040412" elapsed="0.000259"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:33:09.045791" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:09.045682" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:09.045664" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:33:09.046963" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:33:09.046546" elapsed="0.000447"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:33:09.047549" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:33:09.047185" elapsed="0.000391"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:33:09.047621" elapsed="0.000039"/>
</return>
<msg time="2026-04-17T03:33:09.047811" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:33:09.046138" elapsed="0.001699"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:33:09.054013" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:09.053872" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:09.053853" 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-04-17T03:33:09.055343" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:09.055235" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:09.055217" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:33:09.055867" level="INFO">${karaf_connection_index} = 19</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:33:09.055554" elapsed="0.000340"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:33:09.056340" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:33:09.056073" elapsed="0.000294"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:33:09.057293" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:33:09.056860" elapsed="0.001319">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:33:09.058381" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:33:09.058427" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:09.056525" elapsed="0.001926"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:33:09.059309" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:33:09.059055" elapsed="0.000937">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:33:09.060224" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:33:09.060271" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:09.058691" elapsed="0.001603"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:33:09.061285" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Verify_Rib_Filled"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:33:09.060594" elapsed="0.000755">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Verify_Rib_Filled"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:33:09.060370" elapsed="0.001052">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Verify_Rib_Filled"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:33:09.060351" elapsed="0.001106">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Verify_Rib_Filled"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:09.061619" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:09.061880" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:09.061706" elapsed="0.000268"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:33:09.061689" elapsed="0.000318"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:33:09.062051" elapsed="0.000021"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:33:09.064864" elapsed="0.000175"/>
</kw>
<msg time="2026-04-17T03:33:09.065112" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:33:09.063751" 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-04-17T03:33:09.065525" elapsed="0.000088"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:09.065880" 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-04-17T03:33:09.063083" elapsed="0.003058"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:33:09.062417" elapsed="0.003791"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:33:09.054885" elapsed="0.011411">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Verify_Rib_Filled"</status>
</kw>
<msg time="2026-04-17T03:33:09.066400" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:33:09.066444" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Verify_Rib_Filled"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:09.054267" elapsed="0.012200"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:33:09.066684" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:09.066544" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:09.066526" elapsed="0.000227"/>
</if>
<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-04-17T03:33:09.067719" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:09.067604" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:09.067581" elapsed="0.000205"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:33:09.068176" level="INFO">index=15
host=10.30.170.120
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-04-17T03:33:09.068284" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
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-04-17T03:33:09.068022" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:09.068735" level="INFO">{1: 19}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:09.068461" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:09.069281" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:09.069027" elapsed="0.000298"/>
</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-04-17T03:33:09.069871" elapsed="0.000374"/>
</kw>
<msg time="2026-04-17T03:33:09.070346" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:33:09.070450" level="INFO">${old_connection_index} = 19</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:09.069480" elapsed="0.000996"/>
</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-04-17T03:33:09.071362" elapsed="0.000199"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:33:09.072968" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:33:09.072296" elapsed="0.001681">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:09.071739" elapsed="0.002378"/>
</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-04-17T03:33:09.074807" elapsed="0.000313"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:09.074293" elapsed="0.000915"/>
</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-04-17T03:33:09.070800" elapsed="0.004455"/>
</kw>
<status status="PASS" start="2026-04-17T03:33:09.070552" elapsed="0.004752"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:09.070534" elapsed="0.004795"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:33:09.076260" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:33:09.075894" elapsed="0.000393"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:33:09.076335" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:33:09.076487" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:33:09.075533" elapsed="0.000979"/>
</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-04-17T03:33:09.076664" elapsed="0.000471"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:33:09.077443" level="INFO">index=20
host=10.30.170.120
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-04-17T03:33:09.077544" level="INFO">${karaf_connection_object} = index=20
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:33:09.077332" elapsed="0.000239"/>
</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-04-17T03:33:09.077896" elapsed="0.003113"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:33:09.081482" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:33:09.083333" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:33:09.081173" elapsed="0.002578">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:33:09.099624" elapsed="0.000451"/>
</kw>
<msg time="2026-04-17T03:33:09.100213" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:33:09.097793" elapsed="0.002668"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:09.100625" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:09.100787" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:33:09.084759" elapsed="0.016111"/>
</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-04-17T03:33:09.084066" elapsed="0.016853"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:33:09.067302" elapsed="0.034130">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:09.101963" elapsed="0.000050"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:33:09.102068" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:33:09.053481" elapsed="0.048705">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:33:09.102460" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:33:09.102507" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:09.048313" elapsed="0.054217"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:09.102895" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:09.102618" elapsed="0.000421"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:09.102596" elapsed="0.000470"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:33:09.048135" elapsed="0.054956"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:33:09.047902" elapsed="0.055224"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:33:09.045311" elapsed="0.057879"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:33:09.039410" elapsed="0.063840"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:09.038876" elapsed="0.064421"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:33:09.034704" elapsed="0.068649"/>
</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-04-17T03:33:09.171189" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/rib_state.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:33:09.170749" elapsed="0.000479"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:33:09.172245" 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-04-17T03:33:09.171753" elapsed="0.000579">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-04-17T03:33:09.172430" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:33:09.171409" elapsed="0.001046"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:33:09.173039" 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-04-17T03:33:09.172622" elapsed="0.000446"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:33:09.173373" 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-04-17T03:33:09.173574" 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-04-17T03:33:09.173227" elapsed="0.000372"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:09.174021" 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-04-17T03:33:09.173756" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:09.175101" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:09.174828" elapsed="0.000317"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:33:09.175573" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:33:09.175302" elapsed="0.000297"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:09.175960" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:09.176205" 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-04-17T03:33:09.176394" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-17T03:33:09.175806" elapsed="0.000646"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-17T03:33:09.175658" elapsed="0.000825"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:33:09.176535" elapsed="0.000038"/>
</return>
<msg time="2026-04-17T03:33:09.176776" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:33:09.174506" elapsed="0.002296"/>
</kw>
<status status="PASS" start="2026-04-17T03:33:09.174153" elapsed="0.002680"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:09.177024" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:09.176859" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:09.174125" elapsed="0.002976"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:33:09.177720" 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-04-17T03:33:09.177261" elapsed="0.000487"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:33:09.177798" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:33:09.170041" elapsed="0.007881"/>
</kw>
<msg time="2026-04-17T03:33:09.177994" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:33:09.153823" elapsed="0.024222"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:33:09.190719" 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/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-04-17T03:33:09.203440" elapsed="0.000040"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/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-04-17T03:33:09.216380" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:09.216638" 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-04-17T03:33:09.216850" 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-04-17T03:33:09.217334" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:09.217176" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:33:09.217157" 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-04-17T03:33:09.217565" 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-04-17T03:33:09.217750" 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-04-17T03:33:09.217917" elapsed="0.000036"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:33:09.217116" elapsed="0.000870"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:33:09.216979" elapsed="0.001035"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:09.218160" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:33:09.218239" elapsed="0.000017"/>
</return>
<msg time="2026-04-17T03:33:09.218470" 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-04-17T03:33:09.146790" elapsed="0.071709"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:33:09.219909" 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-04-17T03:33:09.219599" elapsed="0.000408">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-04-17T03:33:09.220102" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:33:09.219204" elapsed="0.000922"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:09.220498" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:09.220233" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:33:09.221145" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:33:09.220793" elapsed="0.000381"/>
</kw>
<status status="PASS" start="2026-04-17T03:33:09.220579" elapsed="0.000632"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:09.220214" elapsed="0.001017"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:33:09.223542" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:33:09.221384" elapsed="0.002186"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-17T03:33:09.223623" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:33:09.223783" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<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-04-17T03:33:09.218833" elapsed="0.004975"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:33:09.225135" 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-04-17T03:33:09.224855" elapsed="0.000346">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-04-17T03:33:09.225332" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:33:09.224514" elapsed="0.000852"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-17T03:33:09.225579" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-17T03:33:09.225441" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:09.225423" elapsed="0.000240"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:09.225809" 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-04-17T03:33:09.226001" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-17T03:33:09.226068" elapsed="0.000014"/>
</return>
<msg time="2026-04-17T03:33:09.228232" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<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-04-17T03:33:09.224182" elapsed="0.004082"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:09.229702" 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-04-17T03:33:09.229443" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:09.230164" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:09.229902" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:33:09.235362" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:33:09.437024" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:33:09.839917" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:33:09.842460" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${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-04-17T03:33:09.232373" elapsed="0.614338">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:33:09.230283" elapsed="0.616630">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:33:09.847522" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:09.847029" elapsed="0.000625"/>
</branch>
<status status="FAIL" start="2026-04-17T03:33:09.230264" elapsed="0.617426">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:33:09.848394" elapsed="0.000042"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:33:09.848608" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:09.848549" elapsed="0.000126"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:33:09.848518" elapsed="0.000188"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:09.848918" elapsed="0.000054"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-17T03:33:09.849043" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-17T03:33:09.228586" elapsed="0.620621">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:33:09.849315" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-17T03:33:09.122371" elapsed="0.727083">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:33:09.849841" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:09.849588" elapsed="0.000372"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:33:09.849562" elapsed="0.000435"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:33:09.850044" elapsed="0.000021"/>
</return>
<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="FAIL" start="2026-04-17T03:33:09.114858" elapsed="0.735326">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:09.850433" elapsed="0.000029"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:33:09.850838" elapsed="0.000030"/>
</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}/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="NOT RUN" start="2026-04-17T03:33:09.851104" elapsed="0.000030"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-17T03:33:09.850637" elapsed="0.000563"/>
</iter>
<var>${index}</var>
<value>@{NUMBERS}</value>
<status status="NOT RUN" start="2026-04-17T03:33:09.850540" elapsed="0.000776"/>
</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-04-17T03:33:09.851542" 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-04-17T03:33:09.851787" elapsed="0.000029"/>
</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-04-17T03:33:09.107100" elapsed="0.744878">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<doc>Verifies that sent routes are present in particular ribs.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-17T03:33:09.033953" elapsed="0.818270">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with url: /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:33:09.857484" elapsed="0.000263"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:33:09.857212" elapsed="0.000593"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:33:09.858865" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:09.858736" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:09.858714" 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-04-17T03:33:09.863799" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:09.863688" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:09.863669" elapsed="0.000198"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:33:09.864952" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:33:09.864533" elapsed="0.000449"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:33:09.865491" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:33:09.865142" elapsed="0.000377"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:33:09.865563" elapsed="0.000035"/>
</return>
<msg time="2026-04-17T03:33:09.865726" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:33:09.864113" elapsed="0.001639"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:33:09.871135" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:09.871025" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:09.871006" 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-04-17T03:33:09.872447" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:09.872335" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:09.872291" elapsed="0.000224"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:33:09.872989" level="INFO">${karaf_connection_index} = 20</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:33:09.872661" elapsed="0.000356"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:33:09.873401" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:33:09.873177" elapsed="0.000250"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:33:09.874341" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:33:09.873921" elapsed="0.001192">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:33:09.875306" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:33:09.875353" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:09.873585" elapsed="0.001791"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:33:09.876166" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:33:09.875890" elapsed="0.000992">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:33:09.877288" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:33:09.877350" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:09.875546" elapsed="0.001836"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:33:09.878353" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Stop_All_Peers"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:33:09.877704" elapsed="0.000712">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Stop_All_Peers"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:33:09.877465" elapsed="0.001020">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Stop_All_Peers"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:33:09.877444" elapsed="0.001075">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Stop_All_Peers"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:09.878679" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:09.878905" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:09.878765" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:33:09.878748" elapsed="0.000249"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:33:09.879029" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:33:09.881907" elapsed="0.000170"/>
</kw>
<msg time="2026-04-17T03:33:09.882146" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:33:09.880636" elapsed="0.001644"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:09.882585" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:09.883040" 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-04-17T03:33:09.879914" elapsed="0.003319"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:33:09.879359" 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="FAIL" start="2026-04-17T03:33:09.872006" elapsed="0.011377">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Stop_All_Peers"</status>
</kw>
<msg time="2026-04-17T03:33:09.883489" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:33:09.883532" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Stop_All_Peers"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:09.871356" elapsed="0.012199"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:33:09.883745" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:09.883635" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:09.883616" elapsed="0.000195"/>
</if>
<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-04-17T03:33:09.884671" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:09.884562" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:09.884545" elapsed="0.000193"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:33:09.885085" level="INFO">index=15
host=10.30.170.120
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-04-17T03:33:09.885191" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
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-04-17T03:33:09.884888" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:09.885627" level="INFO">{1: 20}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:09.885366" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:09.886076" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:09.885817" elapsed="0.000301"/>
</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-04-17T03:33:09.886636" elapsed="0.000266"/>
</kw>
<msg time="2026-04-17T03:33:09.887018" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:33:09.887065" level="INFO">${old_connection_index} = 20</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:09.886271" elapsed="0.000817"/>
</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-04-17T03:33:09.887960" elapsed="0.000250"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:33:09.889608" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:33:09.888915" elapsed="0.001597">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:09.888431" elapsed="0.002182"/>
</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-04-17T03:33:09.891270" elapsed="0.000298"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:09.890786" elapsed="0.000867"/>
</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-04-17T03:33:09.887379" elapsed="0.004320"/>
</kw>
<status status="PASS" start="2026-04-17T03:33:09.887163" elapsed="0.004585"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:09.887144" elapsed="0.004629"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:33:09.892688" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:33:09.892371" elapsed="0.000344"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:33:09.892763" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:33:09.892918" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:33:09.892010" elapsed="0.000955"/>
</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-04-17T03:33:09.893121" elapsed="0.000423"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:33:09.893815" level="INFO">index=21
host=10.30.170.120
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-04-17T03:33:09.893915" level="INFO">${karaf_connection_object} = index=21
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:33:09.893710" elapsed="0.000248"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:33:09.894108" elapsed="0.002224"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:33:09.896768" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:33:09.897989" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:33:09.896505" elapsed="0.001870">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:33:09.911867" elapsed="0.000422"/>
</kw>
<msg time="2026-04-17T03:33:09.912425" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:33:09.910326" elapsed="0.002255"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:09.912808" elapsed="0.000026"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:09.913094" elapsed="0.000029"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:33:09.899191" elapsed="0.014000"/>
</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-04-17T03:33:09.898661" elapsed="0.014577"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:33:09.884247" elapsed="0.029076">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:09.913682" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:33:09.913759" 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="FAIL" start="2026-04-17T03:33:09.870659" elapsed="0.043228">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:33:09.914259" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:33:09.914304" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:09.866146" elapsed="0.048182"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:09.914741" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:09.914473" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:09.914452" elapsed="0.000384"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:33:09.866001" elapsed="0.048860"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:33:09.865807" elapsed="0.049088"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:33:09.863321" elapsed="0.051655"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:33:09.858428" elapsed="0.056607"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:09.857973" elapsed="0.057109"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:33:09.854048" elapsed="0.061091"/>
</kw>
<kw name="Stop_All_ExaBgps" owner="ExaBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-04-17T03:33:09.915777" level="INFO">[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt; env exabgp.tcp.port=1790 exabgp --debug exabgp4.cfg &gt; exa4.log &amp;
[?2004l[4] 5352
[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt; env exabgp.tcp.port=1790 exabgp --debug exabgp5.cfg &gt; exa5.log &amp;
[?2004l[5] 5353
[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt; env exabgp.tcp.port=1790 exabgp --debug exabgp6.cfg &gt; exa6.log &amp;
[?2004l[6] 5354
[?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:33:09.915906" level="INFO">${output} = [?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt; env exabgp.tcp.port=1790 exabgp --debug exabgp4.cfg &gt; exa4.log &amp;
[?2004l[4] 5352
[?2004h(defaultvenv) [jenkins@releng-26932-188-0-b...</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-04-17T03:33:09.915648" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:09.916426" level="INFO">[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt; env exabgp.tcp.port=1790 exabgp --debug exabgp4.cfg &gt; exa4.log &amp;
[?2004l[4] 5352
[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt; env exabgp.tcp.port=1790 exabgp --debug exabgp5.cfg &gt; exa5.log &amp;
[?2004l[5] 5353
[?2004h(defaultvenv) [jenkins@releng-26932-188-0-builder-0 ~]&gt; env exabgp.tcp.port=1790 exabgp --debug exabgp6.cfg &gt; exa6.log &amp;
[?2004l[6] 5354
[?2004h(defaultvenv) [jenkins@releng-26932-188-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-04-17T03:33:09.916118" elapsed="0.000442"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:33:09.919813" level="INFO">ps axf | grep exabgp | grep -v grep | awk '{print "kill -9 " $1}' | sh</msg>
<msg time="2026-04-17T03:33:09.919910" 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-04-17T03:33:09.916739" elapsed="0.003233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:09.920429" 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-04-17T03:33:09.920134" elapsed="0.000341"/>
</kw>
<doc>Sends kill command to stop all exabgps running</doc>
<status status="PASS" start="2026-04-17T03:33:09.915369" elapsed="0.005160"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:33:09.929651" level="INFO">Executing command 'cat exa1.log'.</msg>
<msg time="2026-04-17T03:33:09.942475" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:33:09.942710" 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-04-17T03:33:09.929509" elapsed="0.013256"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:09.943815" level="INFO"/>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:09.943188" elapsed="0.000719"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-04-17T03:33:09.945114" 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-04-17T03:33:09.944389" elapsed="0.000849"/>
</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-04-17T03:33:09.929107" elapsed="0.016264"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:33:09.920721" elapsed="0.024729"/>
</iter>
<iter>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:33:09.958392" level="INFO">Executing command 'cat exa2.log'.</msg>
<msg time="2026-04-17T03:33:10.001122" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:33:10.001474" 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-04-17T03:33:09.958245" elapsed="0.043285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:10.002693" level="INFO"/>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:10.002043" elapsed="0.000737"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-04-17T03:33:10.003972" 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-04-17T03:33:10.003203" elapsed="0.000883"/>
</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-04-17T03:33:09.957797" elapsed="0.046429"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-17T03:33:09.945644" elapsed="0.058663"/>
</iter>
<iter>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:33:10.018191" level="INFO">Executing command 'cat exa3.log'.</msg>
<msg time="2026-04-17T03:33:10.059118" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:33:10.059556" 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-04-17T03:33:10.017978" elapsed="0.041660"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:10.061129" level="INFO"/>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:10.060302" elapsed="0.000918"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-04-17T03:33:10.062297" 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-04-17T03:33:10.061611" elapsed="0.000794"/>
</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-04-17T03:33:10.017347" elapsed="0.045187"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-17T03:33:10.004553" elapsed="0.058054"/>
</iter>
<iter>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:33:10.076770" level="INFO">Executing command 'cat exa4.log'.</msg>
<msg time="2026-04-17T03:33:10.106471" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:33:10.106844" 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-04-17T03:33:10.076543" elapsed="0.030444"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:10.108280" level="INFO"/>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:10.107523" elapsed="0.000930"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-04-17T03:33:10.109680" 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-04-17T03:33:10.108917" elapsed="0.000892"/>
</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-04-17T03:33:10.075822" elapsed="0.034175"/>
</kw>
<var name="${index}">4</var>
<status status="PASS" start="2026-04-17T03:33:10.062805" elapsed="0.047281"/>
</iter>
<iter>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:33:10.124765" level="INFO">Executing command 'cat exa5.log'.</msg>
<msg time="2026-04-17T03:33:10.165496" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:33:10.166227" 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-04-17T03:33:10.124559" elapsed="0.041743"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:10.167795" level="INFO"/>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:10.166886" elapsed="0.001015"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-04-17T03:33:10.169549" 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-04-17T03:33:10.168476" elapsed="0.001205"/>
</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-04-17T03:33:10.123870" elapsed="0.045976"/>
</kw>
<var name="${index}">5</var>
<status status="PASS" start="2026-04-17T03:33:10.110312" elapsed="0.059657"/>
</iter>
<iter>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:33:10.185348" level="INFO">Executing command 'cat exa6.log'.</msg>
<msg time="2026-04-17T03:33:10.215495" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:33:10.216136" 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-04-17T03:33:10.185127" elapsed="0.031079"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:10.217901" level="INFO"/>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:10.216907" elapsed="0.001141"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-04-17T03:33:10.219440" 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-04-17T03:33:10.218561" elapsed="0.001012"/>
</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-04-17T03:33:10.184281" elapsed="0.035483"/>
</kw>
<var name="${index}">6</var>
<status status="PASS" start="2026-04-17T03:33:10.170239" elapsed="0.049651"/>
</iter>
<var>${index}</var>
<value>@{NUMBERS}</value>
<status status="PASS" start="2026-04-17T03:33:09.920582" elapsed="0.299447"/>
</for>
<doc>Send command to kill all exabgp processes running on controller</doc>
<status status="PASS" start="2026-04-17T03:33:09.853031" elapsed="0.367475"/>
</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-04-17T03:33:10.228046" elapsed="0.000468"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:33:10.227593" elapsed="0.001011"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:33:10.230602" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:10.230293" elapsed="0.000400"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:10.230228" elapsed="0.000500"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:33:10.238204" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:10.238054" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:10.238033" elapsed="0.000280"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:33:10.239498" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:33:10.239028" elapsed="0.000501"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:33:10.240131" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:33:10.239703" elapsed="0.000457"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:33:10.240208" elapsed="0.000052"/>
</return>
<msg time="2026-04-17T03:33:10.240395" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:33:10.238599" elapsed="0.001842"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:33:10.246538" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:10.246395" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:10.246371" 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-04-17T03:33:10.248357" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:10.248229" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:10.248207" elapsed="0.000306"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:33:10.249128" level="INFO">${karaf_connection_index} = 21</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:33:10.248710" elapsed="0.000453"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:33:10.249578" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:33:10.249341" elapsed="0.000263"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:33:10.250650" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:33:10.250310" elapsed="0.001202">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:33:10.251782" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:33:10.251844" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:10.249796" elapsed="0.002081"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:33:10.252827" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:33:10.252520" elapsed="0.001140">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:33:10.253863" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:33:10.253911" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:10.252102" elapsed="0.001865"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:33:10.254988" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Delete_Bgp_Peer_Configuration"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:33:10.254315" elapsed="0.000739">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Delete_Bgp_Peer_Configuration"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:33:10.254062" elapsed="0.001072">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Delete_Bgp_Peer_Configuration"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:33:10.254035" elapsed="0.001138">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Delete_Bgp_Peer_Configuration"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:10.255387" elapsed="0.000032"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:10.255649" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:10.255500" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:33:10.255481" elapsed="0.000244"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:33:10.255764" elapsed="0.000018"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:33:10.259439" elapsed="0.000201"/>
</kw>
<msg time="2026-04-17T03:33:10.259729" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:33:10.258070" elapsed="0.001815"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:10.260208" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:10.260602" 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-04-17T03:33:10.256788" elapsed="0.004018"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:33:10.256146" elapsed="0.004733"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:33:10.247632" elapsed="0.013461">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Delete_Bgp_Peer_Configuration"</status>
</kw>
<msg time="2026-04-17T03:33:10.261227" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:33:10.261272" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Delete_Bgp_Peer_Configuration"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:10.246841" elapsed="0.014455"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:33:10.261528" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:10.261394" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:10.261368" elapsed="0.000237"/>
</if>
<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-04-17T03:33:10.263202" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:10.263091" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:10.263072" elapsed="0.000198"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:33:10.263601" level="INFO">index=15
host=10.30.170.120
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-04-17T03:33:10.263712" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
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-04-17T03:33:10.263430" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:10.264315" level="INFO">{1: 21}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:10.263901" elapsed="0.000463"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:10.264846" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:10.264575" elapsed="0.000316"/>
</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-04-17T03:33:10.265627" elapsed="0.000365"/>
</kw>
<msg time="2026-04-17T03:33:10.266097" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:33:10.266146" level="INFO">${old_connection_index} = 21</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:10.265172" elapsed="0.001004"/>
</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-04-17T03:33:10.267059" elapsed="0.000215"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:33:10.268483" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:33:10.267986" elapsed="0.001795">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:10.267450" elapsed="0.002442"/>
</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-04-17T03:33:10.270562" elapsed="0.000294"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:10.270086" elapsed="0.000873"/>
</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-04-17T03:33:10.266493" elapsed="0.004514"/>
</kw>
<status status="PASS" start="2026-04-17T03:33:10.266257" elapsed="0.004800"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:10.266237" elapsed="0.004846"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:33:10.272013" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:33:10.271673" elapsed="0.000367"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:33:10.272090" elapsed="0.000037"/>
</return>
<msg time="2026-04-17T03:33:10.272255" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:33:10.271319" elapsed="0.000960"/>
</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-04-17T03:33:10.272485" elapsed="0.000498"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:33:10.273280" level="INFO">index=22
host=10.30.170.120
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-04-17T03:33:10.273407" level="INFO">${karaf_connection_object} = index=22
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:33:10.273162" elapsed="0.000274"/>
</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-04-17T03:33:10.273589" elapsed="0.002360"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:33:10.276386" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:33:10.277990" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:33:10.276118" elapsed="0.002341">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:33:10.293645" elapsed="0.000456"/>
</kw>
<msg time="2026-04-17T03:33:10.294227" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:33:10.291811" elapsed="0.002594"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:10.294576" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:10.294740" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:33:10.279564" elapsed="0.015265"/>
</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-04-17T03:33:10.278820" elapsed="0.016058"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:33:10.262707" elapsed="0.032292">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:10.295567" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:33:10.295650" 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="FAIL" start="2026-04-17T03:33:10.245973" elapsed="0.049803">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:33:10.295901" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:33:10.295963" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:10.240988" elapsed="0.055001"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:10.296361" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:10.296082" elapsed="0.000402"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:10.296059" elapsed="0.000458"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:33:10.240785" elapsed="0.055765"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:33:10.240531" elapsed="0.056067"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:33:10.237626" elapsed="0.059046"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:33:10.229696" elapsed="0.067057"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:10.228841" elapsed="0.067965"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:33:10.223590" elapsed="0.073278"/>
</kw>
<for flavor="IN ZIP">
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:33:10.298527" 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-04-17T03:33:10.297778" elapsed="0.000782"/>
</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-04-17T03:33:10.342329" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/ibgp_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:33:10.341865" elapsed="0.000507"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:33:10.343271" 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-04-17T03:33:10.342911" elapsed="0.000475">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-04-17T03:33:10.343487" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:33:10.342559" elapsed="0.000953"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:33:10.344091" 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-04-17T03:33:10.343681" elapsed="0.000437"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:33:10.344445" 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-04-17T03:33:10.344676" 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-04-17T03:33:10.344280" elapsed="0.000422"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:10.345127" 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-04-17T03:33:10.344858" 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-04-17T03:33:10.346262" 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-04-17T03:33:10.345992" elapsed="0.000423"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:33:10.346870" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:33:10.346578" elapsed="0.000317"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:33:10.348073" 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-04-17T03:33:10.347327" elapsed="0.000773"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:33:10.348879" 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-04-17T03:33:10.348643" elapsed="0.000262"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:33:10.348977" elapsed="0.000044"/>
</return>
<msg time="2026-04-17T03:33:10.349157" 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-04-17T03:33:10.348297" 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-04-17T03:33:10.349335" elapsed="0.000256"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-04-17T03:33:10.347186" elapsed="0.002455"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:33:10.350206" 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-04-17T03:33:10.349891" elapsed="0.000341"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:33:10.350966" 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-04-17T03:33:10.350737" elapsed="0.000255"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:33:10.351042" elapsed="0.000031"/>
</return>
<msg time="2026-04-17T03:33:10.351192" 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-04-17T03:33:10.350417" 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-04-17T03:33:10.351364" elapsed="0.000222"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-04-17T03:33:10.349760" elapsed="0.001867"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:33:10.352183" 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-04-17T03:33:10.351869" elapsed="0.000339"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:33:10.352964" 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-04-17T03:33:10.352740" elapsed="0.000251"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:33:10.353041" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:33:10.353191" 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-04-17T03:33:10.352392" elapsed="0.000823"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:33:10.353363" elapsed="0.000220"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-04-17T03:33:10.351740" elapsed="0.001886"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:33:10.354226" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:33:10.353867" elapsed="0.000391"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:33:10.355047" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:33:10.354807" elapsed="0.000267"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:33:10.355124" elapsed="0.000030"/>
</return>
<msg time="2026-04-17T03:33:10.355292" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:33:10.354447" 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-04-17T03:33:10.355484" elapsed="0.000226"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:33:10.353739" elapsed="0.002013"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:33:10.356320" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:33:10.356011" elapsed="0.000336"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:33:10.357124" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:33:10.356897" elapsed="0.000253"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:33:10.357199" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:33:10.357348" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:33:10.356562" elapsed="0.000810"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:33:10.357583" elapsed="0.000232"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:33:10.355864" elapsed="0.001994"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:33:10.346982" elapsed="0.010911"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:33:10.357953" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:33:10.358116" 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-04-17T03:33:10.345653" elapsed="0.012488"/>
</kw>
<status status="PASS" start="2026-04-17T03:33:10.345269" elapsed="0.012904"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:10.358354" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:10.358202" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:10.345239" elapsed="0.013191"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:33:10.359351" 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-04-17T03:33:10.358575" elapsed="0.000806"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:33:10.359430" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:33:10.341151" elapsed="0.018404"/>
</kw>
<msg time="2026-04-17T03:33:10.359613" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:33:10.328331" elapsed="0.031333"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:33:10.374295" 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/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-04-17T03:33:10.386921" elapsed="0.000043"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/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-04-17T03:33:10.399546" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:10.399794" 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-04-17T03:33:10.400008" 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-04-17T03:33:10.400485" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:10.400294" elapsed="0.000251"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:33:10.400275" 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-04-17T03:33:10.400728" 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-04-17T03:33:10.400910" elapsed="0.000080"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:10.401244" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:33:10.400231" elapsed="0.001070"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:33:10.400100" elapsed="0.001231"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:10.401508" elapsed="0.000029"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:33:10.401608" elapsed="0.000019"/>
</return>
<msg time="2026-04-17T03:33:10.401793" 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-04-17T03:33:10.323704" elapsed="0.078119"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:10.403155" 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-04-17T03:33:10.402794" elapsed="0.000418"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:33:10.408698" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:33:10.610445" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:33:11.014253" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:33:11.017014" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:33:10.405329" elapsed="0.615397">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:33:10.403279" elapsed="0.617682">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:33:11.021545" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:11.021078" elapsed="0.000580"/>
</branch>
<status status="FAIL" start="2026-04-17T03:33:10.403262" elapsed="0.618434">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:33:11.022487" elapsed="0.000042"/>
</kw>
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:33:11.022611" elapsed="0.000037"/>
</return>
<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-04-17T03:33:10.402125" elapsed="0.620687">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:33:11.023049" elapsed="0.000032"/>
</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="FAIL" start="2026-04-17T03:33:10.298819" elapsed="0.724397">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<var name="${index}">1</var>
<var name="${peer_type}">ibgp_peer</var>
<status status="FAIL" start="2026-04-17T03:33:10.297547" elapsed="0.725773">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</iter>
<var>${index}</var>
<var>${peer_type}</var>
<value>${NUMBERS}</value>
<value>${PEER_TYPES}</value>
<status status="FAIL" start="2026-04-17T03:33:10.297307" elapsed="0.726130">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</for>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="FAIL" start="2026-04-17T03:33:10.221841" elapsed="0.801909">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:33:11.028759" elapsed="0.000358"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-17T03:33:11.028436" elapsed="0.000748"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:33:11.030484" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:11.030270" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:11.030234" 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-04-17T03:33:11.035790" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:11.035648" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:11.035621" elapsed="0.000240"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:33:11.037816" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:33:11.036519" elapsed="0.001328"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:33:11.038349" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:33:11.038036" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:33:11.038422" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:33:11.038592" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:33:11.036126" 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-04-17T03:33:11.044965" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:11.044814" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:11.044788" elapsed="0.000261"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:33:11.046673" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:11.046530" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:11.046505" elapsed="0.000258"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:33:11.047373" level="INFO">${karaf_connection_index} = 22</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-17T03:33:11.046996" elapsed="0.000409"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:33:11.048004" level="INFO">${current_connection_index} = 15</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:33:11.047593" elapsed="0.000441"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:33:11.049056" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:33:11.048648" elapsed="0.001625">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:33:11.050481" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-17T03:33:11.050555" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:11.048227" elapsed="0.002359"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-17T03:33:11.051448" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-17T03:33:11.051184" elapsed="0.001024">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-17T03:33:11.052423" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-17T03:33:11.052481" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:11.050787" elapsed="0.001739"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:33:11.053710" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Deconfigure_App_Peer"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:33:11.052990" elapsed="0.000796">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Deconfigure_App_Peer"</status>
</kw>
<status status="FAIL" start="2026-04-17T03:33:11.052699" elapsed="0.001170">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Deconfigure_App_Peer"</status>
</branch>
<status status="FAIL" start="2026-04-17T03:33:11.052668" elapsed="0.001237">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Deconfigure_App_Peer"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:11.054295" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:11.054583" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:11.054408" elapsed="0.000255"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:33:11.054388" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-17T03:33:11.054742" elapsed="0.000023"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-17T03:33:11.058779" elapsed="0.000298"/>
</kw>
<msg time="2026-04-17T03:33:11.059176" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:33:11.057032" elapsed="0.002322"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:11.059651" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:11.060058" 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-04-17T03:33:11.056152" elapsed="0.004117"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:33:11.055220" elapsed="0.005119"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-17T03:33:11.046089" elapsed="0.014361">Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Deconfigure_App_Peer"</status>
</kw>
<msg time="2026-04-17T03:33:11.060592" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:33:11.060668" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Policies Default.Deconfigure_App_Peer"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:11.045232" elapsed="0.015464"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:33:11.060926" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:11.060795" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:11.060769" elapsed="0.000253"/>
</if>
<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-04-17T03:33:11.062026" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:11.061896" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:11.061877" elapsed="0.000220"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:33:11.062422" level="INFO">index=15
host=10.30.170.120
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-04-17T03:33:11.062546" level="INFO">${current_ssh_connection_object} = index=15
host=10.30.170.120
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-04-17T03:33:11.062261" elapsed="0.000445"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:11.063232" level="INFO">{1: 22}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:11.062873" elapsed="0.000407"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:11.063699" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:11.063436" elapsed="0.000309"/>
</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-04-17T03:33:11.064349" elapsed="0.000341"/>
</kw>
<msg time="2026-04-17T03:33:11.064795" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:33:11.064844" level="INFO">${old_connection_index} = 22</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:11.063912" elapsed="0.000956"/>
</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-04-17T03:33:11.065772" elapsed="0.000219"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:33:11.067256" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:33:11.066694" elapsed="0.001846">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:11.066179" elapsed="0.002493"/>
</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-04-17T03:33:11.069362" elapsed="0.000300"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:11.068854" elapsed="0.000896"/>
</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-04-17T03:33:11.065229" elapsed="0.004569"/>
</kw>
<status status="PASS" start="2026-04-17T03:33:11.064973" elapsed="0.004875"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:11.064952" elapsed="0.004924"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:33:11.070815" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:33:11.070481" elapsed="0.000362"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:33:11.070895" elapsed="0.000116"/>
</return>
<msg time="2026-04-17T03:33:11.071146" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:33:11.070122" elapsed="0.001050"/>
</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-04-17T03:33:11.071335" elapsed="0.000486"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:33:11.072137" level="INFO">index=23
host=10.30.170.120
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-04-17T03:33:11.072251" level="INFO">${karaf_connection_object} = index=23
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:33:11.072016" elapsed="0.000267"/>
</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-04-17T03:33:11.072441" elapsed="0.002762"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:33:11.075803" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:33:11.077357" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:33:11.075442" elapsed="0.002424">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</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-04-17T03:33:11.093192" elapsed="0.000449"/>
</kw>
<msg time="2026-04-17T03:33:11.093769" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:33:11.091414" elapsed="0.002598"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:11.094181" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:11.094346" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:33:11.079168" elapsed="0.015268"/>
</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-04-17T03:33:11.078298" elapsed="0.016191"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-17T03:33:11.061516" elapsed="0.033207">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:11.095389" elapsed="0.000037"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-17T03:33:11.095486" elapsed="0.000032"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-17T03:33:11.044274" elapsed="0.051355">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:33:11.095772" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:33:11.095830" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:11.039071" elapsed="0.056790"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:11.096287" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:11.095992" elapsed="0.000349"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:11.095963" elapsed="0.000407"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:33:11.038871" elapsed="0.057529"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:33:11.038682" elapsed="0.057764"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-17T03:33:11.035227" elapsed="0.061293"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-17T03:33:11.029868" elapsed="0.066719"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:11.029355" elapsed="0.067307"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-17T03:33:11.025353" elapsed="0.071373"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:33:11.097836" level="INFO">&amp;{mapping} = { IP=10.30.170.120 | 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-04-17T03:33:11.097233" elapsed="0.000633"/>
</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-04-17T03:33:11.144119" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpfunct/../../../variables/bgpfunctional/bgppolicies/app_peer.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:33:11.143524" elapsed="0.000642"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-17T03:33:11.145190" 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-04-17T03:33:11.144810" elapsed="0.000488">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-04-17T03:33:11.145412" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-17T03:33:11.144377" elapsed="0.001061"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:33:11.146044" 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-04-17T03:33:11.145611" elapsed="0.000465"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-17T03:33:11.146425" 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-04-17T03:33:11.146674" 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-04-17T03:33:11.146253" elapsed="0.000452"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:11.147190" 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-04-17T03:33:11.146880" elapsed="0.000361"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:11.148660" level="INFO">mapping: {'IP': '10.30.170.120', '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-04-17T03:33:11.148365" elapsed="0.000350"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:33:11.149280" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-17T03:33:11.148881" elapsed="0.000432"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:33:11.150204" level="INFO">${value} = 10.30.170.120</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:33:11.149817" elapsed="0.000414"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:33:11.151054" level="INFO">${encoded} = 10.30.170.120</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:33:11.150785" elapsed="0.000296"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:33:11.151141" elapsed="0.000048"/>
</return>
<msg time="2026-04-17T03:33:11.151327" level="INFO">${encoded_value} = 10.30.170.120</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:33:11.150443" 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-04-17T03:33:11.151516" elapsed="0.000335"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.120</var>
<status status="PASS" start="2026-04-17T03:33:11.149636" elapsed="0.002270"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-17T03:33:11.152577" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-17T03:33:11.152212" elapsed="0.000391"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-17T03:33:11.153615" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-17T03:33:11.153185" elapsed="0.000457"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-04-17T03:33:11.153693" elapsed="0.000033"/>
</return>
<msg time="2026-04-17T03:33:11.153853" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-04-17T03:33:11.152823" elapsed="0.001055"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:33:11.154050" elapsed="0.000239"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-04-17T03:33:11.152072" elapsed="0.002260"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-04-17T03:33:11.149393" elapsed="0.004975"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-17T03:33:11.154415" elapsed="0.000029"/>
</return>
<msg time="2026-04-17T03:33:11.154582" level="INFO">${mapping_to_use} = {'IP': '10.30.170.120', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-17T03:33:11.147879" elapsed="0.006731"/>
</kw>
<status status="PASS" start="2026-04-17T03:33:11.147350" elapsed="0.007302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:11.154840" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:11.154683" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:11.147312" elapsed="0.007606"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-17T03:33:11.155758" 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-04-17T03:33:11.155084" elapsed="0.000711"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-17T03:33:11.155856" 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/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-04-17T03:33:11.142419" elapsed="0.013628"/>
</kw>
<msg time="2026-04-17T03:33:11.156129" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:33:11.128324" elapsed="0.027879"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-04-17T03:33:11.170720" 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/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-04-17T03:33:11.183137" 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/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-04-17T03:33:11.195548" elapsed="0.000054"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:11.195949" 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-04-17T03:33:11.196202" 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-04-17T03:33:11.196775" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:11.196542" elapsed="0.000305"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:33:11.196522" elapsed="0.000359"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:11.197086" 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-04-17T03:33:11.197279" 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-04-17T03:33:11.197554" elapsed="0.000026"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-17T03:33:11.196474" elapsed="0.001147"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-17T03:33:11.196312" elapsed="0.001344"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:11.197849" elapsed="0.000025"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-17T03:33:11.197968" elapsed="0.000025"/>
</return>
<msg time="2026-04-17T03:33:11.198204" 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-04-17T03:33:11.123385" elapsed="0.074856"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:11.199758" 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-04-17T03:33:11.199374" elapsed="0.000446"/>
</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-04-17T03:33:11.205579" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-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>
<msg time="2026-04-17T03:33:11.407484" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-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>
<msg time="2026-04-17T03:33:11.811028" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-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>
<msg time="2026-04-17T03:33:11.813687" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:33:11.202126" elapsed="0.616695">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-17T03:33:11.199891" elapsed="0.619198">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</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-04-17T03:33:11.819752" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:11.819200" elapsed="0.000703"/>
</branch>
<status status="FAIL" start="2026-04-17T03:33:11.199870" elapsed="0.620118">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:33:11.821516" elapsed="0.000047"/>
</kw>
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-17T03:33:11.821665" elapsed="0.000041"/>
</return>
<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-04-17T03:33:11.198589" elapsed="0.623278">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-17T03:33:11.821988" 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="FAIL" start="2026-04-17T03:33:11.098127" elapsed="0.724014">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Delete_Templated" owner="TemplatedRequests">
<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="NOT RUN" start="2026-04-17T03:33:11.822523" elapsed="0.000036"/>
</kw>
<doc>Revert the BGP configuration to the original state: without application peer</doc>
<status status="FAIL" start="2026-04-17T03:33:11.024370" elapsed="0.798498">ConnectionError: HTTPConnectionPool(host='10.30.170.120', port=8181): Max retries exceeded with 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 (Caused by NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</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-04-17T03:33:11.833028" level="INFO">${cd_and_command} = cd '.' &amp;&amp; rm -rf /tmp/defaultvenv</msg>
<var>${cd_and_command}</var>
<arg>cd '${path}' &amp;&amp; ${command}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:33:11.832327" elapsed="0.000760"/>
</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-04-17T03:33:11.835386" level="INFO">Executing command 'cd '.' &amp;&amp; rm -rf /tmp/defaultvenv'.</msg>
<msg time="2026-04-17T03:33:11.879608" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-17T03:33:11.880180" level="INFO">${stdout} = </msg>
<msg time="2026-04-17T03:33:11.880287" level="INFO">${stderr} = </msg>
<msg time="2026-04-17T03:33:11.880384" 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-04-17T03:33:11.835074" elapsed="0.045367"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-04-17T03:33:11.883004" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-04-17T03:33:11.882237" elapsed="0.000882"/>
</kw>
<msg time="2026-04-17T03:33:11.883341" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-04-17T03:33:11.883442" level="INFO">${result} = None</msg>
<var>${emptiness_status}</var>
<var>${result}</var>
<arg>BuiltIn.Should_Be_Empty</arg>
<arg>${stderr}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:11.881168" elapsed="0.002326"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:33:11.885106" 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-04-17T03:33:11.883981" elapsed="0.001188"/>
</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-04-17T03:33:11.888270" level="INFO"/>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:11.887487" elapsed="0.000903"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:11.889414" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:11.888753" elapsed="0.000763"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:11.890456" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:11.889860" elapsed="0.000703"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-04-17T03:33:11.886496" elapsed="0.004202"/>
</kw>
<status status="PASS" start="2026-04-17T03:33:11.885533" elapsed="0.005256"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:11.885471" elapsed="0.005392"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-04-17T03:33:11.891361" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:11.891070" elapsed="0.000406"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:11.891018" elapsed="0.000508"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:33:11.891859" elapsed="0.000108"/>
</return>
<status status="PASS" start="2026-04-17T03:33:11.891649" elapsed="0.000413"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:11.891613" elapsed="0.000515"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:11.892466" 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-04-17T03:33:11.834381" elapsed="0.058365"/>
</kw>
<msg time="2026-04-17T03:33:11.892964" 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-04-17T03:33:11.833381" elapsed="0.059750"/>
</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-04-17T03:33:11.831119" elapsed="0.062201"/>
</kw>
<msg time="2026-04-17T03:33:11.893432" 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-04-17T03:33:11.825311" elapsed="0.068285"/>
</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-04-17T03:33:11.824716" elapsed="0.069029"/>
</kw>
<doc>Deletes a directory with virtual env.</doc>
<status status="PASS" start="2026-04-17T03:33:11.824358" elapsed="0.069456"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-04-17T03:33:11.893991" elapsed="0.000548"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-17T03:33:11.894784" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-17T03:33:11.894701" elapsed="0.000209"/>
</kw>
<doc>Suite teardown keyword</doc>
<status status="PASS" start="2026-04-17T03:33:11.823639" elapsed="0.071350"/>
</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-04-17T03:31:35.749852" elapsed="96.145175"/>
</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-04-17T03:33:11.998148" 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-04-17T03:33:11.994293" elapsed="0.003896"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-17T03:33:11.998481" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:11.998319" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:11.998285" elapsed="0.000273"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:33:11.999134" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:33:11.998737" elapsed="0.000442"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-17T03:33:11.999651" 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-04-17T03:33:11.999333" elapsed="0.000348"/>
</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-04-17T03:33:12.000249" elapsed="0.000354"/>
</kw>
<msg time="2026-04-17T03:33:12.000908" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:33:12.000976" level="INFO">${possibly_int_of_members} = 1</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:11.999842" elapsed="0.001159"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:33:12.001555" 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-04-17T03:33:12.001169" elapsed="0.000412"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:33:12.002627" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:33:12.002360" elapsed="0.000294"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:33:12.003067" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:33:12.002791" elapsed="0.000303"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-17T03:33:12.003553" 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-04-17T03:33:12.003244" elapsed="0.000335"/>
</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-04-17T03:33:12.007073" elapsed="0.000292"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:33:12.008032" level="INFO">${member_ip} = 10.30.170.120</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:33:12.007552" elapsed="0.000521"/>
</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-04-17T03:33:12.008276" elapsed="0.000321"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:33:12.009562" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:33:12.009209" elapsed="0.000382"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-17T03:33:12.009644" elapsed="0.000055"/>
</return>
<msg time="2026-04-17T03:33:12.009838" 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-04-17T03:33:12.008814" elapsed="0.001049"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:33:12.010633" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.120:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a4415ef0d50&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-04-17T03:33:12.010061" elapsed="0.000797"/>
</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-04-17T03:33:12.011084" elapsed="0.000251"/>
</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-04-17T03:33:12.006323" elapsed="0.005087"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:33:12.006121" elapsed="0.005345"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-04-17T03:33:12.003647" elapsed="0.007868"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:33:12.012288" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:33:12.011746" elapsed="0.000596"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:33:12.012994" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.120'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:33:12.012534" elapsed="0.000507"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:33:12.014031" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:33:12.013229" elapsed="0.000862"/>
</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-04-17T03:33:12.001868" elapsed="0.012296"/>
</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-04-17T03:33:11.993871" elapsed="0.020361"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-17T03:33:12.014542" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:12.014344" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:12.014309" elapsed="0.000320"/>
</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-04-17T03:33:12.018187" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-17T03:33:12.017726" elapsed="0.000490"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-17T03:33:12.018789" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-17T03:33:12.018477" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-17T03:33:12.018861" elapsed="0.000045"/>
</return>
<msg time="2026-04-17T03:33:12.019071" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-17T03:33:12.017377" elapsed="0.001730"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:33:12.020359" level="INFO">${member_ip} = 10.30.170.120</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-04-17T03:33:12.020045" elapsed="0.000341"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:33:12.021473" 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-04-17T03:33:12.021598" 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-04-17T03:33:12.021241" elapsed="0.000393"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:12.024849" elapsed="0.000068"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:12.024449" elapsed="0.000659"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:12.024424" elapsed="0.000716"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:33:12.025458" 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-04-17T03:33:12.025629" 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-04-17T03:33:12.025296" elapsed="0.000379"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:12.026889" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.120" 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-04-17T03:33:12.025846" elapsed="0.001118"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:33:12.027891" 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-04-17T03:33:12.027175" elapsed="0.000743"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-17T03:33:12.032178" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:33:12.032405" 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-04-17T03:33:12.031403" elapsed="0.001058"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:33:12.032765" elapsed="0.000751"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:33:12.035267" level="INFO">Logging into '10.30.170.120:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:33:12.636531" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 17 03:33:12 UTC 2026

  System load:  0.02               Processes:             119
  Usage of /:   10.4% of 77.35GB   Users logged in:       0
  Memory usage: 2%                 IPv4 address for ens3: 10.30.170.120
  Swap usage:   0%                 IPv6 address for ens3: 2607:f0d0:1002:11::2


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:31:39 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:33:12.034719" elapsed="0.602140"/>
</kw>
<msg time="2026-04-17T03:33:12.637021" 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-04-17T03:33:12.033906" elapsed="0.603374"/>
</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-04-17T03:33:12.028176" elapsed="0.609390"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:33:12.638359" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-17T03:33:12.651043" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-17T03:33:12.651547" level="INFO">${stdout} = </msg>
<msg time="2026-04-17T03:33:12.651700" 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-04-17T03:33:12.637905" elapsed="0.013880"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:33:12.652281" elapsed="0.000751"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:12.655011" 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-04-17T03:33:12.653614" elapsed="0.001516"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-17T03:33:12.655796" elapsed="0.000046"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:12.655337" elapsed="0.000625"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:12.655272" elapsed="0.000751"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-17T03:33:12.656498" elapsed="0.000081"/>
</return>
<status status="PASS" start="2026-04-17T03:33:12.656153" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:12.656116" elapsed="0.000628"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-17T03:33:12.656855" elapsed="0.000050"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:33:12.664219" elapsed="0.001685"/>
</kw>
<kw name="Open 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-04-17T03:33:12.666154" elapsed="0.000466"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:33:12.666803" elapsed="0.000223"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:33:12.657829" elapsed="0.009284"/>
</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-04-17T03:33:12.023811" elapsed="0.643403"/>
</kw>
<msg time="2026-04-17T03:33:12.667276" 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-04-17T03:33:12.023042" elapsed="0.644299"/>
</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-04-17T03:33:12.022509" elapsed="0.644925"/>
</kw>
<msg time="2026-04-17T03:33:12.667486" 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-04-17T03:33:12.021842" elapsed="0.645696"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:33:12.670343" elapsed="0.000330"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-17T03:33:12.670833" elapsed="0.000172"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:33:12.671147" 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-04-17T03:33:12.667838" elapsed="0.003461"/>
</kw>
<msg time="2026-04-17T03:33:12.671398" 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-04-17T03:33:12.020638" elapsed="0.650786"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:12.671872" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:12.671614" elapsed="0.000300"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-17T03:33:12.671975" elapsed="0.000032"/>
</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-04-17T03:33:12.019552" elapsed="0.652558"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:33:12.019345" elapsed="0.652806"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-17T03:33:12.019185" elapsed="0.653015"/>
</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-04-17T03:33:12.014910" elapsed="0.657358"/>
</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-04-17T03:33:12.672424" elapsed="0.000223"/>
</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-04-17T03:33:12.688418" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:12.688148" elapsed="0.000349"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:12.688121" elapsed="0.000409"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:33:12.688997" 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-04-17T03:33:12.689184" 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-04-17T03:33:12.688733" elapsed="0.000490"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:12.689827" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:12.689425" elapsed="0.000462"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:12.690407" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:12.690108" elapsed="0.000346"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:33:12.691364" 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-04-17T03:33:12.691083" elapsed="0.000430">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-17T03:33:12.691632" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-17T03:33:12.691678" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:12.690633" elapsed="0.001069"/>
</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-04-17T03:33:12.692025" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:12.691779" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:12.691760" elapsed="0.000370"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:33:12.692959" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:33:12.692654" elapsed="0.000334"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:33:12.693038" elapsed="0.000077"/>
</return>
<msg time="2026-04-17T03:33:12.693249" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:33:12.692360" elapsed="0.000915"/>
</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-04-17T03:33:12.693429" elapsed="0.000448"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:33:12.694172" level="INFO">index=4
host=10.30.170.120
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-04-17T03:33:12.694276" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.120
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-04-17T03:33:12.694061" elapsed="0.000242"/>
</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-04-17T03:33:12.694448" elapsed="0.002528"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:33:12.697462" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:33:12.698563" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:33:12.697167" elapsed="0.001965">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:33:12.702457" elapsed="0.000326"/>
</kw>
<kw name="Open 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-04-17T03:33:12.702961" elapsed="0.000154"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:33:12.703261" elapsed="0.000104"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:33:12.700024" elapsed="0.003395"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-17T03:33:12.699456" elapsed="0.004010"/>
</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="FAIL" start="2026-04-17T03:33:12.687747" elapsed="0.015808">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:33:13.723434" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:13.723244" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:13.723205" elapsed="0.000335"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:33:13.724073" 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-04-17T03:33:13.724211" 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-04-17T03:33:13.723810" elapsed="0.000429"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:13.724758" 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-04-17T03:33:13.724403" elapsed="0.000403"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:13.725224" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:13.724971" elapsed="0.000299"/>
</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-04-17T03:33:13.726008" elapsed="0.000200"/>
</kw>
<msg time="2026-04-17T03:33:13.726312" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:33:13.726359" level="INFO">${old_connection_index} = 4</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:13.725505" elapsed="0.000877"/>
</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-04-17T03:33:13.727251" elapsed="0.000144"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:33:13.728184" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:33:13.727886" elapsed="0.000940">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:13.727554" elapsed="0.001339"/>
</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-04-17T03:33:13.729522" elapsed="0.000120"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:13.729076" elapsed="0.000615"/>
</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-04-17T03:33:13.726697" elapsed="0.003045"/>
</kw>
<status status="PASS" start="2026-04-17T03:33:13.726464" elapsed="0.003330"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:13.726442" elapsed="0.003393"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:33:13.730825" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:33:13.730514" elapsed="0.000345"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:33:13.730948" elapsed="0.000059"/>
</return>
<msg time="2026-04-17T03:33:13.731153" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:33:13.730151" elapsed="0.001026"/>
</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-04-17T03:33:13.731336" elapsed="0.000474"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:33:13.732176" level="INFO">index=6
host=10.30.170.120
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-04-17T03:33:13.732285" level="INFO">${karaf_connection_object} = index=6
host=10.30.170.120
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-04-17T03:33:13.732027" elapsed="0.000284"/>
</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-04-17T03:33:13.732460" elapsed="0.002742"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:33:13.735647" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:33:13.737038" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:33:13.735367" elapsed="0.002326">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:33:13.741277" 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-04-17T03:33:13.741889" elapsed="0.000232"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:33:13.742400" elapsed="0.000113"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:33:13.738827" elapsed="0.003743"/>
</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-04-17T03:33:13.738130" elapsed="0.004490"/>
</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="FAIL" start="2026-04-17T03:33:13.722579" elapsed="0.020154">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:33:14.767133" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:14.766871" elapsed="0.000384"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:14.766826" elapsed="0.000478"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:33:14.768296" 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-04-17T03:33:14.768568" 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-04-17T03:33:14.767776" elapsed="0.000837"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:14.769510" level="INFO">{1: 6}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:14.768881" elapsed="0.000778"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:14.770515" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:14.769991" elapsed="0.000624"/>
</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-04-17T03:33:14.771446" elapsed="0.000239"/>
</kw>
<msg time="2026-04-17T03:33:14.771804" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:33:14.771853" level="INFO">${old_connection_index} = 6</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:14.770844" elapsed="0.001033"/>
</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-04-17T03:33:14.772980" elapsed="0.000163"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:33:14.774002" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:33:14.773687" elapsed="0.001045">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:14.773307" elapsed="0.001510"/>
</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-04-17T03:33:14.775405" elapsed="0.000113"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:14.775020" elapsed="0.000546"/>
</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-04-17T03:33:14.772306" elapsed="0.003305"/>
</kw>
<status status="PASS" start="2026-04-17T03:33:14.772010" elapsed="0.003651"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:14.771974" elapsed="0.003723"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:33:14.776774" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:33:14.776459" elapsed="0.000344"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:33:14.776864" elapsed="0.000049"/>
</return>
<msg time="2026-04-17T03:33:14.777070" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:33:14.776043" elapsed="0.001051"/>
</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-04-17T03:33:14.777253" elapsed="0.000537"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:33:14.778115" level="INFO">index=8
host=10.30.170.120
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-04-17T03:33:14.778228" level="INFO">${karaf_connection_object} = index=8
host=10.30.170.120
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-04-17T03:33:14.777975" elapsed="0.000280"/>
</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-04-17T03:33:14.778399" elapsed="0.002717"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:33:14.781733" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:33:14.783064" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:33:14.781394" elapsed="0.002145">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:33:14.786850" elapsed="0.000341"/>
</kw>
<kw name="Open 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-04-17T03:33:14.787350" elapsed="0.000166"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:33:14.787659" elapsed="0.000110"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:33:14.784567" elapsed="0.003257"/>
</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-04-17T03:33:14.783912" elapsed="0.003959"/>
</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="FAIL" start="2026-04-17T03:33:14.766146" elapsed="0.021831">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<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-04-17T03:33:15.811316" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:15.811124" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:15.811085" elapsed="0.000350"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:33:15.811986" 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-04-17T03:33:15.812132" 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-04-17T03:33:15.811707" elapsed="0.000452"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:15.812690" level="INFO">{1: 8}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:15.812319" elapsed="0.000418"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:15.813152" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:15.812883" elapsed="0.000318"/>
</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-04-17T03:33:15.813834" elapsed="0.000247"/>
</kw>
<msg time="2026-04-17T03:33:15.814190" level="INFO">${status} = PASS</msg>
<msg time="2026-04-17T03:33:15.814238" level="INFO">${old_connection_index} = 8</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:15.813366" elapsed="0.000896"/>
</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-04-17T03:33:15.815214" elapsed="0.000147"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-17T03:33:15.816101" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-17T03:33:15.815868" elapsed="0.000870">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:15.815521" elapsed="0.001287"/>
</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-04-17T03:33:15.817310" elapsed="0.000108"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:15.816987" elapsed="0.000477"/>
</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-04-17T03:33:15.814624" elapsed="0.002884"/>
</kw>
<status status="PASS" start="2026-04-17T03:33:15.814341" elapsed="0.003214"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:15.814321" elapsed="0.003261"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-17T03:33:15.818441" level="INFO">${ip_address} = 10.30.170.120</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-04-17T03:33:15.818161" elapsed="0.000307"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-17T03:33:15.818517" elapsed="0.000040"/>
</return>
<msg time="2026-04-17T03:33:15.818688" level="INFO">${odl_ip} = 10.30.170.120</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-17T03:33:15.817827" elapsed="0.000885"/>
</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-04-17T03:33:15.819021" elapsed="0.000484"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:33:15.819789" level="INFO">index=10
host=10.30.170.120
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-04-17T03:33:15.819893" level="INFO">${karaf_connection_object} = index=10
host=10.30.170.120
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_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-17T03:33:15.819673" elapsed="0.000246"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-17T03:33:15.820081" elapsed="0.002809"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-17T03:33:15.823408" level="INFO">Logging into '10.30.170.120:8101' as 'karaf'.</msg>
<msg time="2026-04-17T03:33:15.824787" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</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="FAIL" start="2026-04-17T03:33:15.823107" elapsed="0.002275">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:33:15.828902" elapsed="0.000343"/>
</kw>
<kw name="Open 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-04-17T03:33:15.829407" elapsed="0.000178"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:33:15.829727" elapsed="0.000113"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:33:15.826560" elapsed="0.003404"/>
</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-04-17T03:33:15.825769" elapsed="0.004246"/>
</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="FAIL" start="2026-04-17T03:33:15.810415" elapsed="0.019694">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<msg time="2026-04-17T03:33:15.830218" level="FAIL">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</msg>
<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="FAIL" start="2026-04-17T03:33:12.673629" elapsed="3.156690">Keyword 'Open_Controller_Karaf_Console_On_Background' failed after retrying for 3 seconds. The last error was: NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.120</status>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-17T03:33:12.673247" elapsed="3.157145"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-17T03:33:12.672963" elapsed="3.157475"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-04-17T03:33:12.672734" elapsed="3.157752"/>
</for>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-17T03:33:11.993429" elapsed="3.837129"/>
</kw>
<kw name="Create_Default_Session" owner="TemplatedRequests">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:33:15.834731" level="INFO">Creating Session using : alias=default, url=http://10.30.170.120:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a4415d02650&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-04-17T03:33:15.834313" elapsed="0.000671"/>
</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-04-17T03:33:15.833852" elapsed="0.001206"/>
</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-04-17T03:33:15.840409" level="INFO">${odl_connection} = 12</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-04-17T03:33:15.839983" elapsed="0.000454"/>
</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-04-17T03:33:15.842539" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:33:15.842628" 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-04-17T03:33:15.842199" 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>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:33:15.842849" elapsed="0.000400"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:33:15.844145" level="INFO">Logging into '10.30.170.120:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:33:16.211747" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 17 03:33:12 UTC 2026

  System load:  0.02               Processes:             119
  Usage of /:   10.4% of 77.35GB   Users logged in:       0
  Memory usage: 2%                 IPv4 address for ens3: 10.30.170.120
  Swap usage:   0%                 IPv6 address for ens3: 2607:f0d0:1002:11::2


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:33:12 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:33:15.843777" elapsed="0.368645"/>
</kw>
<msg time="2026-04-17T03:33:16.212636" 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-04-17T03:33:15.843413" elapsed="0.369410"/>
</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-04-17T03:33:15.841589" elapsed="0.371842"/>
</kw>
<msg time="2026-04-17T03:33:16.213556" 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-04-17T03:33:15.841050" elapsed="0.372727"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-17T03:33:15.840632" elapsed="0.373481"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-04-17T03:33:16.214260" elapsed="0.000119"/>
</return>
<msg time="2026-04-17T03:33:16.214855" level="INFO">${odl} = 12</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-04-17T03:33:15.839660" elapsed="0.375311"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-04-17T03:33:16.225693" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-04-17T03:33:16.233975" 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-04-17T03:33:16.215506" elapsed="0.018829"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:33:16.235019" elapsed="0.000842"/>
</kw>
<if>
<branch type="IF" condition="not (${tools_system_connect})">
<return>
<status status="NOT RUN" start="2026-04-17T03:33:16.236606" elapsed="0.000047"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:16.236144" elapsed="0.000595"/>
</branch>
<status status="PASS" start="2026-04-17T03:33:16.236069" elapsed="0.000739"/>
</if>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:33:16.245209" level="INFO">${tools_connection} = 13</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-04-17T03:33:16.244496" elapsed="0.000762"/>
</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-04-17T03:33:16.247843" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:33:16.247945" 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-04-17T03:33:16.247455" elapsed="0.000516"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:33:16.248130" elapsed="0.000372"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:33:16.249396" level="INFO">Logging into '10.30.171.238:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:33:16.951157" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 17 03:33:16 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:30:21 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:33:16.249058" elapsed="0.702365"/>
</kw>
<msg time="2026-04-17T03:33:16.951563" 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-04-17T03:33:16.248661" elapsed="0.703015"/>
</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-04-17T03:33:16.246847" elapsed="0.704978"/>
</kw>
<msg time="2026-04-17T03:33:16.951884" 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-04-17T03:33:16.246177" elapsed="0.705771"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-17T03:33:16.245588" elapsed="0.706443"/>
</kw>
<return>
<value>${tools_connection}</value>
<status status="PASS" start="2026-04-17T03:33:16.952235" elapsed="0.000056"/>
</return>
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-04-17T03:33:16.243527" elapsed="0.708930"/>
</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-04-17T03:33:15.835359" elapsed="1.117156"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:33:16.953062" level="INFO">index=13
host=10.30.171.238
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-04-17T03:33:16.953187" level="INFO">${current_connection} = index=13
host=10.30.171.238
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-04-17T03:33:16.952836" elapsed="0.000379"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:33:16.956340" level="INFO">${current_prompt} = &gt;</msg>
<var>${current_prompt}</var>
<arg>${current_connection.prompt}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:33:16.953375" elapsed="0.002993"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:16.956793" level="INFO">&gt;</msg>
<arg>${current_prompt}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:16.956527" elapsed="0.000314"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-17T03:33:16.961309" level="INFO">${prompt} = &gt;</msg>
<arg>${prompt}</arg>
<arg>${current_prompt}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-17T03:33:16.957025" elapsed="0.004336"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-17T03:33:16.961863" level="INFO">Creating Session using : alias=session, url=http://10.30.170.120:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a4415e12e90&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-04-17T03:33:16.961536" elapsed="0.000559"/>
</kw>
<kw name="Deploy_Test_Tool" owner="NexusKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-17T03:33:16.984260" level="INFO">${name_prefix} = pcep-pcc-mock-</msg>
<var>${name_prefix}</var>
<arg>${artifact}-</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-17T03:33:16.982972" elapsed="0.001354"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:33:16.985446" 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-04-17T03:33:16.984698" elapsed="0.000797"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:33:16.986668" 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-04-17T03:33:16.985804" elapsed="0.000914"/>
</kw>
<kw name="Deploy_Artifact" owner="NexusKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_url}""" != ""</arg>
<arg>Deploy_From_Url</arg>
<arg>${explicit_url}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:33:16.988642" elapsed="0.000482"/>
</kw>
<kw name="Fetch From Left" owner="String">
<msg time="2026-04-17T03:33:16.989656" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot</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-04-17T03:33:16.989338" elapsed="0.000353"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-17T03:33:16.990427" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot</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-04-17T03:33:16.989895" elapsed="0.000565"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Magnesium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:33:17.016461" elapsed="0.000780"/>
</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-04-17T03:33:17.015533" elapsed="0.001835"/>
</kw>
<msg time="2026-04-17T03:33:17.017444" 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-04-17T03:33:17.004056" elapsed="0.013492"/>
</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-04-17T03:33:17.003085" elapsed="0.014560"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Aluminium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:33:17.043684" elapsed="0.000813"/>
</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-04-17T03:33:17.042687" elapsed="0.001926"/>
</kw>
<msg time="2026-04-17T03:33:17.044683" 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-04-17T03:33:17.030165" elapsed="0.014603"/>
</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-04-17T03:33:17.029081" elapsed="0.015939"/>
</kw>
<kw name="Run_Keyword_If_At_Most_Silicon" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Most" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &lt;= ${Stream_dict}[${upper_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:33:17.067587" elapsed="0.000717"/>
</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-04-17T03:33:17.066744" elapsed="0.001676"/>
</kw>
<msg time="2026-04-17T03:33:17.068485" 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-04-17T03:33:17.057527" elapsed="0.011043"/>
</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-04-17T03:33:17.056585" elapsed="0.012072"/>
</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-04-17T03:33:17.071956" elapsed="0.000318"/>
</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-04-17T03:33:17.072827" elapsed="0.000210"/>
</kw>
<msg time="2026-04-17T03:33:17.073095" 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-04-17T03:33:17.072442" elapsed="0.000720"/>
</kw>
<msg time="2026-04-17T03:33:17.073275" 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-04-17T03:33:17.071641" elapsed="0.001659"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:33:17.073634" level="INFO">index=13
host=10.30.171.238
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-04-17T03:33:17.073738" level="INFO">${current_ssh_connection} = index=13
host=10.30.171.238
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-04-17T03:33:17.073466" elapsed="0.000298"/>
</kw>
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-17T03:33:17.078741" level="INFO">${odl_connection} = 14</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-04-17T03:33:17.078240" elapsed="0.000528"/>
</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-04-17T03:33:17.080578" level="INFO">Length is 0.</msg>
<msg time="2026-04-17T03:33:17.080655" 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-04-17T03:33:17.080273" elapsed="0.000405"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:33:17.080830" elapsed="0.000371"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-17T03:33:17.082814" level="INFO">Logging into '10.30.170.120:22' as 'jenkins'.</msg>
<msg time="2026-04-17T03:33:17.412148" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 17 03:33:12 UTC 2026

  System load:  0.02               Processes:             119
  Usage of /:   10.4% of 77.35GB   Users logged in:       0
  Memory usage: 2%                 IPv4 address for ens3: 10.30.170.120
  Swap usage:   0%                 IPv6 address for ens3: 2607:f0d0:1002:11::2


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 17 03:33:16 2026 from 10.30.171.144
[?2004h[jenkins@releng-26932-188-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-04-17T03:33:17.081714" elapsed="0.330812"/>
</kw>
<msg time="2026-04-17T03:33:17.412739" 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-04-17T03:33:17.081366" elapsed="0.331614"/>
</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-04-17T03:33:17.079750" elapsed="0.333510"/>
</kw>
<msg time="2026-04-17T03:33:17.413595" 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-04-17T03:33:17.079332" elapsed="0.334400"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-17T03:33:17.078988" elapsed="0.334969"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-04-17T03:33:17.414102" elapsed="0.000119"/>
</return>
<doc>Open a connection to the ODL system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-04-17T03:33:17.077880" elapsed="0.336710"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-17T03:33:17.416066" level="INFO">Executing command 'sh search.sh /tmp/karaf-0.23.1-SNAPSHOT/system pcep-impl'.</msg>
<msg time="2026-04-17T03:33:17.429582" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-17T03:33:17.429863" level="INFO">${version} = Path '/tmp/karaf-0.23.1-SNAPSHOT/system' does not exist or is not a directory</msg>
<msg time="2026-04-17T03:33:17.429966" level="INFO">${result} = 1</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-04-17T03:33:17.415206" elapsed="0.014799"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-17T03:33:17.430483" elapsed="0.000643"/>
</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-04-17T03:33:17.439381" elapsed="0.000181"/>
</kw>
<msg time="2026-04-17T03:33:17.439623" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-17T03:33:17.438097" elapsed="0.001603"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:17.439858" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:17.440041" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-17T03:33:17.431791" elapsed="0.008341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:17.440562" level="INFO">Path '/tmp/karaf-0.23.1-SNAPSHOT/system' does not exist or is not a directory</msg>
<arg>${version}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-17T03:33:17.440288" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="${result}!=0">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-17T03:33:17.441381" level="FAIL">Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</msg>
<arg>Component "${component}": searching for "${itemlist}" found no version, cannot locate test tool.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-17T03:33:17.440959" elapsed="0.000522">Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</status>
</kw>
<status status="FAIL" start="2026-04-17T03:33:17.440711" elapsed="0.000847">Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</status>
</branch>
<status status="FAIL" start="2026-04-17T03:33:17.440676" elapsed="0.000922">Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</status>
</if>
<kw name="Split String" owner="String">
<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="NOT RUN" start="2026-04-17T03:33:17.441766" elapsed="0.000022"/>
</kw>
<return>
<value>${version}</value>
<value>${location}</value>
<status status="NOT RUN" start="2026-04-17T03:33:17.441848" elapsed="0.000023"/>
</return>
<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="FAIL" start="2026-04-17T03:33:17.071249" elapsed="0.370747">Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</status>
</kw>
<status status="FAIL" start="2026-04-17T03:33:17.068781" elapsed="0.373287">Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</status>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${version}</var>
<var>${location}</var>
<arg>${build_version}</arg>
<arg>${build_location}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:17.442293" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:17.442100" elapsed="0.000282"/>
</branch>
<status status="FAIL" start="2026-04-17T03:33:17.068738" elapsed="0.373670">Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</status>
</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-04-17T03:33:17.442624" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:17.442481" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:33:17.442465" elapsed="0.000240"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:33:17.442853" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:33:17.443059" elapsed="0.000031"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:33:17.443260" elapsed="0.000033"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${url}</var>
<arg>${urlbase}/${location}/${artifact}/${version}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:17.443510" elapsed="0.000030"/>
</kw>
<kw name="Execute_Command_Should_Pass" owner="SSHKeywords">
<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="NOT RUN" start="2026-04-17T03:33:17.443916" elapsed="0.000047"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${namepart}</var>
<arg>SSHKeywords.Execute_Command_Should_Pass</arg>
<arg>echo "${metadata}" | grep value | head -n 1 | cut -d '&gt;' -f 2 | cut -d '&lt;' -f 1</arg>
<arg>stderr_must_be_empty=${True}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:17.444124" elapsed="0.000022"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${length}</var>
<arg>${namepart}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:17.444337" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-04-17T03:33:17.444510" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${filename}</var>
<arg>${name_prefix}${namepart}${name_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:17.444672" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${filename}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:17.444828" elapsed="0.000019"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${url}</var>
<arg>${url}/${filename}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:17.444998" elapsed="0.000021"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<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="NOT RUN" start="2026-04-17T03:33:17.445165" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${response}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:17.445327" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${result} == 0">
<return>
<value>${filename}</value>
<status status="NOT RUN" start="2026-04-17T03:33:17.445447" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-17T03:33:17.445411" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:33:17.445393" elapsed="0.000116"/>
</if>
<kw name="Replace String Using Regexp" owner="String">
<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="NOT RUN" start="2026-04-17T03:33:17.445645" elapsed="0.000020"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<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="NOT RUN" start="2026-04-17T03:33:17.445813" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="${result} != 0">
<kw name="Fail" owner="BuiltIn">
<arg>Artifact "${artifact}" in component "${component}" could not be downloaded from ${release_url} nor ${url}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:17.446055" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-17T03:33:17.445907" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-04-17T03:33:17.445891" elapsed="0.000241"/>
</if>
<return>
<value>${filename}</value>
<status status="NOT RUN" start="2026-04-17T03:33:17.446164" elapsed="0.000014"/>
</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/opendaylight.snapshot/org/opendaylight/integration/karaf/0.23.1-SNAPSHOT/karaf-.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-04-17T03:33:16.987722" elapsed="0.458546">Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</status>
</kw>
<return>
<value>${filename}</value>
<status status="NOT RUN" start="2026-04-17T03:33:17.446382" elapsed="0.000016"/>
</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-04-17T03:33:16.974367" elapsed="0.472126">Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</status>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${filename}</arg>
<arg>${name}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-17T03:33:17.446673" elapsed="0.000021"/>
</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-04-17T03:33:17.446911" elapsed="0.000047"/>
</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-04-17T03:33:11.992759" elapsed="5.454310">Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</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-04-17T03:33:17.447214" elapsed="0.000694">Parent suite setup failed:
Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</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-04-17T03:33:17.448183" elapsed="0.000512">Parent suite setup failed:
Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</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-04-17T03:33:17.448902" elapsed="0.000839">Parent suite setup failed:
Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</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-04-17T03:33:17.450141" elapsed="0.000677">Parent suite setup failed:
Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</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-04-17T03:33:17.451188" elapsed="0.000546">Parent suite setup failed:
Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</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-04-17T03:33:17.452050" elapsed="0.001216">Parent suite setup failed:
Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</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-04-17T03:33:17.453531" elapsed="0.000477">Parent suite setup failed:
Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</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-04-17T03:33:17.454273" elapsed="0.000425">Parent suite setup failed:
Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</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-04-17T03:33:17.454978" elapsed="0.000479">Parent suite setup failed:
Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</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-04-17T03:33:17.455814" elapsed="0.000564">Parent suite setup failed:
Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</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-04-17T03:33:17.456629" elapsed="0.000492">Parent suite setup failed:
Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</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-04-17T03:33:17.457355" elapsed="0.000476">Parent suite setup failed:
Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</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-04-17T03:33:17.458016" elapsed="0.000509">Parent suite setup failed:
Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</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-04-17T03:33:17.458702" elapsed="0.000386">Parent suite setup failed:
Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</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-04-17T03:33:17.459270" elapsed="0.000483">Parent suite setup failed:
Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</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-04-17T03:33:17.459980" elapsed="0.000408">Parent suite setup failed:
Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</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-04-17T03:33:17.460559" elapsed="0.000426">Parent suite setup failed:
Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</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-04-17T03:33:17.461196" elapsed="0.000324">Parent suite setup failed:
Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</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-04-17T03:33:17.461722" elapsed="0.000481">Parent suite setup failed:
Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</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-04-17T03:33:17.462422" elapsed="0.000314">Parent suite setup failed:
Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.</status>
</test>
<kw name="Tear_It_Down" type="TEARDOWN">
<kw name="Get File" owner="SSHLibrary">
<msg time="2026-04-17T03:33:17.475960" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-04-17T03:33:17.485077" 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-04-17T03:33:17.463776" elapsed="0.022889">There were no source files matching 'pccmock.log'.</status>
</kw>
<kw name="Run" owner="OperatingSystem">
<msg time="2026-04-17T03:33:17.488642" level="INFO">Running command 'cat pccmock.log 2&gt;&amp;1'.</msg>
<msg time="2026-04-17T03:33:17.492573" 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
[http://robotframework.org/robotframework/latest/libraries/Process.html|
Process] library instead._</doc>
<status status="PASS" start="2026-04-17T03:33:17.487166" elapsed="0.005450"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-17T03:33:17.493401" 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-04-17T03:33:17.492869" elapsed="0.000598"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-17T03:33:17.493811" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-17T03:33:17.493675" elapsed="0.000462"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-04-17T03:33:17.494413" elapsed="0.000475"/>
</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-04-17T03:33:17.463389" elapsed="0.031734">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-04-17T03:33:11.895826" elapsed="5.599463">Suite setup failed:
Component "bgpcep": searching for "pcep-impl" found no version, cannot locate test tool.

Also suite teardown failed:
There were no source files matching 'pccmock.log'.</status>
</suite>
<status status="FAIL" start="2026-04-17T03:10:23.228030" elapsed="1374.270783"/>
</suite>
<statistics>
<total>
<stat pass="37" fail="355" skip="0">All Tests</stat>
</total>
<tag>
<stat pass="16" fail="133" skip="0">critical</stat>
<stat pass="1" fail="0" skip="0">local_run</stat>
</tag>
<suite>
<stat name="bgpcep-userfeatures.txt" id="s1" pass="37" fail="355" 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="0" fail="2" skip="0">bgpcep-userfeatures.txt.Bgp Functional Md5</stat>
<stat name="Basic" id="s1-s4" pass="0" fail="38" skip="0">bgpcep-userfeatures.txt.Basic</stat>
<stat name="Bgp Ipv6 Basic" id="s1-s5" pass="4" fail="32" skip="0">bgpcep-userfeatures.txt.Bgp Ipv6 Basic</stat>
<stat name="Bgp Llgr Basic" id="s1-s6" pass="2" fail="2" skip="0">bgpcep-userfeatures.txt.Bgp Llgr Basic</stat>
<stat name="Bgp App Peer Basic" id="s1-s7" pass="11" fail="17" skip="0">bgpcep-userfeatures.txt.Bgp App Peer Basic</stat>
<stat name="Ibgp Peers Basic" id="s1-s8" pass="0" fail="36" skip="0">bgpcep-userfeatures.txt.Ibgp Peers Basic</stat>
<stat name="Ebgp Peers Basic" id="s1-s9" pass="0" fail="22" skip="0">bgpcep-userfeatures.txt.Ebgp Peers Basic</stat>
<stat name="010 Bgp Flowspec" id="s1-s10" pass="0" fail="5" skip="0">bgpcep-userfeatures.txt.010 Bgp Flowspec</stat>
<stat name="Ibgp Peer Lsp" id="s1-s11" pass="4" fail="8" skip="0">bgpcep-userfeatures.txt.Ibgp Peer Lsp</stat>
<stat name="010 Bgp Functional L3Vpn" id="s1-s12" pass="2" fail="7" skip="0">bgpcep-userfeatures.txt.010 Bgp Functional L3Vpn</stat>
<stat name="030 Bgp Functional Evpn" id="s1-s13" pass="2" fail="76" skip="0">bgpcep-userfeatures.txt.030 Bgp Functional Evpn</stat>
<stat name="040 Bgp Functional Route Ref" id="s1-s14" pass="0" fail="6" skip="0">bgpcep-userfeatures.txt.040 Bgp Functional Route Ref</stat>
<stat name="020 Bgp Functional Multipath" id="s1-s15" pass="0" fail="4" skip="0">bgpcep-userfeatures.txt.020 Bgp Functional Multipath</stat>
<stat name="060 Bgp Functional Mvpn" id="s1-s16" pass="2" fail="27" skip="0">bgpcep-userfeatures.txt.060 Bgp Functional Mvpn</stat>
<stat name="070 Bgp Functional L3Vpn Mcast" id="s1-s17" pass="2" fail="8" skip="0">bgpcep-userfeatures.txt.070 Bgp Functional L3Vpn Mcast</stat>
<stat name="080 Bgp Functional Rt Constrain" id="s1-s18" pass="2" fail="12" skip="0">bgpcep-userfeatures.txt.080 Bgp Functional Rt Constrain</stat>
<stat name="090 Bgp Functional Rt Constrain Validation" id="s1-s19" pass="4" fail="7" skip="0">bgpcep-userfeatures.txt.090 Bgp Functional Rt Constrain Validation</stat>
<stat name="Bgp Policies Default" id="s1-s20" pass="2" fail="6" 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-04-17T03:10:26.781236" 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-04-17T03:10:37.566466" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:10:37.780075" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:10:38.182997" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:10:38.301716" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:10:38.503530" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:10:38.906646" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:10:39.116774" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:10:39.318442" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:10:39.721288" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:10:39.839099" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:10:40.040895" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:10:40.459832" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:10:40.546351" 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-04-17T03:10:40.547185" 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-04-17T03:10:40.547768" 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-04-17T03:10:40.548290" 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-04-17T03:10:40.554493" 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-04-17T03:10:40.559404" 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-04-17T03:10:45.082162" 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-04-17T03:11:56.769227" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:11:56.971112" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:11:57.374059" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:11:57.477049" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:11:57.678613" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:11:58.081205" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:01.101440" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:01.303741" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:01.706053" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:04.727753" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:04.929450" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:05.332766" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:05.500968" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:05.702866" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:06.106471" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:09.128787" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:09.330265" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:09.732859" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:12.753425" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:12.955460" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:13.358157" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:13.522838" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:13.724324" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:14.126489" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:17.150829" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:17.352566" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:17.755228" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:20.776896" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:20.978359" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:21.380715" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:12:21.726166" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:21.927718" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:22.330419" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:24.469696" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:24.671118" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:25.074237" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:27.224639" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:27.427354" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:27.830583" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:29.978390" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:30.180021" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:30.583303" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:32.721311" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:32.922747" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:33.325629" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:33.524781" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:12:33.726586" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:12:34.129669" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:12:34.323485" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:34.526857" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:34.930550" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:37.078791" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:37.280657" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:37.683338" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:39.833159" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:40.034974" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:40.437293" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:42.575639" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:42.777491" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:43.193361" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:45.340911" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:45.542405" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:45.945319" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:46.271612" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:12:46.473827" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:12:46.877221" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:12:47.141399" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:47.343113" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:47.745454" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:49.888248" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:50.090222" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:50.493187" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:52.630832" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:52.832393" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:53.235005" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:55.372769" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:55.574372" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:55.987709" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:58.129486" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:58.332917" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:58.736493" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:58.934641" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:12:59.136435" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:12:59.540285" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:12:59.742262" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:12:59.944506" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:00.347264" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:02.495403" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:02.698124" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:03.101413" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:05.242982" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:05.445881" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:05.849842" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:07.984672" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:08.186458" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:08.589734" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:10.741096" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:10.942680" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:11.345151" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:11.698659" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:13:11.900513" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:13:12.303292" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:13:12.508441" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:12.710307" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:13.113622" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:15.251838" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:15.453428" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:15.856168" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:17.994449" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:18.213109" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:18.616130" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:20.768868" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:20.970448" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:21.373070" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:23.521746" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:23.723409" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:24.126021" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:24.334501" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:13:24.536308" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:13:24.939136" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:13:25.151300" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:25.352790" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:25.755060" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:27.902233" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:28.103797" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:28.506651" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:30.662673" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:30.864451" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:31.267057" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:33.409475" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:33.611116" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:34.013641" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:36.167339" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:36.368688" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:36.771087" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:13:38.016358" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:13:38.218265" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:13:38.621831" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:13:38.965088" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:13:39.166783" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:13:39.571023" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:13:39.669050" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:39.870222" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:40.272062" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:43.293600" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:43.496209" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:43.898835" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:46.920032" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:47.121701" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:47.524060" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:47.681731" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:47.883290" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:48.285550" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:51.305747" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:51.507374" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:51.910466" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:54.928574" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:55.130188" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:55.533051" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:55.695460" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:55.897047" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:56.299153" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:59.319770" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:59.521590" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:13:59.924337" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:14:02.946715" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:14:03.150708" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:14:03.554166" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F127.0.0.1?content=nonconfig</msg>
<msg time="2026-04-17T03:14:04.037015" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:14:04.238508" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:14:04.641353" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:14:04.853048" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:05.054567" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:05.457279" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:07.616459" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:07.818249" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:08.220914" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:10.390996" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:10.592824" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:10.995292" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:13.158318" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:13.359990" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:13.762668" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:15.919115" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:16.120957" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:16.524108" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:16.739285" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:14:16.941474" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:14:17.345306" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:14:17.574722" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:14:17.777135" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:14:18.180005" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:14:18.434845" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:18.636330" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:19.038678" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:21.175775" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:21.377370" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:21.779604" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:23.946007" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:24.147606" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:24.550489" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:26.689622" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:26.891298" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:27.294153" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:29.452986" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:29.654699" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:30.057483" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:30.341203" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:14:30.543451" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:14:30.946199" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:14:31.260603" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:14:31.463077" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:14:31.866616" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:14:32.103694" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:32.305446" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:32.707709" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:34.871258" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:35.072957" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:35.475496" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:37.633507" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:37.835190" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:38.237801" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:40.396235" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:40.598074" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:41.000480" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:43.158227" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:43.359790" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:43.762193" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:14:44.000728" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:14:44.202347" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:14:44.604786" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:14:44.803907" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:14:45.005758" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:14:45.408739" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:14:45.619730" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:14:45.821492" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:14:46.224486" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:14:46.438429" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:46.640070" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:47.042737" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:49.199548" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:49.401110" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:49.803594" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:51.935794" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:52.137401" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:52.539818" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:54.755763" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:54.957376" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:55.360194" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:57.499072" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:57.700585" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:58.103324" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv6-topology</msg>
<msg time="2026-04-17T03:14:58.678228" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:14:58.880283" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:14:59.282882" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:14:59.389990" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:14:59.592769" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:14:59.995149" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:03.017333" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:03.219263" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:03.622046" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:06.641494" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:06.843298" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:07.246176" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:07.407451" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:07.608893" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:08.012156" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:11.035066" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:11.236648" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:11.639767" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:14.659048" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:14.862547" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:15.265108" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:15.426252" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:15.627796" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:16.030242" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:19.052268" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:19.254344" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:19.658384" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:22.676992" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:22.878491" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:15:23.280869" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:04.498734" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:04.704420" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:05.106825" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:08.129759" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:08.331381" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:08.734248" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:11.753021" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:11.956308" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:12.358775" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:12.515283" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:12.716732" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:13.119226" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:16.136994" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:16.339236" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:16.742372" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:19.759811" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:19.962289" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:20.365496" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:20.527363" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:20.728645" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:21.131568" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:24.149922" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:24.351654" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:24.754649" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:27.773679" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:27.975659" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:28.378576" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F1.2.3.4?content=nonconfig</msg>
<msg time="2026-04-17T03:16:28.759758" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:16:28.962376" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:16:29.366019" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance: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>
<msg time="2026-04-17T03:16:29.764132" 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-04-17T03:16:35.842317" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:16:36.043909" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:16:36.446660" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:16:36.549901" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:16:36.751289" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:16:37.153872" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:16:52.178550" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:16:52.380275" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:16:52.783157" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:17:07.800438" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:17:08.002177" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:17:08.404872" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:17:08.563564" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:17:08.765376" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:17:09.167903" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:17:09.320124" 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-04-17T03:17:09.321109" 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-04-17T03:17:09.321954" 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-04-17T03:17:09.322785" 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-04-17T03:17:09.329645" 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-04-17T03:17:09.333067" 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-04-17T03:17:14.644725" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:17:14.846312" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:17:15.249278" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:17:15.560850" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:17:15.762804" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:17:16.165320" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:17:16.366012" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:16.567731" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:16.984290" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:18.155893" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:18.357772" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:18.760316" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:19.912723" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:20.114640" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:20.517439" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:21.662545" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:21.864317" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:22.267131" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:23.416504" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:23.618258" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:24.021644" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:25.267607" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:25.469658" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:25.872418" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:27.016648" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:27.218910" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:27.621661" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:28.773173" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:28.975631" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:29.378390" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:30.525268" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:30.726852" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:31.129443" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:32.263607" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:32.465085" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:32.867195" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:34.028551" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:34.230477" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:34.633101" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:35.788337" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:35.990369" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:36.393378" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:37.540481" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:37.742020" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:38.156242" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:39.298108" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:39.499515" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:39.902019" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:41.039344" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:41.240924" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:41.643656" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:42.788281" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:42.989870" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:43.392911" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:44.552785" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:44.754445" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:45.157181" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:46.302779" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:46.504475" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:46.907166" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:48.049799" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:48.251461" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:48.653824" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:49.795133" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:50.002346" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:50.422841" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:51.566707" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:51.768024" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:52.170322" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:53.319454" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:53.521953" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:53.924188" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:55.067186" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:55.268604" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:55.671064" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:56.813054" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:57.015114" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:57.417617" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:58.566668" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:58.768527" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:17:59.170859" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:00.317809" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:00.519458" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:00.922266" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:02.074106" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:02.275663" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:02.678256" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:03.830160" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:04.031798" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:04.434832" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:05.586713" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:05.788439" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:06.191157" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:07.334194" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:07.535493" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:07.937830" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:09.080668" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:09.282475" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:09.685457" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:10.838128" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:11.039821" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:11.442333" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:12.628885" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:12.830575" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:13.232779" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:14.380891" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:14.582358" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:14.985412" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:16.127602" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:16.329348" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:16.731665" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:17.872911" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:18.074536" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:18.476653" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:19.628287" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:19.829880" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:20.232478" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:21.386514" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:21.588318" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:21.990524" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:23.133867" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:23.335255" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:23.737531" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:24.879026" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:25.080392" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:25.482410" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:26.615238" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:26.831379" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:27.234148" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:28.385241" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:28.586753" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:28.990005" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:30.150999" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:30.352460" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:30.755094" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:31.911381" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:32.113136" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:32.515795" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:33.659727" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:33.861600" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:34.264564" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:35.427650" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:35.629217" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:36.032002" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:37.176293" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:37.378302" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:37.781764" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:38.939682" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:39.141571" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:39.544433" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:40.692976" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:40.894800" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:41.297505" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:42.440514" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:42.642675" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:43.045452" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:44.188730" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:44.390133" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:44.793070" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:45.934220" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:46.136170" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:46.539587" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:47.684021" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:47.888911" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:48.291253" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:49.432333" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:49.634015" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:50.036714" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:51.181123" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:51.382896" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:51.785493" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:52.923755" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:53.125184" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:53.527760" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:54.699521" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:54.901289" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:55.304103" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:56.457081" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:56.658909" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:57.061677" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:58.288411" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:58.490111" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:18:58.892120" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:00.040139" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:00.242561" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:00.644805" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:01.799614" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:02.001348" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:02.403723" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:03.560048" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:03.762201" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:04.165007" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:05.314658" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:05.516356" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:05.918750" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:07.074590" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:07.275996" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:07.678482" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:08.839480" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:09.041020" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:09.443187" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:10.585710" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:10.787217" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:11.189606" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:12.335519" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:12.537123" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:12.939577" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:14.114180" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:14.315991" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:14.718605" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:15.869117" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:16.070385" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:16.473447" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:17.616559" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:17.818105" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:18.220885" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:19.381496" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:19.583354" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:19.985642" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:21.133904" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:21.335437" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:21.737867" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:22.892972" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:23.094502" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:23.496996" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:24.665896" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:24.867404" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:25.270285" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:26.422669" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:26.624601" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:27.027218" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:28.163883" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:28.366166" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:28.769730" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:29.924326" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:30.127101" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:30.530805" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:31.689157" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:31.892241" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:32.295477" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:33.439524" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:33.641167" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:34.044303" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:35.191494" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:35.394021" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:35.796850" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:36.935275" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:37.136716" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:37.539477" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:38.677590" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:38.879068" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:39.281753" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:40.426071" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:40.627796" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:41.030689" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:42.178989" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:42.380625" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:42.784368" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:43.920307" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:44.122103" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:44.524910" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:45.662040" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:45.863544" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:46.266154" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:47.411120" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:47.612872" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:48.015546" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:49.159828" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:49.361332" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:49.763671" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:50.899779" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:51.101511" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:51.504149" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:52.635698" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:52.837251" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:53.239872" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:54.378171" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:54.579748" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:54.982053" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:56.125853" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:56.327476" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:56.730231" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:57.877512" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:58.083033" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:58.485776" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:59.626205" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:19:59.829097" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:00.239344" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:01.376084" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:01.582718" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:01.999112" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:03.172285" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:03.374085" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:03.776783" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:04.912097" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:05.113693" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:05.516165" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:06.653020" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:06.854444" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:07.259089" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:08.412609" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:08.614408" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:09.017088" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:10.160417" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:10.362391" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:10.765188" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:11.914125" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:12.115576" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:12.518350" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:13.668789" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:13.870239" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:14.273558" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:15.417846" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:15.619404" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:16.021837" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:17.166492" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:17.367855" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:17.770124" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:18.258899" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:18.460373" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:18.862570" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:20.023242" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:20.224838" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:20.627544" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:21.759881" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:21.961426" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:22.364454" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:23.512297" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:23.713764" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:24.116325" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:25.278642" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:25.480646" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:25.883187" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:27.029215" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:27.231058" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:27.634264" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:28.796784" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:28.998586" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:29.401144" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:50.517200" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:50.719186" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:51.122500" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:52.288814" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:52.490768" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:52.894436" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:54.046299" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:54.248301" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:54.651868" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:55.907553" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:56.109030" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:56.512212" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:57.655034" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:57.857036" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:58.260537" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:59.407796" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:20:59.609514" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:00.012195" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:01.169694" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:01.371386" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:01.773662" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:25.074329" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:25.276115" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:25.679189" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:26.826574" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:27.028290" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:27.431440" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:28.568824" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:28.770895" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:29.173412" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:30.328453" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:30.530189" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:30.932762" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:32.082165" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:32.284071" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:32.687011" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:33.830068" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:34.031630" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:34.434767" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:35.572998" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:35.775027" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:36.179833" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:47.142414" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:47.344149" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:47.746739" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:48.909246" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:49.111087" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:49.513543" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:50.655951" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:50.857438" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:51.260036" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:52.408660" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:52.610173" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:53.012856" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:54.160358" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:54.362231" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:54.765305" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:55.913602" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:56.115773" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:56.519588" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:57.670254" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:57.872126" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:21:58.274622" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:11.381105" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:11.582891" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:11.985574" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:13.125047" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:13.326801" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:13.730152" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:14.894247" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:15.102995" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:15.505342" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:16.648815" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:16.850484" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:17.253194" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:18.396730" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:18.598530" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:19.001343" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:20.158097" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:20.359768" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:20.761689" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:21.901492" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:22.102966" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:22.505114" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:43.510918" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:43.712990" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:44.116158" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:45.262918" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:45.464854" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:45.867532" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:47.010612" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:47.212188" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:47.615015" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:48.753270" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:48.954691" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:49.357304" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:50.499039" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:50.700611" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:51.102995" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:52.275134" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:52.476917" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:52.879134" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:54.020688" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:54.222206" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:22:54.624848" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig</msg>
<msg time="2026-04-17T03:23:07.456185" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:23:07.658031" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:23:08.060741" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:23:08.251767" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:23:08.453344" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:23:08.856743" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:23:08.979034" 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-04-17T03:23:08.980193" 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-04-17T03:23:08.980857" 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-04-17T03:23:08.981407" 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-04-17T03:23:08.987748" 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-04-17T03:23:09.021789" 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-04-17T03:23:09.029443" 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-04-17T03:23:14.283031" 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-04-17T03:23:14.283822" 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-04-17T03:23:14.284395" 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-04-17T03:23:14.284885" 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-04-17T03:23:14.290886" 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-04-17T03:23:14.294084" 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-04-17T03:23:14.296132" 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-04-17T03:23:19.276209" 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-04-17T03:23:25.796070" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:25.998365" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:26.401401" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:29.532770" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:29.734407" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:30.136908" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:33.280136" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:33.481523" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:33.884031" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:37.027377" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:37.232375" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:37.634973" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:40.775069" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:40.976635" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:41.379701" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:44.507998" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:44.709291" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:45.112096" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:48.244580" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:48.446232" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:48.848975" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:51.982295" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:52.183990" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:52.586748" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:55.714761" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:55.916328" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:56.319326" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:59.456190" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:23:59.658139" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:00.061119" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:03.184211" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:03.385679" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:03.788857" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:06.940341" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:07.142040" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:07.545210" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:10.676300" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:10.877997" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:11.280644" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:14.409813" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:14.611521" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:15.014004" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:18.152068" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:18.353479" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:18.756137" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:21.891862" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:22.093530" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:22.496061" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:25.629904" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:25.831734" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:26.234729" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:26.429000" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:24:26.630562" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:24:27.033469" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:24:27.178763" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:27.380696" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:27.783506" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:28.044461" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:28.246288" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:28.657678" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:24:28.859455" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:24:29.061387" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:24:29.464540" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:24:29.487541" 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-04-17T03:24:29.488432" 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-04-17T03:24:29.489035" 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-04-17T03:24:29.489696" 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-04-17T03:24:29.496286" 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-04-17T03:24:29.499876" 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-04-17T03:24:29.501899" 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-04-17T03:24:38.367354" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:24:38.569127" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:24:38.972521" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:24:39.091363" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig</msg>
<msg time="2026-04-17T03:24:39.292746" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig</msg>
<msg time="2026-04-17T03:24:39.695093" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig</msg>
<msg time="2026-04-17T03:24:49.960571" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig</msg>
<msg time="2026-04-17T03:24:50.162154" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig</msg>
<msg time="2026-04-17T03:24:50.564888" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig</msg>
<msg time="2026-04-17T03:24:52.895846" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:24:53.097391" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:24:53.500181" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:24:53.816698" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:24:54.018509" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:24:54.421168" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:24:54.515364" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig</msg>
<msg time="2026-04-17T03:24:54.716698" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig</msg>
<msg time="2026-04-17T03:24:55.119435" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib?content=nonconfig</msg>
<msg time="2026-04-17T03:25:05.428993" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<msg time="2026-04-17T03:25:05.630790" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<msg time="2026-04-17T03:25:06.034251" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<msg time="2026-04-17T03:25:07.196541" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<msg time="2026-04-17T03:25:07.398190" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<msg time="2026-04-17T03:25:07.803884" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<msg time="2026-04-17T03:25:08.954315" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<msg time="2026-04-17T03:25:09.155853" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<msg time="2026-04-17T03:25:09.558914" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<msg time="2026-04-17T03:25:10.708178" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<msg time="2026-04-17T03:25:10.909977" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<msg time="2026-04-17T03:25:11.312703" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<msg time="2026-04-17T03:25:12.458848" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<msg time="2026-04-17T03:25:12.660588" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<msg time="2026-04-17T03:25:13.063690" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<msg time="2026-04-17T03:25:14.203273" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<msg time="2026-04-17T03:25:14.404712" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<msg time="2026-04-17T03:25:14.807371" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<msg time="2026-04-17T03:25:15.958514" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<msg time="2026-04-17T03:25:16.159905" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<msg time="2026-04-17T03:25:16.562441" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-linkstate:linkstate-routes?content=nonconfig</msg>
<msg time="2026-04-17T03:25:18.892057" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:25:19.093599" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:25:19.496455" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:25:19.566834" 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-04-17T03:25:30.960863" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:25:31.162394" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:25:31.565115" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:25:31.849091" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:25:32.050883" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:25:32.453402" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:25:32.685026" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:32.887036" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:33.290608" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:35.452115" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:35.654403" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:36.058104" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:38.213539" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:38.415551" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:38.818878" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:39.046695" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:39.248399" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:39.651580" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:41.970678" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:42.172474" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:42.576229" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:44.891806" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:45.093848" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:45.497231" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:52.045683" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:52.250118" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:52.652551" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:54.804113" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:55.009279" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:55.414551" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:57.563639" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:57.767091" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:58.172751" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:25:58.449913" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</msg>
<msg time="2026-04-17T03:25:58.652712" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</msg>
<msg time="2026-04-17T03:25:59.058781" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</msg>
<msg time="2026-04-17T03:25:59.188564" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</msg>
<msg time="2026-04-17T03:25:59.393323" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</msg>
<msg time="2026-04-17T03:25:59.799411" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Ampls-labeled-vpn-subsequent-address-family/bgp-vpn-ipv4:vpn-ipv4-routes</msg>
<msg time="2026-04-17T03:26:00.165082" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:26:00.367786" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:26:00.773170" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:26:00.959620" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:26:01.163864" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:26:01.566742" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:26:01.638424" 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-04-17T03:26:06.800132" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:26:07.002269" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:26:07.405155" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:26:07.678304" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:26:07.880049" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:26:08.283082" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:26:14.484225" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:14.685873" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:15.088656" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:15.194579" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:15.447136" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:15.850174" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:15.939400" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:16.140845" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:16.543915" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:16.633884" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:16.835677" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:17.239813" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:17.332744" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:17.540634" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:17.957358" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:18.048320" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:18.250052" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:18.653274" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:18.743130" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:18.944909" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:19.347897" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:19.435185" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:19.636600" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:20.039238" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:20.138602" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:20.340366" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:20.743346" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:20.834900" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:21.036601" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:21.438796" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:21.529534" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:21.731158" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:22.133899" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:22.218389" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:22.419893" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:22.822806" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:22.912120" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:23.113738" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:23.517222" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:23.606573" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:23.808495" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:24.211800" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:24.304356" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:24.505829" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:24.908718" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:24.996345" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:25.197746" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:25.600674" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:25.691827" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:25.893394" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:26.295920" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:26.390565" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:26.592343" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:26.995488" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:27.088726" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:27.290300" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:27.693660" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:27.796915" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:27.998596" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:28.401286" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:28.494126" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:28.695506" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:29.099021" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:29.194661" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:29.396208" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:29.799258" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:29.889373" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:30.090853" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:30.493444" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:30.596212" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:30.797891" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:31.200880" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:31.287159" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:31.488673" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:31.891432" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:31.989571" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:32.191321" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:32.594387" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:32.870280" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:33.071757" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:33.474345" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:33.563027" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:33.765261" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:34.168131" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:34.273072" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:34.503586" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:34.906625" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:34.991429" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:35.193040" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:35.595546" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:35.708837" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:35.910796" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:36.313506" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:36.406243" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:36.608162" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:37.011489" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:37.114448" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:37.315871" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:37.718915" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:37.814059" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:38.015735" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:38.418810" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:38.511828" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:38.713555" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:39.116538" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:39.214875" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:39.416447" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:39.820467" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:39.953294" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:40.155236" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:40.564797" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:40.657849" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:40.859502" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:41.262642" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:41.354296" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:41.555601" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:41.958054" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:42.045846" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:42.248904" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:42.651287" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:42.745526" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:42.947145" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:43.349917" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:43.453051" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:43.655719" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:44.058519" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:44.146205" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:44.347534" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:44.749843" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:44.855778" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:45.057312" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:45.460157" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:45.551248" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:45.752742" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:46.155542" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:46.258585" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:46.460612" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:46.863320" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:46.963628" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:47.165210" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:47.567315" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:47.664104" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:47.865833" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:48.268348" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:48.358973" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:48.560539" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:48.962909" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:49.078373" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:49.280073" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:49.683007" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:49.775475" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:49.977091" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:50.379448" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:50.477960" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:50.679536" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:51.082228" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:51.175358" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:51.376832" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:51.779693" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:51.891546" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:52.093093" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:52.495234" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:52.576727" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:52.778239" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:53.180805" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:53.279808" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:53.481477" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:53.883684" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:53.973385" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:54.175042" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:54.577718" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:54.670318" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:54.871709" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:55.274156" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:55.370842" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:55.572643" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:55.975323" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:56.073352" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:56.275268" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:56.678036" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:56.776862" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:56.978842" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:57.383838" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:57.471218" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:57.673082" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:58.080728" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:58.177371" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:58.379384" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:58.784130" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:58.876295" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:59.081388" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:59.486553" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:59.582317" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:26:59.785351" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:00.194165" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:00.286227" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:00.489112" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:00.892916" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:00.992936" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:01.198023" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:01.601352" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:01.693846" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:01.897121" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:02.304919" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:02.401121" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:02.604563" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:03.009039" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:03.104613" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:03.309832" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:03.714090" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:03.808903" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:04.010860" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:04.413893" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:04.503992" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:04.707186" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:05.126729" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config</msg>
<msg time="2026-04-17T03:27:05.478138" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:27:05.679997" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:27:06.082477" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:27:06.298432" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:27:06.500242" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:27:06.903516" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:27:06.930827" 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-04-17T03:27:18.543069" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:27:18.745158" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:27:19.148091" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:27:19.440203" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:27:19.642371" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:27:20.045589" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:27:20.232561" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<msg time="2026-04-17T03:27:20.434213" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<msg time="2026-04-17T03:27:20.837372" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<msg time="2026-04-17T03:27:21.053397" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<msg time="2026-04-17T03:27:21.255354" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<msg time="2026-04-17T03:27:21.658541" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes</msg>
<msg time="2026-04-17T03:27:21.711097" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:21.913029" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:22.315970" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:25.337351" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:25.539055" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:25.941815" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:28.960780" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:29.162240" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:29.564619" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:29.604678" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:29.806505" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:30.209614" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:33.234451" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:33.437207" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:33.840425" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:36.861593" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:37.063084" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:37.465857" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:37.507208" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:37.708764" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:38.111814" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:41.130953" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:41.332558" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:41.735094" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:44.754232" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:44.955629" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:45.358265" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.238?content=nonconfig</msg>
<msg time="2026-04-17T03:27:45.698630" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:27:45.900473" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:27:46.303315" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:27:46.506113" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:27:46.707792" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:27:47.110225" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:27:47.193445" 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-04-17T03:27:58.147351" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:27:58.348889" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:27:58.751776" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:27:58.831462" 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-04-17T03:28:03.280466" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:28:03.482333" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:28:03.885824" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:28:04.158271" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:28:04.360474" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:28:04.764171" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:28:11.116090" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:11.317984" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:11.720876" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:11.848814" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:12.051194" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:12.453707" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:12.730193" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:12.932220" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:13.335838" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:15.491285" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:15.693396" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:16.097075" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:18.233779" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:18.435534" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:18.838782" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:19.120387" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:19.322085" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:19.725650" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:19.846961" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:20.049400" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:20.451834" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:20.712054" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:20.914221" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:21.318051" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:23.465354" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:23.667415" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:24.071184" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:26.224475" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:26.426527" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:26.829140" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:27.115069" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:27.316861" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:27.719532" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:27.839977" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:28.041726" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:28.444876" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:28.676681" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:28.878330" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:29.281333" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:31.434747" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:31.636538" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:32.039009" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:34.182784" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:34.384209" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:34.786799" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:35.083116" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:35.284822" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:35.687155" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:35.815644" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:36.017380" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:36.420081" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:36.653556" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:36.855268" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:37.258145" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:39.410510" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:39.612415" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:40.015429" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:42.150056" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:42.351675" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:42.754411" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:43.012549" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:43.214030" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:43.616628" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:43.739533" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:43.940921" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:44.343417" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:44.571302" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:44.772710" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:45.176137" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:47.333325" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:47.534721" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:47.938181" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:50.080018" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:50.281476" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:50.684109" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:50.966993" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:51.168530" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:51.572040" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:51.716527" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:51.918346" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:52.321569" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:52.574866" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:52.776683" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:53.179739" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:55.332172" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:55.533541" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:55.935973" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:58.073641" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:58.275123" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:58.678030" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:58.976581" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:59.178173" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:59.581421" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:59.704378" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:28:59.906173" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:00.308779" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:00.535230" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:00.736809" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:01.139153" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:03.285959" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:03.487521" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:03.890227" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:06.041051" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:06.242645" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:06.645325" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:06.922859" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:07.124386" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:07.527574" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:07.648202" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:07.849780" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:08.252511" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:08.487291" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:08.688896" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:09.091765" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:11.256753" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:11.458567" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:11.861191" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:14.003995" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:14.205614" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:14.608112" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:14.903127" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:15.104905" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:15.508130" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:15.622796" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:15.824300" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:16.226730" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:16.663342" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:16.865116" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:17.268078" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:19.407301" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:19.608828" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:20.012041" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:22.167536" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:22.369736" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:22.772075" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:23.069316" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:23.271176" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:23.673894" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:23.807529" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:24.009305" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:24.411378" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:24.656284" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:24.858094" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:25.260894" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:27.433496" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:27.635450" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:28.037860" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:30.188553" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:30.390356" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:30.792872" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:31.087857" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:31.290041" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:31.692777" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:31.818333" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:32.019884" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:32.423368" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:32.665437" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:32.867162" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:33.269566" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:35.428420" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:35.630242" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:36.033230" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:38.173363" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:38.374917" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:38.777462" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-ipv4</msg>
<msg time="2026-04-17T03:29:39.000248" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6</msg>
<msg time="2026-04-17T03:29:39.201667" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6</msg>
<msg time="2026-04-17T03:29:39.604532" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6</msg>
<msg time="2026-04-17T03:29:41.755441" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6</msg>
<msg time="2026-04-17T03:29:41.957164" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6</msg>
<msg time="2026-04-17T03:29:42.359914" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6</msg>
<msg time="2026-04-17T03:29:44.498112" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6</msg>
<msg time="2026-04-17T03:29:44.700143" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6</msg>
<msg time="2026-04-17T03:29:45.102842" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-ipv6</msg>
<msg time="2026-04-17T03:29:45.500056" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:29:45.701673" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:29:46.104975" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:29:46.309668" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:29:46.511350" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:29:46.913915" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:29:46.938522" 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-04-17T03:29:52.001254" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:29:52.202870" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:29:52.605623" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:29:52.902188" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:29:53.104439" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:29:53.506899" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:29:59.892694" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4</msg>
<msg time="2026-04-17T03:30:00.094364" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4</msg>
<msg time="2026-04-17T03:30:00.497287" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4</msg>
<msg time="2026-04-17T03:30:00.636775" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4</msg>
<msg time="2026-04-17T03:30:00.838438" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4</msg>
<msg time="2026-04-17T03:30:01.241274" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv4</msg>
<msg time="2026-04-17T03:30:01.493508" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:01.695192" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:02.097574" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:04.244501" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:04.446051" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:04.848366" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:06.999346" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:07.201452" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:07.604280" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:07.884180" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6</msg>
<msg time="2026-04-17T03:30:08.086071" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6</msg>
<msg time="2026-04-17T03:30:08.488614" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6</msg>
<msg time="2026-04-17T03:30:08.617394" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6</msg>
<msg time="2026-04-17T03:30:08.819094" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6</msg>
<msg time="2026-04-17T03:30:09.221789" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3vpn-mcast:l3vpn-mcast-routes-ipv6</msg>
<msg time="2026-04-17T03:30:09.456083" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:09.657678" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:10.060290" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:12.207552" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:12.409290" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:12.812324" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:14.966219" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:15.168791" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:15.572414" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:15.951204" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:30:16.153190" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:30:16.556907" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:30:16.739371" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:30:16.941359" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:30:17.344790" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:30:17.366347" 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-04-17T03:30:21.919524" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:30:22.121345" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:30:22.543123" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:30:22.845794" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:30:23.047392" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:30:23.449719" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:30:29.798514" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:30.000188" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:30.402840" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:30.530170" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:30.731823" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:31.134135" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:31.374189" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:31.575774" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:31.978999" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:34.118463" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:34.320138" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:34.722430" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:36.856862" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:37.058602" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:37.461627" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:37.733573" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:37.935896" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:38.338393" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:38.475770" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:38.677713" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:39.080752" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:39.308440" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:39.514636" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:39.917652" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:42.058733" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:42.260312" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:42.664093" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:44.822770" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:45.024892" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:45.427976" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:45.713883" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:45.916320" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:46.320314" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:46.447572" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:46.649630" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:47.054229" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:47.523710" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:47.728160" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:48.134645" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:50.278644" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:50.482421" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:50.887142" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:53.029322" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:53.231722" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:53.635800" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:53.918228" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:54.121438" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:54.525134" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:54.644522" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:54.846810" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:55.250175" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:application-rib=10.30.170.120/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>
<msg time="2026-04-17T03:30:55.497120" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:55.700177" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:56.104471" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:58.243862" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:58.446070" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:30:58.849817" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:31:01.006777" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:31:01.208687" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:31:01.611901" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.238/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>
<msg time="2026-04-17T03:31:01.971876" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:31:02.173621" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:31:02.576273" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/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.238</msg>
<msg time="2026-04-17T03:31:02.765413" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:31:02.967500" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:31:03.370723" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-instance=global-bgp/openconfig-network-instance:protocols/protocol=openconfig-policy-types%3ABGP,example-bgp-rib/bgp-openconfig-extensions:bgp/neighbors/neighbor=10.30.170.120</msg>
<msg time="2026-04-17T03:31:03.400106" 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-04-17T03:31:08.268115" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:31:08.469900" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:31:08.873254" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:31:09.209071" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:09.410693" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:09.813232" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:11.965825" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:12.167594" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:12.570613" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:14.725855" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:14.927727" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:15.331118" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:15.575113" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:15.776882" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:16.179538" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:18.325026" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:18.526538" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:18.929456" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:21.079474" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:21.281275" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:21.684314" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:21.906583" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-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>
<msg time="2026-04-17T03:31:22.108267" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-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>
<msg time="2026-04-17T03:31:22.510859" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-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>
<msg time="2026-04-17T03:31:24.670375" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-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>
<msg time="2026-04-17T03:31:24.872106" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-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>
<msg time="2026-04-17T03:31:25.275376" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-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>
<msg time="2026-04-17T03:31:27.454504" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-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>
<msg time="2026-04-17T03:31:27.656432" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-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>
<msg time="2026-04-17T03:31:28.058994" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-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>
<msg time="2026-04-17T03:31:28.392965" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:28.594760" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:28.998060" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:31.150180" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:31.351917" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:31.755446" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:33.899627" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:34.101456" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:34.504253" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /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>
<msg time="2026-04-17T03:31:35.120485" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:31:35.322146" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:31:35.724920" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:31:35.764912" 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-04-17T03:32:06.703393" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:06.905674" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:07.308057" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:10.443241" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:10.644918" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:11.047509" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:14.196216" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:14.397550" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:14.800273" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:17.942153" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:18.143703" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:18.546152" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:21.680722" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:21.884131" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:22.286750" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:25.419157" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:25.621759" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:26.024678" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:29.175849" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:29.379118" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:29.782007" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:32.922674" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:33.124284" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:33.527163" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:36.661355" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:36.863387" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:37.266443" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:40.405600" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:40.607342" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:41.009973" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:44.146098" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:44.348002" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:44.750837" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:47.878108" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:48.079829" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:48.482493" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:51.618139" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:51.819785" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:52.222503" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:55.369457" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:55.571141" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:55.973099" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:59.108383" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:59.310197" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:32:59.712552" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:33:02.862171" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:33:03.063635" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:33:03.466049" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:33:06.599807" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:33:06.801450" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:33:07.204500" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/network-topology:network-topology/topology=example-ipv4-topology</msg>
<msg time="2026-04-17T03:33:07.452569" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-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>
<msg time="2026-04-17T03:33:07.654113" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-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>
<msg time="2026-04-17T03:33:08.056685" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-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>
<msg time="2026-04-17T03:33:08.307630" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:33:08.509263" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:33:08.912177" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:33:09.235362" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:33:09.437024" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:33:09.839917" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib</msg>
<msg time="2026-04-17T03:33:10.408698" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:33:10.610445" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:33:11.014253" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-instance:network-instances/network-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>
<msg time="2026-04-17T03:33:11.205579" level="WARN">Retrying (RetryAdapter(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-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>
<msg time="2026-04-17T03:33:11.407484" level="WARN">Retrying (RetryAdapter(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-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>
<msg time="2026-04-17T03:33:11.811028" level="WARN">Retrying (RetryAdapter(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError("HTTPConnection(host='10.30.170.120', port=8181): Failed to establish a new connection: [Errno 111] Connection refused")': /rests/data/openconfig-network-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>
<msg time="2026-04-17T03:33:11.905141" 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-04-17T03:33:11.909848" 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-04-17T03:33:11.910372" 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-04-17T03:33:11.921828" 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-04-17T03:33:11.923733" 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>
